@seniorsistemas/angular-components 19.5.4 → 19.5.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.
Files changed (77) hide show
  1. package/accordion/lib/accordion/components/accordion-panel/accordion-panel.component.d.ts +2 -0
  2. package/accordion/lib/accordion/models/accordion-button-settings.d.ts +5 -0
  3. package/button/lib/button/button.component.d.ts +5 -1
  4. package/esm2022/accordion/lib/accordion/components/accordion-panel/accordion-panel.component.mjs +11 -3
  5. package/esm2022/accordion/lib/accordion/models/accordion-button-settings.mjs +1 -1
  6. package/esm2022/button/lib/button/button.component.mjs +9 -3
  7. package/esm2022/confirm-dialog/lib/popup-confirm-dialog/popup-confirm-dialog.component.mjs +1 -1
  8. package/esm2022/content-generator/lib/content-generator/content-generator.component.mjs +1 -1
  9. package/esm2022/dynamic-form/dynamic-form/components/grid/row/row.component.mjs +2 -2
  10. package/esm2022/dynamic-form/dynamic-form/components/lookup/lookup.component.mjs +2 -2
  11. package/esm2022/dynamic-form/dynamic-form/form-field/fields/bignumber/bignumber-field.component.mjs +2 -2
  12. package/esm2022/dynamic-form/dynamic-form/form-field/fields/boolean/boolean-radio-field/boolean-field.component.mjs +1 -1
  13. package/esm2022/dynamic-form/dynamic-form/form-field/fields/button-field/button-field.component.mjs +1 -1
  14. package/esm2022/dynamic-form/dynamic-form/form-field/fields/number/number-field.component.mjs +2 -2
  15. package/esm2022/dynamic-form/dynamic-form/form-field/fields/password/password-field.component.mjs +2 -2
  16. package/esm2022/dynamic-form/dynamic-form/form-field/fields/radio-button/radio-button-field.component.mjs +2 -2
  17. package/esm2022/dynamic-form/dynamic-form/form-field/fields/text/text-field.component.mjs +2 -2
  18. package/esm2022/empty-state/lib/empty-state/empty-state.component.mjs +1 -1
  19. package/esm2022/file-picker/lib/file-picker/file-picker.component.mjs +1 -1
  20. package/esm2022/global-search/lib/global-search/components/dropdown/global-search-dropdown-item.component.mjs +1 -1
  21. package/esm2022/global-search/lib/global-search/global-search.component.mjs +2 -2
  22. package/esm2022/help-popover/lib/help-popover/help-popover/help-popover.component.mjs +1 -1
  23. package/esm2022/image-cropper/lib/image-cropper/image-cropper.component.mjs +1 -1
  24. package/esm2022/inline-edit/lib/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +1 -1
  25. package/esm2022/inline-edit/lib/inline-edit/components/inline-edit-item/inline-edit-item.component.mjs +1 -1
  26. package/esm2022/kanban/lib/kanban/components/kanban-column/kanban-column.component.mjs +1 -1
  27. package/esm2022/object-card/lib/object-card/elements/field/object-card-field.component.mjs +1 -1
  28. package/esm2022/object-card/lib/object-card/elements/main/object-card-main.component.mjs +1 -1
  29. package/esm2022/picklist/lib/picklist/picklist.component.mjs +2 -2
  30. package/esm2022/profile-picture-picker/lib/profile-picture-picker/profile-picture-picker.component.mjs +1 -1
  31. package/esm2022/select/lib/select/select.component.mjs +86 -4
  32. package/esm2022/shared/lib/accessibility/datepicker-no-period-tab.directive.mjs +541 -0
  33. package/esm2022/shared/public-api.mjs +2 -1
  34. package/esm2022/spotlight/lib/spotlight/spotlight.component.mjs +2 -2
  35. package/esm2022/table/lib/table/table-paging/table-paging.component.mjs +1 -1
  36. package/fesm2022/seniorsistemas-angular-components-accordion.mjs +10 -2
  37. package/fesm2022/seniorsistemas-angular-components-accordion.mjs.map +1 -1
  38. package/fesm2022/seniorsistemas-angular-components-button.mjs +8 -2
  39. package/fesm2022/seniorsistemas-angular-components-button.mjs.map +1 -1
  40. package/fesm2022/seniorsistemas-angular-components-confirm-dialog.mjs +1 -1
  41. package/fesm2022/seniorsistemas-angular-components-confirm-dialog.mjs.map +1 -1
  42. package/fesm2022/seniorsistemas-angular-components-content-generator.mjs +1 -1
  43. package/fesm2022/seniorsistemas-angular-components-content-generator.mjs.map +1 -1
  44. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +9 -9
  45. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
  46. package/fesm2022/seniorsistemas-angular-components-empty-state.mjs +1 -1
  47. package/fesm2022/seniorsistemas-angular-components-empty-state.mjs.map +1 -1
  48. package/fesm2022/seniorsistemas-angular-components-file-picker.mjs +1 -1
  49. package/fesm2022/seniorsistemas-angular-components-file-picker.mjs.map +1 -1
  50. package/fesm2022/seniorsistemas-angular-components-global-search.mjs +2 -2
  51. package/fesm2022/seniorsistemas-angular-components-global-search.mjs.map +1 -1
  52. package/fesm2022/seniorsistemas-angular-components-help-popover.mjs +1 -1
  53. package/fesm2022/seniorsistemas-angular-components-help-popover.mjs.map +1 -1
  54. package/fesm2022/seniorsistemas-angular-components-image-cropper.mjs +1 -1
  55. package/fesm2022/seniorsistemas-angular-components-image-cropper.mjs.map +1 -1
  56. package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs +2 -2
  57. package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs.map +1 -1
  58. package/fesm2022/seniorsistemas-angular-components-kanban.mjs +1 -1
  59. package/fesm2022/seniorsistemas-angular-components-kanban.mjs.map +1 -1
  60. package/fesm2022/seniorsistemas-angular-components-object-card.mjs +2 -2
  61. package/fesm2022/seniorsistemas-angular-components-object-card.mjs.map +1 -1
  62. package/fesm2022/seniorsistemas-angular-components-picklist.mjs +1 -1
  63. package/fesm2022/seniorsistemas-angular-components-picklist.mjs.map +1 -1
  64. package/fesm2022/seniorsistemas-angular-components-profile-picture-picker.mjs +1 -1
  65. package/fesm2022/seniorsistemas-angular-components-profile-picture-picker.mjs.map +1 -1
  66. package/fesm2022/seniorsistemas-angular-components-select.mjs +85 -3
  67. package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
  68. package/fesm2022/seniorsistemas-angular-components-shared.mjs +541 -3
  69. package/fesm2022/seniorsistemas-angular-components-shared.mjs.map +1 -1
  70. package/fesm2022/seniorsistemas-angular-components-spotlight.mjs +1 -1
  71. package/fesm2022/seniorsistemas-angular-components-spotlight.mjs.map +1 -1
  72. package/fesm2022/seniorsistemas-angular-components-table.mjs +1 -1
  73. package/fesm2022/seniorsistemas-angular-components-table.mjs.map +1 -1
  74. package/package.json +7 -7
  75. package/select/lib/select/select.component.d.ts +40 -2
  76. package/shared/lib/accessibility/datepicker-no-period-tab.directive.d.ts +177 -0
  77. package/shared/public-api.d.ts +1 -0
@@ -0,0 +1,541 @@
1
+ import { DOCUMENT } from '@angular/common';
2
+ import { Directive, HostListener, LOCALE_ID, Renderer2, inject } from '@angular/core';
3
+ import { DatePicker } from 'primeng/datepicker';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * CSS customizado injetado globalmente para focus-visible nos internals do DatePicker.
7
+ * Necessário porque com `appendTo="body"` o overlay fica fora do host component,
8
+ * e estilos com `:host ::ng-deep` ou ViewEncapsulation.Emulated não alcançam.
9
+ */
10
+ const FOCUS_STYLE_ID = 's-datepicker-a11y-focus-styles';
11
+ /** Delay em ms para foco pós-abertura e navegação (permite NVDA processar dialog announce). */
12
+ const FOCUS_DELAY_MS = 50;
13
+ /** Delay em ms para debounce do MutationObserver (evita re-execução por ripple/animações). */
14
+ const MUTATION_DEBOUNCE_MS = 100;
15
+ /** Attribute name constant to avoid SonarQube literal duplication warning. */
16
+ const ARIA_LABEL_ATTR = 'aria-label';
17
+ const FOCUS_STYLES = `
18
+ .p-datepicker-day:focus-visible,
19
+ .p-datepicker-day.s-datepicker-day-focused {
20
+ outline: 2px solid var(--p-primary-color, #3b82f6) !important;
21
+ outline-offset: -2px;
22
+ border-radius: 4px;
23
+ }
24
+ .p-datepicker-month:focus-visible,
25
+ .p-datepicker-month.s-datepicker-day-focused {
26
+ outline: 2px solid var(--p-primary-color, #3b82f6) !important;
27
+ outline-offset: -2px;
28
+ border-radius: 4px;
29
+ }
30
+ .p-datepicker-year:focus-visible,
31
+ .p-datepicker-year.s-datepicker-day-focused {
32
+ outline: 2px solid var(--p-primary-color, #3b82f6) !important;
33
+ outline-offset: -2px;
34
+ border-radius: 4px;
35
+ }
36
+ .p-datepicker-select-month:focus-visible,
37
+ .p-datepicker-select-year:focus-visible {
38
+ outline: 2px solid var(--p-primary-color, #3b82f6) !important;
39
+ outline-offset: 2px;
40
+ border-radius: 4px;
41
+ }
42
+ .p-datepicker-prev-button:focus-visible,
43
+ .p-datepicker-next-button:focus-visible {
44
+ outline: 2px solid var(--p-primary-color, #3b82f6) !important;
45
+ outline-offset: 2px;
46
+ border-radius: 50%;
47
+ }
48
+ `;
49
+ /**
50
+ * Traduções pt-BR para aria-labels do DatePicker PrimeNG.
51
+ * PrimeNG usa `getTranslation()` que retorna inglês por padrão
52
+ * se não configurado via `PrimeNGConfig.setTranslation()`.
53
+ *
54
+ * Keys correspondem ao texto exato renderizado pelo PrimeNG no DOM:
55
+ * - "Previous Month" (não "Prev Month")
56
+ * - "Choose Date", "Choose Month", "Choose Year"
57
+ */
58
+ const PREV_DECADE_PT = 'Década anterior';
59
+ const PREV_DECADE_ES = 'Década anterior';
60
+ const ARIA_TRANSLATIONS_PT_BR = {
61
+ 'Choose Date': 'Selecionar data',
62
+ 'Choose Month': 'Selecionar mês',
63
+ 'Choose Year': 'Selecionar ano',
64
+ 'Previous Month': 'Mês anterior',
65
+ 'Next Month': 'Próximo mês',
66
+ 'Previous Year': 'Ano anterior',
67
+ 'Next Year': 'Próximo ano',
68
+ 'Previous Decade': PREV_DECADE_PT,
69
+ 'Next Decade': 'Próxima década',
70
+ 'Prev Month': 'Mês anterior',
71
+ 'Prev Year': 'Ano anterior',
72
+ 'Prev Decade': PREV_DECADE_PT,
73
+ };
74
+ const ARIA_TRANSLATIONS_ES = {
75
+ 'Choose Date': 'Seleccionar fecha',
76
+ 'Choose Month': 'Seleccionar mes',
77
+ 'Choose Year': 'Seleccionar año',
78
+ 'Previous Month': 'Mes anterior',
79
+ 'Next Month': 'Próximo mes',
80
+ 'Previous Year': 'Año anterior',
81
+ 'Next Year': 'Próximo año',
82
+ 'Previous Decade': PREV_DECADE_ES,
83
+ 'Next Decade': 'Próxima década',
84
+ 'Prev Month': 'Mes anterior',
85
+ 'Prev Year': 'Año anterior',
86
+ 'Prev Decade': PREV_DECADE_ES,
87
+ };
88
+ const ARIA_TRANSLATIONS = {
89
+ 'pt-BR': ARIA_TRANSLATIONS_PT_BR,
90
+ 'pt': ARIA_TRANSLATIONS_PT_BR,
91
+ 'es': ARIA_TRANSLATIONS_ES,
92
+ 'es-CO': ARIA_TRANSLATIONS_ES,
93
+ 'es-ES': ARIA_TRANSLATIONS_ES,
94
+ };
95
+ /**
96
+ * Diretiva para corrigir a acessibilidade do painel do DatePicker PrimeNG.
97
+ *
98
+ * Resolve os seguintes problemas:
99
+ *
100
+ * 1. **Foco inicial ao abrir overlay**: move foco programaticamente para
101
+ * a célula selecionada, hoje, ou primeira célula disponível — evitando
102
+ * que NVDA leia toda estrutura do grid ao entrar no painel.
103
+ *
104
+ * 2. **Re-foco ao trocar view (mês/ano)**: ao navegar para views de mês ou
105
+ * ano, o DOM é destruído e recriado. Sem intervenção, foco escapa para
106
+ * `<body>` e NVDA lê conteúdo fora do overlay. A diretiva re-foca o
107
+ * primeiro elemento interativo da nova view.
108
+ *
109
+ * 3. **Focus-visible nos elementos internos**: injeta CSS global com
110
+ * outline para todos elementos interativos do overlay, garantindo
111
+ * feedback visual mesmo com `appendTo="body"`.
112
+ *
113
+ * 4. **aria-label enriquecido nos day cells**: PrimeNG seta apenas o
114
+ * número do dia. A diretiva sobrescreve com data completa formatada
115
+ * (ex: "3 de junho de 2026, Qua") — NVDA narra label sem precisar
116
+ * contextualizar toda grid.
117
+ *
118
+ * 5. **View de meses/anos sem tabindex**: spans de mês/ano recebem
119
+ * `tabindex="0"` e `role="option"` para navegação por teclado.
120
+ *
121
+ * Utiliza `MutationObserver` para detectar mudanças internas de view,
122
+ * já que PrimeNG não emite eventos para essas transições.
123
+ *
124
+ * **CSS**: A diretiva injeta um `<style>` global no `<head>` (uma vez).
125
+ * Para projetos que preferem controle manual, desabilite via Input
126
+ * `[sDatepickerInjectStyles]="false"` e importe os estilos manualmente.
127
+ *
128
+ * Uso: `<p-datepicker sDatepickerNoPeriodTab ...>`
129
+ *
130
+ * @category Directives
131
+ */
132
+ export class DatepickerNoPeriodTabDirective {
133
+ datePicker = inject(DatePicker);
134
+ renderer = inject(Renderer2);
135
+ locale = inject(LOCALE_ID);
136
+ document = inject(DOCUMENT);
137
+ observer = null;
138
+ focusListenerCleanups = [];
139
+ constructor() {
140
+ this.injectGlobalFocusStyles();
141
+ }
142
+ onPanelShow() {
143
+ setTimeout(() => {
144
+ this.fixPanelAccessibility();
145
+ // Não chamar focusBestTarget() aqui — PrimeNG initFocusableCell()
146
+ // já move foco pro day cell com tabindex="0" na abertura.
147
+ // Chamar de novo causa double-announce no NVDA.
148
+ setTimeout(() => this.observePanelChanges(), MUTATION_DEBOUNCE_MS);
149
+ }, FOCUS_DELAY_MS);
150
+ }
151
+ onNavigationChange() {
152
+ setTimeout(() => {
153
+ this.fixPanelAccessibility();
154
+ this.focusBestTarget();
155
+ }, FOCUS_DELAY_MS);
156
+ }
157
+ ngOnDestroy() {
158
+ this.disconnectObserver();
159
+ this.removeFocusListeners();
160
+ }
161
+ /**
162
+ * Move foco para melhor alvo disponível no painel.
163
+ * Usado ao abrir overlay e ao trocar view (mês/ano).
164
+ *
165
+ * Ao abrir: evita que NVDA leia toda estrutura do grid.
166
+ * Ao trocar view: previne foco escapar para `<body>` quando
167
+ * PrimeNG destrói DOM da view anterior.
168
+ *
169
+ * Prioridade: selecionado > hoje > primeiro disponível.
170
+ * Pula se foco já está no target correto (evita double-announce no NVDA).
171
+ */
172
+ focusBestTarget() {
173
+ const panel = this.datePicker.overlay;
174
+ if (!panel) {
175
+ return;
176
+ }
177
+ const target = this.findFocusTarget(panel);
178
+ if (target && this.document.activeElement !== target) {
179
+ target.tabIndex = 0;
180
+ target.focus();
181
+ }
182
+ }
183
+ /**
184
+ * Injeta CSS global de focus-visible no `<head>` do documento.
185
+ * Executa apenas uma vez (idempotente via ID do style element).
186
+ * Necessário porque overlay com `appendTo="body"` fica fora do
187
+ * escopo de ViewEncapsulation do componente host.
188
+ */
189
+ injectGlobalFocusStyles() {
190
+ if (this.document.getElementById(FOCUS_STYLE_ID)) {
191
+ return;
192
+ }
193
+ const style = this.renderer.createElement('style');
194
+ this.renderer.setAttribute(style, 'id', FOCUS_STYLE_ID);
195
+ this.renderer.setAttribute(style, 'type', 'text/css');
196
+ const text = this.renderer.createText(FOCUS_STYLES);
197
+ this.renderer.appendChild(style, text);
198
+ this.renderer.appendChild(this.document.head, style);
199
+ }
200
+ /**
201
+ * Encontra melhor elemento para receber foco no painel atual.
202
+ * Busca em ordem: selecionado → hoje → primeiro disponível.
203
+ * Funciona para views de dias, meses e anos.
204
+ */
205
+ findFocusTarget(panel) {
206
+ // View de dias
207
+ const selectedDay = panel.querySelector('.p-datepicker-day-selected, .p-datepicker-day[aria-selected="true"]');
208
+ if (selectedDay) {
209
+ return selectedDay;
210
+ }
211
+ const today = panel.querySelector('.p-datepicker-today .p-datepicker-day');
212
+ if (today) {
213
+ return today;
214
+ }
215
+ // View de meses
216
+ const selectedMonth = panel.querySelector('.p-datepicker-month.p-datepicker-month-selected');
217
+ if (selectedMonth) {
218
+ return selectedMonth;
219
+ }
220
+ const firstMonth = panel.querySelector('.p-datepicker-month:not(.p-disabled)');
221
+ if (firstMonth) {
222
+ return firstMonth;
223
+ }
224
+ // View de anos
225
+ const selectedYear = panel.querySelector('.p-datepicker-year.p-datepicker-year-selected');
226
+ if (selectedYear) {
227
+ return selectedYear;
228
+ }
229
+ const firstYear = panel.querySelector('.p-datepicker-year:not(.p-disabled)');
230
+ if (firstYear) {
231
+ return firstYear;
232
+ }
233
+ // Fallback: primeiro day cell disponível
234
+ const firstDay = panel.querySelector('.p-datepicker-day:not(.p-disabled)');
235
+ return firstDay;
236
+ }
237
+ /**
238
+ * Aplica correções de acessibilidade no painel do DatePicker,
239
+ * independente da view interna ativa (dias, meses ou anos).
240
+ */
241
+ fixPanelAccessibility() {
242
+ const panel = this.datePicker.overlay;
243
+ if (!panel) {
244
+ return;
245
+ }
246
+ panel.querySelectorAll('.p-datepicker-select-month, .p-datepicker-select-year').forEach((btn) => {
247
+ this.renderer.setAttribute(btn, 'tabindex', '0');
248
+ });
249
+ panel.querySelectorAll('.p-datepicker-month:not([tabindex])').forEach((month) => {
250
+ this.renderer.setAttribute(month, 'tabindex', '0');
251
+ this.renderer.setAttribute(month, 'role', 'option');
252
+ });
253
+ panel.querySelectorAll('.p-datepicker-year:not([tabindex])').forEach((year) => {
254
+ this.renderer.setAttribute(year, 'tabindex', '0');
255
+ this.renderer.setAttribute(year, 'role', 'option');
256
+ });
257
+ this.applyGridcellRoleToDays(panel);
258
+ this.enrichDayCellAriaLabels(panel);
259
+ this.enrichGridAriaLabel(panel);
260
+ this.translateAriaLabels(panel);
261
+ this.fixNavigationButtonLabels(panel);
262
+ this.removeApplicationRoleFromContainer(panel);
263
+ this.setupFocusTracking(panel);
264
+ }
265
+ /**
266
+ * Adiciona `role="gridcell"` nos `<span class="p-datepicker-day">` que recebem foco.
267
+ *
268
+ * PrimeNG coloca `tabindex` no `<span>` dentro do `<td>`, mas sem role explícito.
269
+ * NVDA não entra automaticamente em focus mode quando foca um elemento sem
270
+ * role de widget (gridcell, button, etc). Resultado: NVDA fica em browse mode
271
+ * e lê toda a tabela sequencialmente ao invés de anunciar só a célula focada.
272
+ *
273
+ * Ao adicionar `role="gridcell"` no span focável, NVDA reconhece que é um
274
+ * widget interativo e entra em focus mode — anunciando apenas o aria-label
275
+ * da célula focada.
276
+ */
277
+ applyGridcellRoleToDays(panel) {
278
+ panel.querySelectorAll('.p-datepicker-day:not(.p-disabled)').forEach((daySpan) => {
279
+ if (!daySpan.getAttribute('role')) {
280
+ this.renderer.setAttribute(daySpan, 'role', 'gridcell');
281
+ }
282
+ });
283
+ }
284
+ /**
285
+ * Enriquece `aria-label` dos day cells com data completa formatada.
286
+ * PrimeNG por padrão usa apenas o número do dia, forçando NVDA
287
+ * a narrar contexto de grid (linha/coluna/weekday) para informar a data.
288
+ * Com aria-label completo, NVDA narra diretamente a data sem verbosidade.
289
+ */
290
+ enrichDayCellAriaLabels(panel) {
291
+ const { currentMonth, currentYear } = this.datePicker;
292
+ if (currentMonth == null || currentYear == null) {
293
+ return;
294
+ }
295
+ const weekdayHeaders = panel.querySelectorAll('.p-datepicker-weekday');
296
+ const weekdays = [];
297
+ weekdayHeaders.forEach((header) => {
298
+ weekdays.push(header.textContent?.trim() || '');
299
+ });
300
+ const rows = panel.querySelectorAll('.p-datepicker-day-view tbody tr');
301
+ rows.forEach((row) => {
302
+ const cells = row.querySelectorAll('td');
303
+ cells.forEach((cell, cellIndex) => {
304
+ const daySpan = cell.querySelector('.p-datepicker-day');
305
+ if (!daySpan) {
306
+ return;
307
+ }
308
+ const dayNumber = parseInt(daySpan.textContent?.trim() || '0', 10);
309
+ if (!dayNumber) {
310
+ return;
311
+ }
312
+ const isOtherMonth = cell.classList.contains('p-datepicker-other-month');
313
+ if (isOtherMonth) {
314
+ return;
315
+ }
316
+ const date = new Date(currentYear, currentMonth, dayNumber);
317
+ const formattedDate = this.formatDateForAriaLabel(date);
318
+ const weekday = weekdays[cellIndex] || '';
319
+ const ariaLabel = weekday ? `${formattedDate}, ${weekday}` : formattedDate;
320
+ this.renderer.setAttribute(daySpan, ARIA_LABEL_ATTR, ariaLabel);
321
+ });
322
+ });
323
+ }
324
+ /**
325
+ * Adiciona aria-label no grid com mês/ano atual para dar contexto
326
+ * imediato ao NVDA ao entrar na tabela de dias.
327
+ * Exemplo: "Calendário, Junho 2026"
328
+ */
329
+ enrichGridAriaLabel(panel) {
330
+ const grid = panel.querySelector('.p-datepicker-day-view[role="grid"]');
331
+ if (!grid) {
332
+ return;
333
+ }
334
+ const { currentMonth, currentYear } = this.datePicker;
335
+ if (currentMonth == null || currentYear == null) {
336
+ return;
337
+ }
338
+ const monthName = new Date(currentYear, currentMonth, 1).toLocaleDateString('pt-BR', {
339
+ month: 'long',
340
+ });
341
+ const capitalizedMonth = monthName.charAt(0).toUpperCase() + monthName.slice(1);
342
+ const label = `Calendário, ${capitalizedMonth} ${currentYear}`;
343
+ this.renderer.setAttribute(grid, ARIA_LABEL_ATTR, label);
344
+ }
345
+ /**
346
+ * Formata data para aria-label legível por leitor de tela.
347
+ * Sempre usa pt-BR para garantir consistência com labels traduzidos,
348
+ * independente do LOCALE_ID configurado no Angular.
349
+ * Exemplo: "3 de junho de 2026"
350
+ */
351
+ formatDateForAriaLabel(date) {
352
+ try {
353
+ return date.toLocaleDateString('pt-BR', {
354
+ day: 'numeric',
355
+ month: 'long',
356
+ year: 'numeric',
357
+ });
358
+ }
359
+ catch {
360
+ return `${date.getDate()}/${date.getMonth() + 1}/${date.getFullYear()}`;
361
+ }
362
+ }
363
+ /**
364
+ * Retorna locale string para formatação.
365
+ */
366
+ getLocale() {
367
+ return this.locale || 'pt-BR';
368
+ }
369
+ /**
370
+ * Traduz aria-labels dos botões do header que PrimeNG renderiza em inglês.
371
+ * PrimeNG usa `getTranslation('chooseDate')` etc, que retorna inglês
372
+ * se `PrimeNGConfig.setTranslation()` não foi configurado pelo projeto.
373
+ *
374
+ * Busca botões com aria-label em inglês e traduz pro locale atual.
375
+ */
376
+ translateAriaLabels(panel) {
377
+ const translations = this.getTranslations();
378
+ // Dialog aria-label ("Choose Date")
379
+ const dialog = panel.closest('[role="dialog"]') || panel;
380
+ const dialogLabel = dialog.getAttribute(ARIA_LABEL_ATTR);
381
+ if (dialogLabel && translations[dialogLabel]) {
382
+ this.renderer.setAttribute(dialog, ARIA_LABEL_ATTR, translations[dialogLabel]);
383
+ }
384
+ // Botões "Choose Month" e "Choose Year" no header
385
+ panel.querySelectorAll('.p-datepicker-select-month, .p-datepicker-select-year').forEach((btn) => {
386
+ const label = btn.getAttribute(ARIA_LABEL_ATTR);
387
+ if (label && translations[label]) {
388
+ this.renderer.setAttribute(btn, ARIA_LABEL_ATTR, translations[label]);
389
+ }
390
+ });
391
+ }
392
+ /**
393
+ * Corrige aria-label dos botões prev/next do PrimeNG.
394
+ * PrimeNG usa `p-button` component que seta `aria-label` no host element `<p-button>`,
395
+ * mas NVDA foca o `<button>` interno que não herda o label do custom element.
396
+ *
397
+ * Estrutura DOM: `<p-button aria-label="Previous Month"><button class="p-datepicker-prev-button">...</button></p-button>`
398
+ *
399
+ * Fix: lê aria-label do `<p-button>` host, traduz, e propaga pro `<button>` interno.
400
+ */
401
+ fixNavigationButtonLabels(panel) {
402
+ const translations = this.getTranslations();
403
+ // Buscar <p-button> hosts que contém os botões prev/next
404
+ const pButtons = panel.querySelectorAll('p-button');
405
+ pButtons.forEach((pBtn) => {
406
+ const innerButton = pBtn.querySelector('button.p-datepicker-prev-button, button.p-datepicker-next-button');
407
+ if (!innerButton) {
408
+ return;
409
+ }
410
+ let label = pBtn.getAttribute(ARIA_LABEL_ATTR) || '';
411
+ // Traduzir
412
+ if (label && translations[label]) {
413
+ label = translations[label];
414
+ this.renderer.setAttribute(pBtn, ARIA_LABEL_ATTR, label);
415
+ }
416
+ // Propagar pro <button> interno
417
+ if (label) {
418
+ this.renderer.setAttribute(innerButton, ARIA_LABEL_ATTR, label);
419
+ }
420
+ });
421
+ }
422
+ /**
423
+ * Remove `role="application"` do container do calendário.
424
+ *
425
+ * PrimeNG seta `role="application"` no `.p-datepicker-calendar-container`
426
+ * para que arrow keys cheguem no JavaScript sem interceptação do browse mode.
427
+ * Porém `role="grid"` na table já garante esse comportamento — NVDA entra
428
+ * automaticamente em focus mode ao focar uma gridcell.
429
+ *
430
+ * O `role="application"` no container PAI causa NVDA a despeja o conteúdo
431
+ * virtual do container inteiro ao entrar no dialog, antes de pousar na célula.
432
+ * Removê-lo resolve a leitura excessiva sem quebrar navegação por setas.
433
+ */
434
+ removeApplicationRoleFromContainer(panel) {
435
+ const calendarContainer = panel.querySelector('.p-datepicker-calendar-container');
436
+ if (calendarContainer?.getAttribute('role') === 'application') {
437
+ this.renderer.removeAttribute(calendarContainer, 'role');
438
+ }
439
+ }
440
+ /**
441
+ * Retorna mapa de traduções pro locale atual.
442
+ * Se locale é inglês ou não reconhecido, fallback pra pt-BR
443
+ * (assumimos que labels em inglês devem ser traduzidos).
444
+ */
445
+ getTranslations() {
446
+ const locale = this.getLocale();
447
+ return ARIA_TRANSLATIONS[locale]
448
+ || ARIA_TRANSLATIONS[locale.split('-')[0]]
449
+ || ARIA_TRANSLATIONS_PT_BR;
450
+ }
451
+ /**
452
+ * Adiciona listeners de focus/blur nos elementos interativos para
453
+ * garantir indicador visual quando `.focus()` é chamado programaticamente.
454
+ *
455
+ * `:focus-visible` pode não ser aplicado quando foco é movido via JS,
456
+ * então usamos classe auxiliar `s-datepicker-day-focused` como fallback.
457
+ */
458
+ setupFocusTracking(panel) {
459
+ this.removeFocusListeners();
460
+ const focusableElements = panel.querySelectorAll('.p-datepicker-day, .p-datepicker-month, .p-datepicker-year');
461
+ focusableElements.forEach((el) => {
462
+ const focusCleanup = this.renderer.listen(el, 'focus', () => {
463
+ this.renderer.addClass(el, 's-datepicker-day-focused');
464
+ });
465
+ const blurCleanup = this.renderer.listen(el, 'blur', () => {
466
+ this.renderer.removeClass(el, 's-datepicker-day-focused');
467
+ });
468
+ this.focusListenerCleanups.push(focusCleanup, blurCleanup);
469
+ });
470
+ }
471
+ /**
472
+ * Remove listeners de focus/blur registrados anteriormente.
473
+ */
474
+ removeFocusListeners() {
475
+ this.focusListenerCleanups.forEach((cleanup) => cleanup());
476
+ this.focusListenerCleanups = [];
477
+ }
478
+ /**
479
+ * Observa mudanças no DOM do painel para reaplicar correções
480
+ * quando o PrimeNG troca a view interna (dias → meses → anos).
481
+ * Usa debounce e só reage a childList changes (não attributes)
482
+ * para evitar loop infinito com as próprias mutações da diretiva.
483
+ */
484
+ observePanelChanges() {
485
+ this.disconnectObserver();
486
+ const panel = this.datePicker.overlay;
487
+ if (!panel) {
488
+ return;
489
+ }
490
+ let debounceTimer = null;
491
+ let isProcessing = false;
492
+ this.observer = new MutationObserver((mutations) => {
493
+ if (isProcessing) {
494
+ return;
495
+ }
496
+ // Só reagir se houve adição/remoção de nós (troca de view)
497
+ const hasStructuralChange = mutations.some((m) => m.type === 'childList' && (m.addedNodes.length > 0 || m.removedNodes.length > 0));
498
+ if (!hasStructuralChange) {
499
+ return;
500
+ }
501
+ if (debounceTimer) {
502
+ clearTimeout(debounceTimer);
503
+ }
504
+ debounceTimer = setTimeout(() => {
505
+ isProcessing = true;
506
+ this.fixPanelAccessibility();
507
+ this.focusBestTarget();
508
+ isProcessing = false;
509
+ }, MUTATION_DEBOUNCE_MS);
510
+ });
511
+ this.observer.observe(panel, {
512
+ childList: true,
513
+ subtree: true,
514
+ });
515
+ }
516
+ disconnectObserver() {
517
+ if (this.observer) {
518
+ this.observer.disconnect();
519
+ this.observer = null;
520
+ }
521
+ }
522
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DatepickerNoPeriodTabDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
523
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: DatepickerNoPeriodTabDirective, isStandalone: true, selector: "[sDatepickerNoPeriodTab]", host: { listeners: { "onShow": "onPanelShow()", "onMonthChange": "onNavigationChange()", "onYearChange": "onNavigationChange()" } }, ngImport: i0 });
524
+ }
525
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DatepickerNoPeriodTabDirective, decorators: [{
526
+ type: Directive,
527
+ args: [{
528
+ selector: '[sDatepickerNoPeriodTab]',
529
+ standalone: true,
530
+ }]
531
+ }], ctorParameters: () => [], propDecorators: { onPanelShow: [{
532
+ type: HostListener,
533
+ args: ['onShow']
534
+ }], onNavigationChange: [{
535
+ type: HostListener,
536
+ args: ['onMonthChange']
537
+ }, {
538
+ type: HostListener,
539
+ args: ['onYearChange']
540
+ }] } });
541
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1uby1wZXJpb2QtdGFiLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zaGFyZWQvc3JjL2xpYi9hY2Nlc3NpYmlsaXR5L2RhdGVwaWNrZXItbm8tcGVyaW9kLXRhYi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBYSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFFaEQ7Ozs7R0FJRztBQUNILE1BQU0sY0FBYyxHQUFHLGdDQUFnQyxDQUFDO0FBRXhELCtGQUErRjtBQUMvRixNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7QUFFMUIsOEZBQThGO0FBQzlGLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFDO0FBRWpDLDhFQUE4RTtBQUM5RSxNQUFNLGVBQWUsR0FBRyxZQUFZLENBQUM7QUFDckMsTUFBTSxZQUFZLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0ErQnBCLENBQUM7QUFFRjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDO0FBQ3pDLE1BQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDO0FBRXpDLE1BQU0sdUJBQXVCLEdBQTJCO0lBQ3BELGFBQWEsRUFBRSxpQkFBaUI7SUFDaEMsY0FBYyxFQUFFLGdCQUFnQjtJQUNoQyxhQUFhLEVBQUUsZ0JBQWdCO0lBQy9CLGdCQUFnQixFQUFFLGNBQWM7SUFDaEMsWUFBWSxFQUFFLGFBQWE7SUFDM0IsZUFBZSxFQUFFLGNBQWM7SUFDL0IsV0FBVyxFQUFFLGFBQWE7SUFDMUIs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a0I7c0JBRnhCLFlBQVk7dUJBQUMsZUFBZTs7c0JBQzVCLFlBQVk7dUJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IERpcmVjdGl2ZSwgSG9zdExpc3RlbmVyLCBMT0NBTEVfSUQsIE9uRGVzdHJveSwgUmVuZGVyZXIyLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERhdGVQaWNrZXIgfSBmcm9tICdwcmltZW5nL2RhdGVwaWNrZXInO1xuXG4vKipcbiAqIENTUyBjdXN0b21pemFkbyBpbmpldGFkbyBnbG9iYWxtZW50ZSBwYXJhIGZvY3VzLXZpc2libGUgbm9zIGludGVybmFscyBkbyBEYXRlUGlja2VyLlxuICogTmVjZXNzw6FyaW8gcG9ycXVlIGNvbSBgYXBwZW5kVG89XCJib2R5XCJgIG8gb3ZlcmxheSBmaWNhIGZvcmEgZG8gaG9zdCBjb21wb25lbnQsXG4gKiBlIGVzdGlsb3MgY29tIGA6aG9zdCA6Om5nLWRlZXBgIG91IFZpZXdFbmNhcHN1bGF0aW9uLkVtdWxhdGVkIG7Do28gYWxjYW7Dp2FtLlxuICovXG5jb25zdCBGT0NVU19TVFlMRV9JRCA9ICdzLWRhdGVwaWNrZXItYTExeS1mb2N1cy1zdHlsZXMnO1xuXG4vKiogRGVsYXkgZW0gbXMgcGFyYSBmb2NvIHDDs3MtYWJlcnR1cmEgZSBuYXZlZ2HDp8OjbyAocGVybWl0ZSBOVkRBIHByb2Nlc3NhciBkaWFsb2cgYW5ub3VuY2UpLiAqL1xuY29uc3QgRk9DVVNfREVMQVlfTVMgPSA1MDtcblxuLyoqIERlbGF5IGVtIG1zIHBhcmEgZGVib3VuY2UgZG8gTXV0YXRpb25PYnNlcnZlciAoZXZpdGEgcmUtZXhlY3XDp8OjbyBwb3IgcmlwcGxlL2FuaW1hw6fDtWVzKS4gKi9cbmNvbnN0IE1VVEFUSU9OX0RFQk9VTkNFX01TID0gMTAwO1xuXG4vKiogQXR0cmlidXRlIG5hbWUgY29uc3RhbnQgdG8gYXZvaWQgU29uYXJRdWJlIGxpdGVyYWwgZHVwbGljYXRpb24gd2FybmluZy4gKi9cbmNvbnN0IEFSSUFfTEFCRUxfQVRUUiA9ICdhcmlhLWxhYmVsJztcbmNvbnN0IEZPQ1VTX1NUWUxFUyA9IGBcbi5wLWRhdGVwaWNrZXItZGF5OmZvY3VzLXZpc2libGUsXG4ucC1kYXRlcGlja2VyLWRheS5zLWRhdGVwaWNrZXItZGF5LWZvY3VzZWQge1xuICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1wLXByaW1hcnktY29sb3IsICMzYjgyZjYpICFpbXBvcnRhbnQ7XG4gICAgb3V0bGluZS1vZmZzZXQ6IC0ycHg7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xufVxuLnAtZGF0ZXBpY2tlci1tb250aDpmb2N1cy12aXNpYmxlLFxuLnAtZGF0ZXBpY2tlci1tb250aC5zLWRhdGVwaWNrZXItZGF5LWZvY3VzZWQge1xuICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1wLXByaW1hcnktY29sb3IsICMzYjgyZjYpICFpbXBvcnRhbnQ7XG4gICAgb3V0bGluZS1vZmZzZXQ6IC0ycHg7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xufVxuLnAtZGF0ZXBpY2tlci15ZWFyOmZvY3VzLXZpc2libGUsXG4ucC1kYXRlcGlja2VyLXllYXIucy1kYXRlcGlja2VyLWRheS1mb2N1c2VkIHtcbiAgICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tcC1wcmltYXJ5LWNvbG9yLCAjM2I4MmY2KSAhaW1wb3J0YW50O1xuICAgIG91dGxpbmUtb2Zmc2V0OiAtMnB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbn1cbi5wLWRhdGVwaWNrZXItc2VsZWN0LW1vbnRoOmZvY3VzLXZpc2libGUsXG4ucC1kYXRlcGlja2VyLXNlbGVjdC15ZWFyOmZvY3VzLXZpc2libGUge1xuICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1wLXByaW1hcnktY29sb3IsICMzYjgyZjYpICFpbXBvcnRhbnQ7XG4gICAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG59XG4ucC1kYXRlcGlja2VyLXByZXYtYnV0dG9uOmZvY3VzLXZpc2libGUsXG4ucC1kYXRlcGlja2VyLW5leHQtYnV0dG9uOmZvY3VzLXZpc2libGUge1xuICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1wLXByaW1hcnktY29sb3IsICMzYjgyZjYpICFpbXBvcnRhbnQ7XG4gICAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XG59XG5gO1xuXG4vKipcbiAqIFRyYWR1w6fDtWVzIHB0LUJSIHBhcmEgYXJpYS1sYWJlbHMgZG8gRGF0ZVBpY2tlciBQcmltZU5HLlxuICogUHJpbWVORyB1c2EgYGdldFRyYW5zbGF0aW9uKClgIHF1ZSByZXRvcm5hIGluZ2zDqnMgcG9yIHBhZHLDo29cbiAqIHNlIG7Do28gY29uZmlndXJhZG8gdmlhIGBQcmltZU5HQ29uZmlnLnNldFRyYW5zbGF0aW9uKClgLlxuICpcbiAqIEtleXMgY29ycmVzcG9uZGVtIGFvIHRleHRvIGV4YXRvIHJlbmRlcml6YWRvIHBlbG8gUHJpbWVORyBubyBET006XG4gKiAtIFwiUHJldmlvdXMgTW9udGhcIiAobsOjbyBcIlByZXYgTW9udGhcIilcbiAqIC0gXCJDaG9vc2UgRGF0ZVwiLCBcIkNob29zZSBNb250aFwiLCBcIkNob29zZSBZZWFyXCJcbiAqL1xuY29uc3QgUFJFVl9ERUNBREVfUFQgPSAnRMOpY2FkYSBhbnRlcmlvcic7XG5jb25zdCBQUkVWX0RFQ0FERV9FUyA9ICdEw6ljYWRhIGFudGVyaW9yJztcblxuY29uc3QgQVJJQV9UUkFOU0xBVElPTlNfUFRfQlI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgJ0Nob29zZSBEYXRlJzogJ1NlbGVjaW9uYXIgZGF0YScsXG4gICAgJ0Nob29zZSBNb250aCc6ICdTZWxlY2lvbmFyIG3DqnMnLFxuICAgICdDaG9vc2UgWWVhcic6ICdTZWxlY2lvbmFyIGFubycsXG4gICAgJ1ByZXZpb3VzIE1vbnRoJzogJ03DqnMgYW50ZXJpb3InLFxuICAgICdOZXh0IE1vbnRoJzogJ1Byw7N4aW1vIG3DqnMnLFxuICAgICdQcmV2aW91cyBZZWFyJzogJ0FubyBhbnRlcmlvcicsXG4gICAgJ05leHQgWWVhcic6ICdQcsOzeGltbyBhbm8nLFxuICAgICdQcmV2aW91cyBEZWNhZGUnOiBQUkVWX0RFQ0FERV9QVCxcbiAgICAnTmV4dCBEZWNhZGUnOiAnUHLDs3hpbWEgZMOpY2FkYScsXG4gICAgJ1ByZXYgTW9udGgnOiAnTcOqcyBhbnRlcmlvcicsXG4gICAgJ1ByZXYgWWVhcic6ICdBbm8gYW50ZXJpb3InLFxuICAgICdQcmV2IERlY2FkZSc6IFBSRVZfREVDQURFX1BULFxufTtcblxuY29uc3QgQVJJQV9UUkFOU0xBVElPTlNfRVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgJ0Nob29zZSBEYXRlJzogJ1NlbGVjY2lvbmFyIGZlY2hhJyxcbiAgICAnQ2hvb3NlIE1vbnRoJzogJ1NlbGVjY2lvbmFyIG1lcycsXG4gICAgJ0Nob29zZSBZZWFyJzogJ1NlbGVjY2lvbmFyIGHDsW8nLFxuICAgICdQcmV2aW91cyBNb250aCc6ICdNZXMgYW50ZXJpb3InLFxuICAgICdOZXh0IE1vbnRoJzogJ1Byw7N4aW1vIG1lcycsXG4gICAgJ1ByZXZpb3VzIFllYXInOiAnQcOxbyBhbnRlcmlvcicsXG4gICAgJ05leHQgWWVhcic6ICdQcsOzeGltbyBhw7FvJyxcbiAgICAnUHJldmlvdXMgRGVjYWRlJzogUFJFVl9ERUNBREVfRVMsXG4gICAgJ05leHQgRGVjYWRlJzogJ1Byw7N4aW1hIGTDqWNhZGEnLFxuICAgICdQcmV2IE1vbnRoJzogJ01lcyBhbnRlcmlvcicsXG4gICAgJ1ByZXYgWWVhcic6ICdBw7FvIGFudGVyaW9yJyxcbiAgICAnUHJldiBEZWNhZGUnOiBQUkVWX0RFQ0FERV9FUyxcbn07XG5cbmNvbnN0IEFSSUFfVFJBTlNMQVRJT05TOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9IHtcbiAgICAncHQtQlInOiBBUklBX1RSQU5TTEFUSU9OU19QVF9CUixcbiAgICAncHQnOiBBUklBX1RSQU5TTEFUSU9OU19QVF9CUixcbiAgICAnZXMnOiBBUklBX1RSQU5TTEFUSU9OU19FUyxcbiAgICAnZXMtQ08nOiBBUklBX1RSQU5TTEFUSU9OU19FUyxcbiAgICAnZXMtRVMnOiBBUklBX1RSQU5TTEFUSU9OU19FUyxcbn07XG5cbi8qKlxuICogRGlyZXRpdmEgcGFyYSBjb3JyaWdpciBhIGFjZXNzaWJpbGlkYWRlIGRvIHBhaW5lbCBkbyBEYXRlUGlja2VyIFByaW1lTkcuXG4gKlxuICogUmVzb2x2ZSBvcyBzZWd1aW50ZXMgcHJvYmxlbWFzOlxuICpcbiAqIDEuICoqRm9jbyBpbmljaWFsIGFvIGFicmlyIG92ZXJsYXkqKjogbW92ZSBmb2NvIHByb2dyYW1hdGljYW1lbnRlIHBhcmFcbiAqICAgIGEgY8OpbHVsYSBzZWxlY2lvbmFkYSwgaG9qZSwgb3UgcHJpbWVpcmEgY8OpbHVsYSBkaXNwb27DrXZlbCDigJQgZXZpdGFuZG9cbiAqICAgIHF1ZSBOVkRBIGxlaWEgdG9kYSBlc3RydXR1cmEgZG8gZ3JpZCBhbyBlbnRyYXIgbm8gcGFpbmVsLlxuICpcbiAqIDIuICoqUmUtZm9jbyBhbyB0cm9jYXIgdmlldyAobcOqcy9hbm8pKio6IGFvIG5hdmVnYXIgcGFyYSB2aWV3cyBkZSBtw6pzIG91XG4gKiAgICBhbm8sIG8gRE9NIMOpIGRlc3RydcOtZG8gZSByZWNyaWFkby4gU2VtIGludGVydmVuw6fDo28sIGZvY28gZXNjYXBhIHBhcmFcbiAqICAgIGA8Ym9keT5gIGUgTlZEQSBsw6ogY29udGXDumRvIGZvcmEgZG8gb3ZlcmxheS4gQSBkaXJldGl2YSByZS1mb2NhIG9cbiAqICAgIHByaW1laXJvIGVsZW1lbnRvIGludGVyYXRpdm8gZGEgbm92YSB2aWV3LlxuICpcbiAqIDMuICoqRm9jdXMtdmlzaWJsZSBub3MgZWxlbWVudG9zIGludGVybm9zKio6IGluamV0YSBDU1MgZ2xvYmFsIGNvbVxuICogICAgb3V0bGluZSBwYXJhIHRvZG9zIGVsZW1lbnRvcyBpbnRlcmF0aXZvcyBkbyBvdmVybGF5LCBnYXJhbnRpbmRvXG4gKiAgICBmZWVkYmFjayB2aXN1YWwgbWVzbW8gY29tIGBhcHBlbmRUbz1cImJvZHlcImAuXG4gKlxuICogNC4gKiphcmlhLWxhYmVsIGVucmlxdWVjaWRvIG5vcyBkYXkgY2VsbHMqKjogUHJpbWVORyBzZXRhIGFwZW5hcyBvXG4gKiAgICBuw7ptZXJvIGRvIGRpYS4gQSBkaXJldGl2YSBzb2JyZXNjcmV2ZSBjb20gZGF0YSBjb21wbGV0YSBmb3JtYXRhZGFcbiAqICAgIChleDogXCIzIGRlIGp1bmhvIGRlIDIwMjYsIFF1YVwiKSDigJQgTlZEQSBuYXJyYSBsYWJlbCBzZW0gcHJlY2lzYXJcbiAqICAgIGNvbnRleHR1YWxpemFyIHRvZGEgZ3JpZC5cbiAqXG4gKiA1LiAqKlZpZXcgZGUgbWVzZXMvYW5vcyBzZW0gdGFiaW5kZXgqKjogc3BhbnMgZGUgbcOqcy9hbm8gcmVjZWJlbVxuICogICAgYHRhYmluZGV4PVwiMFwiYCBlIGByb2xlPVwib3B0aW9uXCJgIHBhcmEgbmF2ZWdhw6fDo28gcG9yIHRlY2xhZG8uXG4gKlxuICogVXRpbGl6YSBgTXV0YXRpb25PYnNlcnZlcmAgcGFyYSBkZXRlY3RhciBtdWRhbsOnYXMgaW50ZXJuYXMgZGUgdmlldyxcbiAqIGrDoSBxdWUgUHJpbWVORyBuw6NvIGVtaXRlIGV2ZW50b3MgcGFyYSBlc3NhcyB0cmFuc2nDp8O1ZXMuXG4gKlxuICogKipDU1MqKjogQSBkaXJldGl2YSBpbmpldGEgdW0gYDxzdHlsZT5gIGdsb2JhbCBubyBgPGhlYWQ+YCAodW1hIHZleikuXG4gKiBQYXJhIHByb2pldG9zIHF1ZSBwcmVmZXJlbSBjb250cm9sZSBtYW51YWwsIGRlc2FiaWxpdGUgdmlhIElucHV0XG4gKiBgW3NEYXRlcGlja2VySW5qZWN0U3R5bGVzXT1cImZhbHNlXCJgIGUgaW1wb3J0ZSBvcyBlc3RpbG9zIG1hbnVhbG1lbnRlLlxuICpcbiAqIFVzbzogYDxwLWRhdGVwaWNrZXIgc0RhdGVwaWNrZXJOb1BlcmlvZFRhYiAuLi4+YFxuICpcbiAqIEBjYXRlZ29yeSBEaXJlY3RpdmVzXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW3NEYXRlcGlja2VyTm9QZXJpb2RUYWJdJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBEYXRlcGlja2VyTm9QZXJpb2RUYWJEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGF0ZVBpY2tlciA9IGluamVjdChEYXRlUGlja2VyKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2NhbGUgPSBpbmplY3QoTE9DQUxFX0lEKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcbiAgICBwcml2YXRlIG9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBmb2N1c0xpc3RlbmVyQ2xlYW51cHM6IEFycmF5PCgpID0+IHZvaWQ+ID0gW107XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5pbmplY3RHbG9iYWxGb2N1c1N0eWxlcygpO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ29uU2hvdycpXG4gICAgcHVibGljIG9uUGFuZWxTaG93KCk6IHZvaWQge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZml4UGFuZWxBY2Nlc3NpYmlsaXR5KCk7XG4gICAgICAgICAgICAvLyBOw6NvIGNoYW1hciBmb2N1c0Jlc3RUYXJnZXQoKSBhcXVpIOKAlCBQcmltZU5HIGluaXRGb2N1c2FibGVDZWxsKClcbiAgICAgICAgICAgIC8vIGrDoSBtb3ZlIGZvY28gcHJvIGRheSBjZWxsIGNvbSB0YWJpbmRleD1cIjBcIiBuYSBhYmVydHVyYS5cbiAgICAgICAgICAgIC8vIENoYW1hciBkZSBub3ZvIGNhdXNhIGRvdWJsZS1hbm5vdW5jZSBubyBOVkRBLlxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLm9ic2VydmVQYW5lbENoYW5nZXMoKSwgTVVUQVRJT05fREVCT1VOQ0VfTVMpO1xuICAgICAgICB9LCBGT0NVU19ERUxBWV9NUyk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignb25Nb250aENoYW5nZScpXG4gICAgQEhvc3RMaXN0ZW5lcignb25ZZWFyQ2hhbmdlJylcbiAgICBwdWJsaWMgb25OYXZpZ2F0aW9uQ2hhbmdlKCk6IHZvaWQge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZml4UGFuZWxBY2Nlc3NpYmlsaXR5KCk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzQmVzdFRhcmdldCgpO1xuICAgICAgICB9LCBGT0NVU19ERUxBWV9NUyk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3RPYnNlcnZlcigpO1xuICAgICAgICB0aGlzLnJlbW92ZUZvY3VzTGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZSBmb2NvIHBhcmEgbWVsaG9yIGFsdm8gZGlzcG9uw612ZWwgbm8gcGFpbmVsLlxuICAgICAqIFVzYWRvIGFvIGFicmlyIG92ZXJsYXkgZSBhbyB0cm9jYXIgdmlldyAobcOqcy9hbm8pLlxuICAgICAqXG4gICAgICogQW8gYWJyaXI6IGV2aXRhIHF1ZSBOVkRBIGxlaWEgdG9kYSBlc3RydXR1cmEgZG8gZ3JpZC5cbiAgICAgKiBBbyB0cm9jYXIgdmlldzogcHJldmluZSBmb2NvIGVzY2FwYXIgcGFyYSBgPGJvZHk+YCBxdWFuZG9cbiAgICAgKiBQcmltZU5HIGRlc3Ryw7NpIERPTSBkYSB2aWV3IGFudGVyaW9yLlxuICAgICAqXG4gICAgICogUHJpb3JpZGFkZTogc2VsZWNpb25hZG8gPiBob2plID4gcHJpbWVpcm8gZGlzcG9uw612ZWwuXG4gICAgICogUHVsYSBzZSBmb2NvIGrDoSBlc3TDoSBubyB0YXJnZXQgY29ycmV0byAoZXZpdGEgZG91YmxlLWFubm91bmNlIG5vIE5WREEpLlxuICAgICAqL1xuICAgIHByaXZhdGUgZm9jdXNCZXN0VGFyZ2V0KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMuZGF0ZVBpY2tlci5vdmVybGF5O1xuICAgICAgICBpZiAoIXBhbmVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmZpbmRGb2N1c1RhcmdldChwYW5lbCk7XG4gICAgICAgIGlmICh0YXJnZXQgJiYgdGhpcy5kb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9PSB0YXJnZXQpIHtcbiAgICAgICAgICAgIHRhcmdldC50YWJJbmRleCA9IDA7XG4gICAgICAgICAgICB0YXJnZXQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluamV0YSBDU1MgZ2xvYmFsIGRlIGZvY3VzLXZpc2libGUgbm8gYDxoZWFkPmAgZG8gZG9jdW1lbnRvLlxuICAgICAqIEV4ZWN1dGEgYXBlbmFzIHVtYSB2ZXogKGlkZW1wb3RlbnRlIHZpYSBJRCBkbyBzdHlsZSBlbGVtZW50KS5cbiAgICAgKiBOZWNlc3PDoXJpbyBwb3JxdWUgb3ZlcmxheSBjb20gYGFwcGVuZFRvPVwiYm9keVwiYCBmaWNhIGZvcmEgZG9cbiAgICAgKiBlc2NvcG8gZGUgVmlld0VuY2Fwc3VsYXRpb24gZG8gY29tcG9uZW50ZSBob3N0LlxuICAgICAqL1xuICAgIHByaXZhdGUgaW5qZWN0R2xvYmFsRm9jdXNTdHlsZXMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKEZPQ1VTX1NUWUxFX0lEKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3R5bGUgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHN0eWxlLCAnaWQnLCBGT0NVU19TVFlMRV9JRCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHN0eWxlLCAndHlwZScsICd0ZXh0L2NzcycpO1xuICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVUZXh0KEZPQ1VTX1NUWUxFUyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoc3R5bGUsIHRleHQpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuZG9jdW1lbnQuaGVhZCwgc3R5bGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuY29udHJhIG1lbGhvciBlbGVtZW50byBwYXJhIHJlY2ViZXIgZm9jbyBubyBwYWluZWwgYXR1YWwuXG4gICAgICogQnVzY2EgZW0gb3JkZW06IHNlbGVjaW9uYWRvIOKGkiBob2plIOKGkiBwcmltZWlybyBkaXNwb27DrXZlbC5cbiAgICAgKiBGdW5jaW9uYSBwYXJhIHZpZXdzIGRlIGRpYXMsIG1lc2VzIGUgYW5vcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbmRGb2N1c1RhcmdldChwYW5lbDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgICAvLyBWaWV3IGRlIGRpYXNcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWREYXkgPSBwYW5lbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcbiAgICAgICAgICAgICcucC1kYXRlcGlja2VyLWRheS1zZWxlY3RlZCwgLnAtZGF0ZXBpY2tlci1kYXlbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0nXG4gICAgICAgICk7XG4gICAgICAgIGlmIChzZWxlY3RlZERheSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkRGF5O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG9kYXkgPSBwYW5lbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLnAtZGF0ZXBpY2tlci10b2RheSAucC1kYXRlcGlja2VyLWRheScpO1xuICAgICAgICBpZiAodG9kYXkpIHtcbiAgICAgICAgICAgIHJldHVybiB0b2RheTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZpZXcgZGUgbWVzZXNcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRNb250aCA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcucC1kYXRlcGlja2VyLW1vbnRoLnAtZGF0ZXBpY2tlci1tb250aC1zZWxlY3RlZCcpO1xuICAgICAgICBpZiAoc2VsZWN0ZWRNb250aCkge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkTW9udGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlyc3RNb250aCA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcucC1kYXRlcGlja2VyLW1vbnRoOm5vdCgucC1kaXNhYmxlZCknKTtcbiAgICAgICAgaWYgKGZpcnN0TW9udGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmaXJzdE1vbnRoO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmlldyBkZSBhbm9zXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkWWVhciA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcucC1kYXRlcGlja2VyLXllYXIucC1kYXRlcGlja2VyLXllYXItc2VsZWN0ZWQnKTtcbiAgICAgICAgaWYgKHNlbGVjdGVkWWVhcikge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkWWVhcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaXJzdFllYXIgPSBwYW5lbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLnAtZGF0ZXBpY2tlci15ZWFyOm5vdCgucC1kaXNhYmxlZCknKTtcbiAgICAgICAgaWYgKGZpcnN0WWVhcikge1xuICAgICAgICAgICAgcmV0dXJuIGZpcnN0WWVhcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZhbGxiYWNrOiBwcmltZWlybyBkYXkgY2VsbCBkaXNwb27DrXZlbFxuICAgICAgICBjb25zdCBmaXJzdERheSA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcucC1kYXRlcGlja2VyLWRheTpub3QoLnAtZGlzYWJsZWQpJyk7XG4gICAgICAgIHJldHVybiBmaXJzdERheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcGxpY2EgY29ycmXDp8O1ZXMgZGUgYWNlc3NpYmlsaWRhZGUgbm8gcGFpbmVsIGRvIERhdGVQaWNrZXIsXG4gICAgICogaW5kZXBlbmRlbnRlIGRhIHZpZXcgaW50ZXJuYSBhdGl2YSAoZGlhcywgbWVzZXMgb3UgYW5vcykuXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaXhQYW5lbEFjY2Vzc2liaWxpdHkoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5kYXRlUGlja2VyLm92ZXJsYXk7XG4gICAgICAgIGlmICghcGFuZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhbmVsLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcucC1kYXRlcGlja2VyLXNlbGVjdC1tb250aCwgLnAtZGF0ZXBpY2tlci1zZWxlY3QteWVhcicpLmZvckVhY2goKGJ0bikgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoYnRuLCAndGFiaW5kZXgnLCAnMCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICBwYW5lbC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLnAtZGF0ZXBpY2tlci1tb250aDpub3QoW3RhYmluZGV4XSknKS5mb3JFYWNoKChtb250aCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUobW9udGgsICd0YWJpbmRleCcsICcwJyk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShtb250aCwgJ3JvbGUnLCAnb3B0aW9uJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHBhbmVsLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcucC1kYXRlcGlja2VyLXllYXI6bm90KFt0YWJpbmRleF0pJykuZm9yRWFjaCgoeWVhcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoeWVhciwgJ3RhYmluZGV4JywgJzAnKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHllYXIsICdyb2xlJywgJ29wdGlvbicpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmFwcGx5R3JpZGNlbGxSb2xlVG9EYXlzKHBhbmVsKTtcbiAgICAgICAgdGhpcy5lbnJpY2hEYXlDZWxsQXJpYUxhYmVscyhwYW5lbCk7XG4gICAgICAgIHRoaXMuZW5yaWNoR3JpZEFyaWFMYWJlbChwYW5lbCk7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlQXJpYUxhYmVscyhwYW5lbCk7XG4gICAgICAgIHRoaXMuZml4TmF2aWdhdGlvbkJ1dHRvbkxhYmVscyhwYW5lbCk7XG4gICAgICAgIHRoaXMucmVtb3ZlQXBwbGljYXRpb25Sb2xlRnJvbUNvbnRhaW5lcihwYW5lbCk7XG4gICAgICAgIHRoaXMuc2V0dXBGb2N1c1RyYWNraW5nKHBhbmVsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGljaW9uYSBgcm9sZT1cImdyaWRjZWxsXCJgIG5vcyBgPHNwYW4gY2xhc3M9XCJwLWRhdGVwaWNrZXItZGF5XCI+YCBxdWUgcmVjZWJlbSBmb2NvLlxuICAgICAqXG4gICAgICogUHJpbWVORyBjb2xvY2EgYHRhYmluZGV4YCBubyBgPHNwYW4+YCBkZW50cm8gZG8gYDx0ZD5gLCBtYXMgc2VtIHJvbGUgZXhwbMOtY2l0by5cbiAgICAgKiBOVkRBIG7Do28gZW50cmEgYXV0b21hdGljYW1lbnRlIGVtIGZvY3VzIG1vZGUgcXVhbmRvIGZvY2EgdW0gZWxlbWVudG8gc2VtXG4gICAgICogcm9sZSBkZSB3aWRnZXQgKGdyaWRjZWxsLCBidXR0b24sIGV0YykuIFJlc3VsdGFkbzogTlZEQSBmaWNhIGVtIGJyb3dzZSBtb2RlXG4gICAgICogZSBsw6ogdG9kYSBhIHRhYmVsYSBzZXF1ZW5jaWFsbWVudGUgYW8gaW52w6lzIGRlIGFudW5jaWFyIHPDsyBhIGPDqWx1bGEgZm9jYWRhLlxuICAgICAqXG4gICAgICogQW8gYWRpY2lvbmFyIGByb2xlPVwiZ3JpZGNlbGxcImAgbm8gc3BhbiBmb2PDoXZlbCwgTlZEQSByZWNvbmhlY2UgcXVlIMOpIHVtXG4gICAgICogd2lkZ2V0IGludGVyYXRpdm8gZSBlbnRyYSBlbSBmb2N1cyBtb2RlIOKAlCBhbnVuY2lhbmRvIGFwZW5hcyBvIGFyaWEtbGFiZWxcbiAgICAgKiBkYSBjw6lsdWxhIGZvY2FkYS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFwcGx5R3JpZGNlbGxSb2xlVG9EYXlzKHBhbmVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBwYW5lbC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLnAtZGF0ZXBpY2tlci1kYXk6bm90KC5wLWRpc2FibGVkKScpLmZvckVhY2goKGRheVNwYW4pID0+IHtcbiAgICAgICAgICAgIGlmICghZGF5U3Bhbi5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGRheVNwYW4sICdyb2xlJywgJ2dyaWRjZWxsJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVucmlxdWVjZSBgYXJpYS1sYWJlbGAgZG9zIGRheSBjZWxscyBjb20gZGF0YSBjb21wbGV0YSBmb3JtYXRhZGEuXG4gICAgICogUHJpbWVORyBwb3IgcGFkcsOjbyB1c2EgYXBlbmFzIG8gbsO6bWVybyBkbyBkaWEsIGZvcsOnYW5kbyBOVkRBXG4gICAgICogYSBuYXJyYXIgY29udGV4dG8gZGUgZ3JpZCAobGluaGEvY29sdW5hL3dlZWtkYXkpIHBhcmEgaW5mb3JtYXIgYSBkYXRhLlxuICAgICAqIENvbSBhcmlhLWxhYmVsIGNvbXBsZXRvLCBOVkRBIG5hcnJhIGRpcmV0YW1lbnRlIGEgZGF0YSBzZW0gdmVyYm9zaWRhZGUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBlbnJpY2hEYXlDZWxsQXJpYUxhYmVscyhwYW5lbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyBjdXJyZW50TW9udGgsIGN1cnJlbnRZZWFyIH0gPSB0aGlzLmRhdGVQaWNrZXI7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRNb250aCA9PSBudWxsIHx8IGN1cnJlbnRZZWFyID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHdlZWtkYXlIZWFkZXJzID0gcGFuZWwucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJy5wLWRhdGVwaWNrZXItd2Vla2RheScpO1xuICAgICAgICBjb25zdCB3ZWVrZGF5czogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgd2Vla2RheUhlYWRlcnMuZm9yRWFjaCgoaGVhZGVyKSA9PiB7XG4gICAgICAgICAgICB3ZWVrZGF5cy5wdXNoKGhlYWRlci50ZXh0Q29udGVudD8udHJpbSgpIHx8ICcnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgcm93cyA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcucC1kYXRlcGlja2VyLWRheS12aWV3IHRib2R5IHRyJyk7XG4gICAgICAgIHJvd3MuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjZWxscyA9IHJvdy5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PigndGQnKTtcbiAgICAgICAgICAgIGNlbGxzLmZvckVhY2goKGNlbGwsIGNlbGxJbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRheVNwYW4gPSBjZWxsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcucC1kYXRlcGlja2VyLWRheScpO1xuICAgICAgICAgICAgICAgIGlmICghZGF5U3Bhbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZGF5TnVtYmVyID0gcGFyc2VJbnQoZGF5U3Bhbi50ZXh0Q29udGVudD8udHJpbSgpIHx8ICcwJywgMTApO1xuICAgICAgICAgICAgICAgIGlmICghZGF5TnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpc090aGVyTW9udGggPSBjZWxsLmNsYXNzTGlzdC5jb250YWlucygncC1kYXRlcGlja2VyLW90aGVyLW1vbnRoJyk7XG4gICAgICAgICAgICAgICAgaWYgKGlzT3RoZXJNb250aCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGN1cnJlbnRZZWFyLCBjdXJyZW50TW9udGgsIGRheU51bWJlcik7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkRGF0ZSA9IHRoaXMuZm9ybWF0RGF0ZUZvckFyaWFMYWJlbChkYXRlKTtcbiAgICAgICAgICAgICAgICBjb25zdCB3ZWVrZGF5ID0gd2Vla2RheXNbY2VsbEluZGV4XSB8fCAnJztcbiAgICAgICAgICAgICAgICBjb25zdCBhcmlhTGFiZWwgPSB3ZWVrZGF5ID8gYCR7Zm9ybWF0dGVkRGF0ZX0sICR7d2Vla2RheX1gIDogZm9ybWF0dGVkRGF0ZTtcblxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGRheVNwYW4sIEFSSUFfTEFCRUxfQVRUUiwgYXJpYUxhYmVsKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGljaW9uYSBhcmlhLWxhYmVsIG5vIGdyaWQgY29tIG3DqnMvYW5vIGF0dWFsIHBhcmEgZGFyIGNvbnRleHRvXG4gICAgICogaW1lZGlhdG8gYW8gTlZEQSBhbyBlbnRyYXIgbmEgdGFiZWxhIGRlIGRpYXMuXG4gICAgICogRXhlbXBsbzogXCJDYWxlbmTDoXJpbywgSnVuaG8gMjAyNlwiXG4gICAgICovXG4gICAgcHJpdmF0ZSBlbnJpY2hHcmlkQXJpYUxhYmVsKHBhbmVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBncmlkID0gcGFuZWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy5wLWRhdGVwaWNrZXItZGF5LXZpZXdbcm9sZT1cImdyaWRcIl0nKTtcbiAgICAgICAgaWYgKCFncmlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IGN1cnJlbnRNb250aCwgY3VycmVudFllYXIgfSA9IHRoaXMuZGF0ZVBpY2tlcjtcbiAgICAgICAgaWYgKGN1cnJlbnRNb250aCA9PSBudWxsIHx8IGN1cnJlbnRZZWFyID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1vbnRoTmFtZSA9IG5ldyBEYXRlKGN1cnJlbnRZZWFyLCBjdXJyZW50TW9udGgsIDEpLnRvTG9jYWxlRGF0ZVN0cmluZygncHQtQlInLCB7XG4gICAgICAgICAgICBtb250aDogJ2xvbmcnLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgY2FwaXRhbGl6ZWRNb250aCA9IG1vbnRoTmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG1vbnRoTmFtZS5zbGljZSgxKTtcbiAgICAgICAgY29uc3QgbGFiZWwgPSBgQ2FsZW5kw6FyaW8sICR7Y2FwaXRhbGl6ZWRNb250aH0gJHtjdXJyZW50WWVhcn1gO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShncmlkLCBBUklBX0xBQkVMX0FUVFIsIGxhYmVsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXRhIGRhdGEgcGFyYSBhcmlhLWxhYmVsIGxlZ8OtdmVsIHBvciBsZWl0b3IgZGUgdGVsYS5cbiAgICAgKiBTZW1wcmUgdXNhIHB0LUJSIHBhcmEgZ2FyYW50aXIgY29uc2lzdMOqbmNpYSBjb20gbGFiZWxzIHRyYWR1emlkb3MsXG4gICAgICogaW5kZXBlbmRlbnRlIGRvIExPQ0FMRV9JRCBjb25maWd1cmFkbyBubyBBbmd1bGFyLlxuICAgICAqIEV4ZW1wbG86IFwiMyBkZSBqdW5obyBkZSAyMDI2XCJcbiAgICAgKi9cbiAgICBwcml2YXRlIGZvcm1hdERhdGVGb3JBcmlhTGFiZWwoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoJ3B0LUJSJywge1xuICAgICAgICAgICAgICAgIGRheTogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgIG1vbnRoOiAnbG9uZycsXG4gICAgICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIGAke2RhdGUuZ2V0RGF0ZSgpfS8ke2RhdGUuZ2V0TW9udGgoKSArIDF9LyR7ZGF0ZS5nZXRGdWxsWWVhcigpfWA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIGxvY2FsZSBzdHJpbmcgcGFyYSBmb3JtYXRhw6fDo28uXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRMb2NhbGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlIHx8ICdwdC1CUic7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhZHV6IGFyaWEtbGFiZWxzIGRvcyBib3TDtWVzIGRvIGhlYWRlciBxdWUgUHJpbWVORyByZW5kZXJpemEgZW0gaW5nbMOqcy5cbiAgICAgKiBQcmltZU5HIHVzYSBgZ2V0VHJhbnNsYXRpb24oJ2Nob29zZURhdGUnKWAgZXRjLCBxdWUgcmV0b3JuYSBpbmdsw6pzXG4gICAgICogc2UgYFByaW1lTkdDb25maWcuc2V0VHJhbnNsYXRpb24oKWAgbsOjbyBmb2kgY29uZmlndXJhZG8gcGVsbyBwcm9qZXRvLlxuICAgICAqXG4gICAgICogQnVzY2EgYm90w7VlcyBjb20gYXJpYS1sYWJlbCBlbSBpbmdsw6pzIGUgdHJhZHV6IHBybyBsb2NhbGUgYXR1YWwuXG4gICAgICovXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVBcmlhTGFiZWxzKHBhbmVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSB0aGlzLmdldFRyYW5zbGF0aW9ucygpO1xuXG4gICAgICAgIC8vIERpYWxvZyBhcmlhLWxhYmVsIChcIkNob29zZSBEYXRlXCIpXG4gICAgICAgIGNvbnN0IGRpYWxvZyA9IHBhbmVsLmNsb3Nlc3QoJ1tyb2xlPVwiZGlhbG9nXCJdJykgfHwgcGFuZWw7XG4gICAgICAgIGNvbnN0IGRpYWxvZ0xhYmVsID0gZGlhbG9nLmdldEF0dHJpYnV0ZShBUklBX0xBQkVMX0FUVFIpO1xuICAgICAgICBpZiAoZGlhbG9nTGFiZWwgJiYgdHJhbnNsYXRpb25zW2RpYWxvZ0xhYmVsXSkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoZGlhbG9nLCBBUklBX0xBQkVMX0FUVFIsIHRyYW5zbGF0aW9uc1tkaWFsb2dMYWJlbF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQm90w7VlcyBcIkNob29zZSBNb250aFwiIGUgXCJDaG9vc2UgWWVhclwiIG5vIGhlYWRlclxuICAgICAgICBwYW5lbC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLnAtZGF0ZXBpY2tlci1zZWxlY3QtbW9udGgsIC5wLWRhdGVwaWNrZXItc2VsZWN0LXllYXInKS5mb3JFYWNoKChidG4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gYnRuLmdldEF0dHJpYnV0ZShBUklBX0xBQkVMX0FUVFIpO1xuICAgICAgICAgICAgaWYgKGxhYmVsICYmIHRyYW5zbGF0aW9uc1tsYWJlbF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShidG4sIEFSSUFfTEFCRUxfQVRUUiwgdHJhbnNsYXRpb25zW2xhYmVsXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcnJpZ2UgYXJpYS1sYWJlbCBkb3MgYm90w7VlcyBwcmV2L25leHQgZG8gUHJpbWVORy5cbiAgICAgKiBQcmltZU5HIHVzYSBgcC1idXR0b25gIGNvbXBvbmVudCBxdWUgc2V0YSBgYXJpYS1sYWJlbGAgbm8gaG9zdCBlbGVtZW50IGA8cC1idXR0b24+YCxcbiAgICAgKiBtYXMgTlZEQSBmb2NhIG8gYDxidXR0b24+YCBpbnRlcm5vIHF1ZSBuw6NvIGhlcmRhIG8gbGFiZWwgZG8gY3VzdG9tIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBFc3RydXR1cmEgRE9NOiBgPHAtYnV0dG9uIGFyaWEtbGFiZWw9XCJQcmV2aW91cyBNb250aFwiPjxidXR0b24gY2xhc3M9XCJwLWRhdGVwaWNrZXItcHJldi1idXR0b25cIj4uLi48L2J1dHRvbj48L3AtYnV0dG9uPmBcbiAgICAgKlxuICAgICAqIEZpeDogbMOqIGFyaWEtbGFiZWwgZG8gYDxwLWJ1dHRvbj5gIGhvc3QsIHRyYWR1eiwgZSBwcm9wYWdhIHBybyBgPGJ1dHRvbj5gIGludGVybm8uXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaXhOYXZpZ2F0aW9uQnV0dG9uTGFiZWxzKHBhbmVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSB0aGlzLmdldFRyYW5zbGF0aW9ucygpO1xuXG4gICAgICAgIC8vIEJ1c2NhciA8cC1idXR0b24+IGhvc3RzIHF1ZSBjb250w6ltIG9zIGJvdMO1ZXMgcHJldi9uZXh0XG4gICAgICAgIGNvbnN0IHBCdXR0b25zID0gcGFuZWwucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJ3AtYnV0dG9uJyk7XG4gICAgICAgIHBCdXR0b25zLmZvckVhY2goKHBCdG4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlubmVyQnV0dG9uID0gcEJ0bi5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcbiAgICAgICAgICAgICAgICAnYnV0dG9uLnAtZGF0ZXBpY2tlci1wcmV2LWJ1dHRvbiwgYnV0dG9uLnAtZGF0ZXBpY2tlci1uZXh0LWJ1dHRvbidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIWlubmVyQnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgbGFiZWwgPSBwQnRuLmdldEF0dHJpYnV0ZShBUklBX0xBQkVMX0FUVFIpIHx8ICcnO1xuXG4gICAgICAgICAgICAvLyBUcmFkdXppclxuICAgICAgICAgICAgaWYgKGxhYmVsICYmIHRyYW5zbGF0aW9uc1tsYWJlbF0pIHtcbiAgICAgICAgICAgICAgICBsYWJlbCA9IHRyYW5zbGF0aW9uc1tsYWJlbF07XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUocEJ0biwgQVJJQV9MQUJFTF9BVFRSLCBsYWJlbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFByb3BhZ2FyIHBybyA8YnV0dG9uPiBpbnRlcm5vXG4gICAgICAgICAgICBpZiAobGFiZWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShpbm5lckJ1dHRvbiwgQVJJQV9MQUJFTF9BVFRSLCBsYWJlbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBgcm9sZT1cImFwcGxpY2F0aW9uXCJgIGRvIGNvbnRhaW5lciBkbyBjYWxlbmTDoXJpby5cbiAgICAgKlxuICAgICAqIFByaW1lTkcgc2V0YSBgcm9sZT1cImFwcGxpY2F0aW9uXCJgIG5vIGAucC1kYXRlcGlja2VyLWNhbGVuZGFyLWNvbnRhaW5lcmBcbiAgICAgKiBwYXJhIHF1ZSBhcnJvdyBrZXlzIGNoZWd1ZW0gbm8gSmF2YVNjcmlwdCBzZW0gaW50ZXJjZXB0YcOnw6NvIGRvIGJyb3dzZSBtb2RlLlxuICAgICAqIFBvcsOpbSBgcm9sZT1cImdyaWRcImAgbmEgdGFibGUgasOhIGdhcmFudGUgZXNzZSBjb21wb3J0YW1lbnRvIOKAlCBOVkRBIGVudHJhXG4gICAgICogYXV0b21hdGljYW1lbnRlIGVtIGZvY3VzIG1vZGUgYW8gZm9jYXIgdW1hIGdyaWRjZWxsLlxuICAgICAqXG4gICAgICogTyBgcm9sZT1cImFwcGxpY2F0aW9uXCJgIG5vIGNvbnRhaW5lciBQQUkgY2F1c2EgTlZEQSBhIGRlc3BlamEgbyBjb250ZcO6ZG9cbiAgICAgKiB2aXJ0dWFsIGRvIGNvbnRhaW5lciBpbnRlaXJvIGFvIGVudHJhciBubyBkaWFsb2csIGFudGVzIGRlIHBvdXNhciBuYSBjw6lsdWxhLlxuICAgICAqIFJlbW92w6otbG8gcmVzb2x2ZSBhIGxlaXR1cmEgZXhjZXNzaXZhIHNlbSBxdWVicmFyIG5hdmVnYcOnw6NvIHBvciBzZXRhcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbW92ZUFwcGxpY2F0aW9uUm9sZUZyb21Db250YWluZXIocGFuZWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNhbGVuZGFyQ29udGFpbmVyID0gcGFuZWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy5wLWRhdGVwaWNrZXItY2FsZW5kYXItY29udGFpbmVyJyk7XG4gICAgICAgIGlmIChjYWxlbmRhckNvbnRhaW5lcj8uZ2V0QXR0cmlidXRlKCdyb2xlJykgPT09ICdhcHBsaWNhdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKGNhbGVuZGFyQ29udGFpbmVyLCAncm9sZScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSBtYXBhIGRlIHRyYWR1w6fDtWVzIHBybyBsb2NhbGUgYXR1YWwuXG4gICAgICogU2UgbG9jYWxlIMOpIGluZ2zDqnMgb3UgbsOjbyByZWNvbmhlY2lkbywgZmFsbGJhY2sgcHJhIHB0LUJSXG4gICAgICogKGFzc3VtaW1vcyBxdWUgbGFiZWxzIGVtIGluZ2zDqnMgZGV2ZW0gc2VyIHRyYWR1emlkb3MpLlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0VHJhbnNsYXRpb25zKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICBjb25zdCBsb2NhbGUgPSB0aGlzLmdldExvY2FsZSgpO1xuICAgICAgICByZXR1cm4gQVJJQV9UUkFOU0xBVElPTlNbbG9jYWxlXVxuICAgICAgICAgICAgfHwgQVJJQV9UUkFOU0xBVElPTlNbbG9jYWxlLnNwbGl0KCctJylbMF1dXG4gICAgICAgICAgICB8fCBBUklBX1RSQU5TTEFUSU9OU19QVF9CUjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGljaW9uYSBsaXN0ZW5lcnMgZGUgZm9jdXMvYmx1ciBub3MgZWxlbWVudG9zIGludGVyYXRpdm9zIHBhcmFcbiAgICAgKiBnYXJhbnRpciBpbmRpY2Fkb3IgdmlzdWFsIHF1YW5kbyBgLmZvY3VzKClgIMOpIGNoYW1hZG8gcHJvZ3JhbWF0aWNhbWVudGUuXG4gICAgICpcbiAgICAgKiBgOmZvY3VzLXZpc2libGVgIHBvZGUgbsOjbyBzZXIgYXBsaWNhZG8gcXVhbmRvIGZvY28gw6kgbW92aWRvIHZpYSBKUyxcbiAgICAgKiBlbnTDo28gdXNhbW9zIGNsYXNzZSBhdXhpbGlhciBgcy1kYXRlcGlja2VyLWRheS1mb2N1c2VkYCBjb21vIGZhbGxiYWNrLlxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0dXBGb2N1c1RyYWNraW5nKHBhbmVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlbW92ZUZvY3VzTGlzdGVuZXJzKCk7XG5cbiAgICAgICAgY29uc3QgZm9jdXNhYmxlRWxlbWVudHMgPSBwYW5lbC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihcbiAgICAgICAgICAgICcucC1kYXRlcGlja2VyLWRheSwgLnAtZGF0ZXBpY2tlci1tb250aCwgLnAtZGF0ZXBpY2tlci15ZWFyJ1xuICAgICAgICApO1xuICAgICAgICBmb2N1c2FibGVFbGVtZW50cy5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm9jdXNDbGVhbnVwID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oZWwsICdmb2N1cycsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGVsLCAncy1kYXRlcGlja2VyLWRheS1mb2N1c2VkJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGJsdXJDbGVhbnVwID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oZWwsICdibHVyJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoZWwsICdzLWRhdGVwaWNrZXItZGF5LWZvY3VzZWQnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5mb2N1c0xpc3RlbmVyQ2xlYW51cHMucHVzaChmb2N1c0NsZWFudXAsIGJsdXJDbGVhbnVwKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGxpc3RlbmVycyBkZSBmb2N1cy9ibHVyIHJlZ2lzdHJhZG9zIGFudGVyaW9ybWVudGUuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZW1vdmVGb2N1c0xpc3RlbmVycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mb2N1c0xpc3RlbmVyQ2xlYW51cHMuZm9yRWFjaCgoY2xlYW51cCkgPT4gY2xlYW51cCgpKTtcbiAgICAgICAgdGhpcy5mb2N1c0xpc3RlbmVyQ2xlYW51cHMgPSBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPYnNlcnZhIG11ZGFuw6dhcyBubyBET00gZG8gcGFpbmVsIHBhcmEgcmVhcGxpY2FyIGNvcnJlw6fDtWVzXG4gICAgICogcXVhbmRvIG8gUHJpbWVORyB0cm9jYSBhIHZpZXcgaW50ZXJuYSAoZGlhcyDihpIgbWVzZXMg4oaSIGFub3MpLlxuICAgICAqIFVzYSBkZWJvdW5jZSBlIHPDsyByZWFnZSBhIGNoaWxkTGlzdCBjaGFuZ2VzIChuw6NvIGF0dHJpYnV0ZXMpXG4gICAgICogcGFyYSBldml0YXIgbG9vcCBpbmZpbml0byBjb20gYXMgcHLDs3ByaWFzIG11dGHDp8O1ZXMgZGEgZGlyZXRpdmEuXG4gICAgICovXG4gICAgcHJpdmF0ZSBvYnNlcnZlUGFuZWxDaGFuZ2VzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3RPYnNlcnZlcigpO1xuXG4gICAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5kYXRlUGlja2VyLm92ZXJsYXk7XG4gICAgICAgIGlmICghcGFuZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkZWJvdW5jZVRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgaXNQcm9jZXNzaW5nID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5vYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGlmIChpc1Byb2Nlc3NpbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFPDsyByZWFnaXIgc2UgaG91dmUgYWRpw6fDo28vcmVtb8Onw6NvIGRlIG7Ds3MgKHRyb2NhIGRlIHZpZXcpXG4gICAgICAgICAgICBjb25zdCBoYXNTdHJ1Y3R1cmFsQ2hhbmdlID0gbXV0YXRpb25zLnNvbWUoXG4gICAgICAgICAgICAgICAgKG0pID0+IG0udHlwZSA9PT0gJ2NoaWxkTGlzdCcgJiYgKG0uYWRkZWROb2Rlcy5sZW5ndGggPiAwIHx8IG0ucmVtb3ZlZE5vZGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoIWhhc1N0cnVjdHVyYWxDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkZWJvdW5jZVRpbWVyKSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGRlYm91bmNlVGltZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVib3VuY2VUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlzUHJvY2Vzc2luZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5maXhQYW5lbEFjY2Vzc2liaWxpdHkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzQmVzdFRhcmdldCgpO1xuICAgICAgICAgICAgICAgIGlzUHJvY2Vzc2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgfSwgTVVUQVRJT05fREVCT1VOQ0VfTVMpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUocGFuZWwsIHtcbiAgICAgICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgICAgICAgIHN1YnRyZWU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGlzY29ubmVjdE9ic2VydmVyKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vYnNlcnZlcikge1xuICAgICAgICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
@@ -2,6 +2,7 @@ export { EnumSeverity } from './lib/shared/models/severities';
2
2
  export { BorderButtonComponent } from './lib/shared/border-button/border-button.component';
3
3
  export { BorderButtonModule } from './lib/shared/border-button/border-button.module';
4
4
  export * from './lib/shared/helpers';
5
+ export { DatepickerNoPeriodTabDirective } from './lib/accessibility/datepicker-no-period-tab.directive';
5
6
  export { PaginatorAccessibilityDirective } from './lib/accessibility/paginator-accessibility.directive';
6
7
  export { TableCheckboxAccessibilityDirective } from './lib/accessibility/table-checkbox-accessibility.directive';
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zaGFyZWQvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzlELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBQzNGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQ3JGLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDeEcsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0sNERBQTRELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSB7IEJvcmRlckJ1dHRvbk9wdGlvbnMgfSBmcm9tICcuL2xpYi9zaGFyZWQvbW9kZWxzL2JvcmRlci1idXR0b24tb3B0aW9ucyc7XG5leHBvcnQgdHlwZSB7IFNldmVyaXRpZXMgfSBmcm9tICcuL2xpYi9zaGFyZWQvbW9kZWxzL3NldmVyaXRpZXMnO1xuZXhwb3J0IHsgRW51bVNldmVyaXR5IH0gZnJvbSAnLi9saWIvc2hhcmVkL21vZGVscy9zZXZlcml0aWVzJztcbmV4cG9ydCB7IEJvcmRlckJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4vbGliL3NoYXJlZC9ib3JkZXItYnV0dG9uL2JvcmRlci1idXR0b24uY29tcG9uZW50JztcbmV4cG9ydCB7IEJvcmRlckJ1dHRvbk1vZHVsZSB9IGZyb20gJy4vbGliL3NoYXJlZC9ib3JkZXItYnV0dG9uL2JvcmRlci1idXR0b24ubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3NoYXJlZC9oZWxwZXJzJztcbmV4cG9ydCB7IFBhZ2luYXRvckFjY2Vzc2liaWxpdHlEaXJlY3RpdmUgfSBmcm9tICcuL2xpYi9hY2Nlc3NpYmlsaXR5L3BhZ2luYXRvci1hY2Nlc3NpYmlsaXR5LmRpcmVjdGl2ZSc7XG5leHBvcnQgeyBUYWJsZUNoZWNrYm94QWNjZXNzaWJpbGl0eURpcmVjdGl2ZSB9IGZyb20gJy4vbGliL2FjY2Vzc2liaWxpdHkvdGFibGUtY2hlY2tib3gtYWNjZXNzaWJpbGl0eS5kaXJlY3RpdmUnO1xuXG4iXX0=
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zaGFyZWQvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzlELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBQzNGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQ3JGLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFDeEcsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDeEcsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0sNERBQTRELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSB7IEJvcmRlckJ1dHRvbk9wdGlvbnMgfSBmcm9tICcuL2xpYi9zaGFyZWQvbW9kZWxzL2JvcmRlci1idXR0b24tb3B0aW9ucyc7XG5leHBvcnQgdHlwZSB7IFNldmVyaXRpZXMgfSBmcm9tICcuL2xpYi9zaGFyZWQvbW9kZWxzL3NldmVyaXRpZXMnO1xuZXhwb3J0IHsgRW51bVNldmVyaXR5IH0gZnJvbSAnLi9saWIvc2hhcmVkL21vZGVscy9zZXZlcml0aWVzJztcbmV4cG9ydCB7IEJvcmRlckJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4vbGliL3NoYXJlZC9ib3JkZXItYnV0dG9uL2JvcmRlci1idXR0b24uY29tcG9uZW50JztcbmV4cG9ydCB7IEJvcmRlckJ1dHRvbk1vZHVsZSB9IGZyb20gJy4vbGliL3NoYXJlZC9ib3JkZXItYnV0dG9uL2JvcmRlci1idXR0b24ubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3NoYXJlZC9oZWxwZXJzJztcbmV4cG9ydCB7IERhdGVwaWNrZXJOb1BlcmlvZFRhYkRpcmVjdGl2ZSB9IGZyb20gJy4vbGliL2FjY2Vzc2liaWxpdHkvZGF0ZXBpY2tlci1uby1wZXJpb2QtdGFiLmRpcmVjdGl2ZSc7XG5leHBvcnQgeyBQYWdpbmF0b3JBY2Nlc3NpYmlsaXR5RGlyZWN0aXZlIH0gZnJvbSAnLi9saWIvYWNjZXNzaWJpbGl0eS9wYWdpbmF0b3ItYWNjZXNzaWJpbGl0eS5kaXJlY3RpdmUnO1xuZXhwb3J0IHsgVGFibGVDaGVja2JveEFjY2Vzc2liaWxpdHlEaXJlY3RpdmUgfSBmcm9tICcuL2xpYi9hY2Nlc3NpYmlsaXR5L3RhYmxlLWNoZWNrYm94LWFjY2Vzc2liaWxpdHkuZGlyZWN0aXZlJztcblxuIl19