@seniorsistemas/data-seniorx-core 3.3.0 → 3.4.0-main-e91c7773

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 (32) hide show
  1. package/core/constants/nested-table.const.d.ts +3 -0
  2. package/core/constants/table.const.d.ts +2 -0
  3. package/core/types/nested-table.type.d.ts +18 -0
  4. package/esm2022/core/constants/nested-table.const.mjs +4 -0
  5. package/esm2022/core/constants/table.const.mjs +15 -1
  6. package/esm2022/core/types/nested-table.type.mjs +2 -0
  7. package/esm2022/features/datepicker/datepicker.component.mjs +179 -9
  8. package/esm2022/features/nested-table/nested-table.component.mjs +132 -0
  9. package/esm2022/features/panel/panel.component.mjs +3 -3
  10. package/esm2022/features/table/components/table-actions-menu.component.mjs +47 -6
  11. package/esm2022/features/table/components/table-cell-content.component.mjs +3 -3
  12. package/esm2022/features/table/table.component.mjs +17 -67
  13. package/esm2022/features/table/utils/table-data.util.mjs +40 -1
  14. package/esm2022/locales/en.json +5 -0
  15. package/esm2022/locales/es-CO.json +5 -0
  16. package/esm2022/locales/pt.json +5 -0
  17. package/esm2022/providers/features.provider.mjs +3 -1
  18. package/esm2022/public-api.mjs +2 -1
  19. package/features/datepicker/datepicker.component.d.ts +14 -1
  20. package/features/nested-table/nested-table.component.d.ts +47 -0
  21. package/features/table/components/table-actions-menu.component.d.ts +16 -1
  22. package/features/table/table.component.d.ts +0 -1
  23. package/features/table/utils/table-data.util.d.ts +7 -1
  24. package/fesm2022/seniorsistemas-data-seniorx-core.mjs +435 -83
  25. package/fesm2022/seniorsistemas-data-seniorx-core.mjs.map +1 -1
  26. package/package.json +1 -1
  27. package/public-api.d.ts +2 -0
  28. package/src/locales/en.json +5 -0
  29. package/src/locales/es-CO.json +5 -0
  30. package/src/locales/pt.json +5 -0
  31. package/styles/accessibility.scss +92 -0
  32. package/styles.css +89 -1
@@ -11,6 +11,7 @@ import * as i0 from "@angular/core";
11
11
  import * as i1 from "@angular/common";
12
12
  import * as i2 from "@ngx-translate/core";
13
13
  const DAYS_IN_WEEK = 7;
14
+ const MONTHS_IN_YEAR = 12;
14
15
  const YEARS_PER_PAGE = 12;
15
16
  const HOUR_FORMAT_12_MAX = 12;
16
17
  const HOUR_FORMAT_24_MAX = 23;
@@ -29,6 +30,12 @@ export class DatepickerComponent extends InputsComponent {
29
30
  max = null;
30
31
  defaultDate = null;
31
32
  dateFormat = 'dd/MM/yyyy';
33
+ // Digitacao no campo, desligada por padrao. Ate aqui o <input> so refletia o que
34
+ // foi clicado no calendario: nao havia handler de (input), entao o que o usuario
35
+ // digitava nunca chegava ao componente. Ligar por padrao mudaria o
36
+ // comportamento de telas que ja contam com o campo ser efetivamente so-leitura,
37
+ // por isso e opt-in.
38
+ allowTyping = false;
32
39
  hourFormat = '24';
33
40
  minuteStep = 5;
34
41
  showSeconds = false;
@@ -61,13 +68,25 @@ export class DatepickerComponent extends InputsComponent {
61
68
  hours = signal(0);
62
69
  minutes = signal(0);
63
70
  seconds = signal(0);
71
+ // O idioma precisa ser um Signal: os nomes de mes e de dia sao `computed()`, e
72
+ // computed so recalcula quando um Signal que ele LE muda. Ler translate.currentLang
73
+ // direto deixaria os nomes congelados no idioma do primeiro render - o
74
+ // markForCheck do onLangChange (ver ngOnInit) redesenha, mas com o valor velho.
75
+ // Sem getDefaultLang() aqui: nem toda montagem do TranslateService expoe esse
76
+ // metodo (o mock do proprio spec deste componente nao expoe), e o fallback de
77
+ // idioma ja esta nos helpers de Intl mais abaixo.
78
+ currentLang = signal(this.translate.currentLang ?? '');
79
+ // Texto enquanto o usuario digita. Nao-nulo apenas durante a digitacao: enquanto
80
+ // existe, tem precedencia sobre displayValue() no campo, senao a formatacao
81
+ // reescreveria o texto no meio da digitacao a cada ciclo de deteccao.
82
+ typedText = signal(null);
64
83
  // Range selection state
65
84
  rangeStart = signal(null);
66
85
  rangeEnd = signal(null);
67
86
  rangeSelecting = signal(false);
68
87
  // --- Computed ---
69
88
  weekDayNames = computed(() => {
70
- const days = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];
89
+ const days = this.localizedWeekDayNames(this.currentLang());
71
90
  const shifted = [];
72
91
  for (let i = 0; i < DAYS_IN_WEEK; i++) {
73
92
  shifted.push(days[(i + this.firstDayOfWeek) % DAYS_IN_WEEK]);
@@ -124,7 +143,7 @@ export class DatepickerComponent extends InputsComponent {
124
143
  // NOTE: plain method for the same reason as `calendarDays` above (depends on `this.value`,
125
144
  // a non-Signal @Input).
126
145
  calendarMonths() {
127
- const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
146
+ const monthNames = this.localizedMonthNames(this.currentLang(), 'short');
128
147
  const viewD = this.viewDate();
129
148
  return monthNames.map((name, index) => ({
130
149
  month: index,
@@ -163,9 +182,12 @@ export class DatepickerComponent extends InputsComponent {
163
182
  }
164
183
  return '';
165
184
  }
185
+ // O que o campo mostra: o texto em digitacao, quando ha, senao o valor formatado.
186
+ inputValue() {
187
+ return this.typedText() ?? this.displayValue();
188
+ }
166
189
  viewMonthYearLabel = computed(() => {
167
- const monthNames = ['January', 'February', 'March', 'April', 'May', 'June',
168
- 'July', 'August', 'September', 'October', 'November', 'December'];
190
+ const monthNames = this.localizedMonthNames(this.currentLang(), 'long');
169
191
  const viewD = this.viewDate();
170
192
  if (this.currentView() === 'years') {
171
193
  const years = this.yearRange();
@@ -179,7 +201,8 @@ export class DatepickerComponent extends InputsComponent {
179
201
  // --- Lifecycle ---
180
202
  ngOnInit() {
181
203
  this.initializeViewDate();
182
- this.subscriptions.add(this.translate.onLangChange.subscribe(() => {
204
+ this.subscriptions.add(this.translate.onLangChange.subscribe((evento) => {
205
+ this.currentLang.set(evento.lang);
183
206
  this.cdr.markForCheck();
184
207
  }));
185
208
  }
@@ -250,6 +273,17 @@ export class DatepickerComponent extends InputsComponent {
250
273
  }
251
274
  }
252
275
  onInputClick() {
276
+ // Com digitacao ligada, clicar no campo quer dizer "vou escrever", nao "abra o
277
+ // calendario" - e o painel ainda cobriria o campo enquanto a pessoa digita. Aqui
278
+ // o calendario passa a ser so do botao ao lado.
279
+ //
280
+ // Preso ao allowTyping de proposito, e nao valendo pra todo mundo: abrir ao
281
+ // clicar e o comportamento que as telas que ja usam o componente esperam
282
+ // (showOnFocus e true por padrao), e mudar isso sem o opt-in seria quebrar quem
283
+ // nunca pediu digitacao.
284
+ if (this.allowTyping) {
285
+ return;
286
+ }
253
287
  if (this.showOnFocus && !this.disabled) {
254
288
  this.openPanel();
255
289
  }
@@ -690,6 +724,140 @@ export class DatepickerComponent extends InputsComponent {
690
724
  const firstCurrentMonthDay = days.find(d => d.currentMonth) ?? days[0];
691
725
  return firstCurrentMonthDay ? this.isSameDay(day.date, firstCurrentMonthDay.date) : false;
692
726
  }
727
+ onInputTyping(event) {
728
+ if (!this.allowTyping) {
729
+ return;
730
+ }
731
+ const input = event.target;
732
+ const text = this.applyDateMask(input, input.value);
733
+ this.typedText.set(text);
734
+ const parsed = this.parseTypedDate(text);
735
+ // So comita data completa e valida. Com o texto pela metade ("18/0") nao ha o
736
+ // que commitar, e tambem nao se apaga o que ja existia - limpar a cada tecla
737
+ // faria o calendario piscar durante a digitacao.
738
+ if (parsed) {
739
+ this.viewDate.set(new Date(parsed.getFullYear(), parsed.getMonth(), 1));
740
+ this.commitDateValue(parsed);
741
+ }
742
+ }
743
+ // Insere os separadores enquanto o usuario digita: 01102006 vira 01/10/2006, e
744
+ // yyyy-MM-dd produz 2006-10-01 a partir dos mesmos digitos. Quem dita a forma e o
745
+ // proprio dateFormat - nada de "/" escrito a mao aqui.
746
+ //
747
+ // Escreve direto no input, e nao so no signal: o texto que o usuario digitou ja
748
+ // esta no DOM, e sem reescrever o campo ficaria com os digitos crus ate o proximo
749
+ // ciclo de deteccao. Mexer no DOM tambem obriga a recolocar o cursor, senao ele
750
+ // pula pro fim a cada tecla - ver o calculo abaixo.
751
+ applyDateMask(input, raw) {
752
+ // So no modo 'date': datetime/time/range/month tem outras partes no formato, e
753
+ // mascarar por este caminho cortaria a hora.
754
+ if (this.mode !== 'date' || !this.dateFormatOrder()) {
755
+ return raw;
756
+ }
757
+ const caret = input.selectionStart ?? raw.length;
758
+ const digitsBeforeCaret = raw.slice(0, caret).replace(/\D/g, '').length;
759
+ const masked = this.maskByDateFormat(raw);
760
+ if (masked === raw) {
761
+ return raw;
762
+ }
763
+ input.value = masked;
764
+ // Recoloca o cursor DEPOIS do mesmo digito em que ele estava, contando digitos e
765
+ // nao posicoes - os separadores entram e saem conforme o texto cresce, entao a
766
+ // posicao crua nao se mantem entre um estado e outro.
767
+ let position = 0;
768
+ let seen = 0;
769
+ while (position < masked.length && seen < digitsBeforeCaret) {
770
+ if (/\d/.test(masked[position])) {
771
+ seen++;
772
+ }
773
+ position++;
774
+ }
775
+ input.setSelectionRange(position, position);
776
+ return masked;
777
+ }
778
+ // Percorre o dateFormat colocando um digito onde ha d/M/y e o literal onde ha
779
+ // separador. Para quando os digitos acabam, entao o separador so aparece junto do
780
+ // digito seguinte - digitar "01" mostra "01", e o "/" chega com o terceiro numero.
781
+ maskByDateFormat(raw) {
782
+ const format = this.dateFormat;
783
+ const maxDigits = (format.match(/[dMy]/g) ?? []).length;
784
+ const digits = raw.replace(/\D/g, '').slice(0, maxDigits);
785
+ let masked = '';
786
+ let index = 0;
787
+ for (const char of format) {
788
+ if (index >= digits.length) {
789
+ break;
790
+ }
791
+ masked += /[dMy]/.test(char) ? digits[index++] : char;
792
+ }
793
+ return masked;
794
+ }
795
+ // Ao sair do campo o texto em digitacao da lugar ao valor formatado. Texto invalido
796
+ // ou incompleto some: o campo volta ao ultimo valor valido, em vez de deixar na
797
+ // tela algo que o componente nao reconhece como data.
798
+ onInputBlur() {
799
+ this.typedText.set(null);
800
+ this.cdr.markForCheck();
801
+ }
802
+ // Le a data conforme o dateFormat configurado e valida o DOMINIO, nao so o formato:
803
+ // 32/13/2026 casa com "dd/MM/yyyy" e nao existe. O Date do JS aceita overflow em
804
+ // silencio (new Date(2026, 12, 32) vira 01/02/2027), entao a verificacao e de ida e
805
+ // volta: se o dia, o mes ou o ano mudaram, a entrada era invalida.
806
+ parseTypedDate(text) {
807
+ const order = this.dateFormatOrder();
808
+ const numbers = text.match(/\d+/g);
809
+ if (!order || !numbers || numbers.length < 3) {
810
+ return null;
811
+ }
812
+ // Ano de 2 digitos nao e aceito: "18/06/26" tanto pode ser 1926 quanto 2026, e
813
+ // adivinhar produz data errada sem o usuario perceber.
814
+ if (numbers[order.year].length !== 4) {
815
+ return null;
816
+ }
817
+ const day = Number(numbers[order.day]);
818
+ const month = Number(numbers[order.month]);
819
+ const year = Number(numbers[order.year]);
820
+ const parsed = new Date(year, month - 1, day);
821
+ const roundTripsBack = parsed.getDate() === day && parsed.getMonth() === month - 1 && parsed.getFullYear() === year;
822
+ return roundTripsBack ? parsed : null;
823
+ }
824
+ // Em que posicao dia, mes e ano aparecem no dateFormat configurado - o campo pode
825
+ // estar como dd/MM/yyyy, MM/dd/yyyy ou yyyy-MM-dd conforme o locale.
826
+ dateFormatOrder() {
827
+ const parts = [
828
+ { key: 'day', position: this.dateFormat.indexOf('dd') },
829
+ { key: 'month', position: this.dateFormat.indexOf('MM') },
830
+ { key: 'year', position: this.dateFormat.indexOf('yyyy') }
831
+ ];
832
+ if (parts.some((part) => part.position < 0)) {
833
+ return null;
834
+ }
835
+ const sorted = [...parts].sort((a, b) => a.position - b.position);
836
+ return {
837
+ day: sorted.findIndex((part) => part.key === 'day'),
838
+ month: sorted.findIndex((part) => part.key === 'month'),
839
+ year: sorted.findIndex((part) => part.key === 'year')
840
+ };
841
+ }
842
+ // Os nomes vinham fixos em ingles no codigo. Intl resolve pelo idioma ativo sem
843
+ // precisar de chave de traducao pra cada mes e cada dia - e e o mesmo caminho que
844
+ // o chat.component.ts ja usa na lib.
845
+ //
846
+ // O ano de referencia e arbitrario: so precisa de um domingo conhecido (2023-01-01)
847
+ // e de um dia 1 de cada mes.
848
+ localizedWeekDayNames(lang) {
849
+ const formatador = new Intl.DateTimeFormat(lang || 'pt', { weekday: 'short' });
850
+ return Array.from({ length: DAYS_IN_WEEK }, (_, day) => this.semPontoFinal(formatador.format(new Date(2023, 0, 1 + day))));
851
+ }
852
+ localizedMonthNames(lang, estilo) {
853
+ const formatador = new Intl.DateTimeFormat(lang || 'pt', { month: estilo });
854
+ return Array.from({ length: MONTHS_IN_YEAR }, (_, month) => this.semPontoFinal(formatador.format(new Date(2023, month, 1))));
855
+ }
856
+ // pt abrevia com ponto ("jan.", "dom."); no cabecalho do calendario o ponto so
857
+ // ocupa espaco numa coluna que ja e estreita.
858
+ semPontoFinal(text) {
859
+ return text.endsWith('.') ? text.slice(0, -1) : text;
860
+ }
693
861
  formatDate(date) {
694
862
  const d = date.getDate().toString().padStart(2, '0');
695
863
  const m = (date.getMonth() + 1).toString().padStart(2, '0');
@@ -720,7 +888,7 @@ export class DatepickerComponent extends InputsComponent {
720
888
  return n.toString().padStart(2, '0');
721
889
  }
722
890
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DatepickerComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
723
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DatepickerComponent, isStandalone: true, selector: "sdc-datepicker", inputs: { mode: "mode", selectionMode: "selectionMode", showIcon: "showIcon", icon: "icon", min: "min", max: "max", defaultDate: "defaultDate", dateFormat: "dateFormat", hourFormat: "hourFormat", minuteStep: "minuteStep", showSeconds: "showSeconds", rangeSeparator: "rangeSeparator", showOnFocus: "showOnFocus", readonlyInput: "readonlyInput", firstDayOfWeek: "firstDayOfWeek", showButtonBar: "showButtonBar", showClear: "showClear", disabledDates: "disabledDates", disabledDays: "disabledDays" }, outputs: { selected: "selected", closed: "closed", monthChange: "monthChange", yearChange: "yearChange" }, providers: [
891
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DatepickerComponent, isStandalone: true, selector: "sdc-datepicker", inputs: { mode: "mode", selectionMode: "selectionMode", showIcon: "showIcon", icon: "icon", min: "min", max: "max", defaultDate: "defaultDate", dateFormat: "dateFormat", allowTyping: "allowTyping", hourFormat: "hourFormat", minuteStep: "minuteStep", showSeconds: "showSeconds", rangeSeparator: "rangeSeparator", showOnFocus: "showOnFocus", readonlyInput: "readonlyInput", firstDayOfWeek: "firstDayOfWeek", showButtonBar: "showButtonBar", showClear: "showClear", disabledDates: "disabledDates", disabledDays: "disabledDays" }, outputs: { selected: "selected", closed: "closed", monthChange: "monthChange", yearChange: "yearChange" }, providers: [
724
892
  {
725
893
  provide: NG_VALUE_ACCESSOR,
726
894
  useExisting: forwardRef(() => DatepickerComponent),
@@ -731,7 +899,7 @@ export class DatepickerComponent extends InputsComponent {
731
899
  useExisting: forwardRef(() => DatepickerComponent),
732
900
  multi: true
733
901
  }
734
- ], viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["inputRef"], descendants: true }, { propertyName: "triggerRef", first: true, predicate: ["triggerRef"], descendants: true }, { propertyName: "panelContentRef", first: true, predicate: ["panelContentRef"], descendants: true }, { propertyName: "dayButtonRefs", predicate: ["dayBtn"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"sdc-datepicker\">\n @if (labelKey()) {\n <div class=\"sdc-datepicker__label-row\">\n <label class=\"sdc-datepicker__label\" [attr.for]=\"inputId\">\n <span class=\"sdc-datepicker__label-text\">\n {{ labelKey() | translate }}\n @if (required) {\n <span class=\"required-field\" aria-hidden=\"true\">*</span>\n }\n </span>\n </label>\n </div>\n }\n\n <sdc-popover\n [open]=\"panelOpen\"\n [toggleOnTriggerClick]=\"false\"\n [closeOnOutsideClick]=\"true\"\n [closeOnEscape]=\"true\"\n [matchTriggerWidth]=\"false\"\n [restoreFocusOnClose]=\"false\"\n [trapFocus]=\"true\"\n [ariaLabel]=\"'datepicker.calendar'\"\n panelClass=\"sdc-datepicker-popover-panel\"\n (openChange)=\"onPopoverOpenChange($event)\"\n >\n <div sdc-popover-trigger>\n <div\n class=\"sdc-datepicker__control\"\n #triggerRef\n [class.sdc-datepicker__control--invalid]=\"invalid\"\n [class.sdc-datepicker__control--disabled]=\"disabled\"\n [ngStyle]=\"getInputStyle()\"\n >\n <div class=\"sdc-datepicker__value\">\n <input\n #inputRef\n [id]=\"inputId\"\n class=\"sdc-datepicker__input\"\n type=\"text\"\n [disabled]=\"disabled\"\n [readOnly]=\"readonlyInput\"\n [placeholder]=\"placeholder || dateFormat\"\n [value]=\"displayValue()\"\n [attr.aria-label]=\"labelKey() ? (labelKey() | translate) : placeholder\"\n [attr.aria-expanded]=\"panelOpen\"\n [attr.aria-haspopup]=\"'dialog'\"\n aria-autocomplete=\"none\"\n autocomplete=\"off\"\n (click)=\"onInputClick()\"\n (focus)=\"onInputFocus()\"\n (keydown)=\"onKeydown($event)\"\n />\n </div>\n\n <div class=\"sdc-datepicker__actions\">\n @if (showClear && value) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__icon-button sdc-datepicker__icon-button--clear\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"'datepicker.clear' | translate\"\n (click)=\"clearValue(); $event.stopPropagation()\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n }\n @if (showIcon) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__icon-button sdc-datepicker__icon-button--toggle\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"'datepicker.calendar' | translate\"\n [attr.aria-expanded]=\"panelOpen\"\n (click)=\"togglePanel(); $event.stopPropagation()\"\n >\n <i [class]=\"icon\" class=\"sdc-datepicker__icon\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </div>\n </div>\n\n <div sdc-popover-content>\n <div\n #panelContentRef\n class=\"sdc-datepicker__panel\"\n (keydown)=\"onOverlayKeydown($event)\"\n [attr.aria-label]=\"'datepicker.calendar' | translate\"\n >\n <!-- Navigation Header -->\n @if (mode !== 'time') {\n <div class=\"sdc-datepicker__header\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__nav-btn\"\n [attr.aria-label]=\"'datepicker.prev' | translate\"\n (click)=\"currentView() === 'days' ? prevMonth() : currentView() === 'months' ? prevYear() : prevYearRange()\"\n >\n <i class=\"fas fa-chevron-left\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n type=\"button\"\n class=\"sdc-datepicker__title-btn\"\n (click)=\"\n currentView() === 'days'\n ? switchToMonthView()\n : currentView() === 'months' ? switchToYearView() : null\n \"\n >\n {{ viewMonthYearLabel() }}\n </button>\n\n <button\n type=\"button\"\n class=\"sdc-datepicker__nav-btn\"\n [attr.aria-label]=\"'datepicker.next' | translate\"\n (click)=\"currentView() === 'days' ? nextMonth() : currentView() === 'months' ? nextYear() : nextYearRange()\"\n >\n <i class=\"fas fa-chevron-right\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n\n <!-- Days View -->\n @if (currentView() === 'days' && mode !== 'time') {\n <table class=\"sdc-datepicker__calendar\">\n <thead>\n <tr class=\"sdc-datepicker__weekdays\">\n @for (dayName of weekDayNames(); track dayName) {\n <th class=\"sdc-datepicker__weekday\" scope=\"col\">\n {{ dayName }}\n </th>\n }\n </tr>\n </thead>\n <tbody class=\"sdc-datepicker__days\" (keydown)=\"onDaysGridKeydown($event)\">\n @for (week of calendarWeeks(); track $index) {\n <tr>\n @for (day of week; track day.date.getTime()) {\n <td>\n <button\n #dayBtn\n type=\"button\"\n class=\"sdc-datepicker__day\"\n [class.sdc-datepicker__day--other-month]=\"!day.currentMonth\"\n [class.sdc-datepicker__day--today]=\"day.today\"\n [class.sdc-datepicker__day--selected]=\"day.selected\"\n [class.sdc-datepicker__day--disabled]=\"day.disabled\"\n [class.sdc-datepicker__day--in-range]=\"day.inRange\"\n [class.sdc-datepicker__day--range-start]=\"day.rangeStart\"\n [class.sdc-datepicker__day--range-end]=\"day.rangeEnd\"\n [disabled]=\"day.disabled\"\n [attr.aria-label]=\"day.date.toLocaleDateString()\"\n [attr.aria-selected]=\"day.selected\"\n [attr.aria-disabled]=\"day.disabled\"\n [attr.tabindex]=\"isDayTabStop(day) ? 0 : -1\"\n (click)=\"selectDay(day)\"\n >\n {{ day.day }}\n </button>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n\n <!-- Months View -->\n @if (currentView() === 'months') {\n <div class=\"sdc-datepicker__months-grid\">\n @for (m of calendarMonths(); track m.month) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__month-cell\"\n [class.sdc-datepicker__month-cell--selected]=\"m.selected\"\n (click)=\"selectMonth(m.month)\"\n >\n {{ m.name }}\n </button>\n }\n </div>\n }\n\n <!-- Years View -->\n @if (currentView() === 'years') {\n <div class=\"sdc-datepicker__years-grid\">\n @for (year of yearRange(); track year) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__year-cell\"\n [class.sdc-datepicker__year-cell--selected]=\"year === viewDate().getFullYear()\"\n (click)=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n }\n </div>\n }\n\n <!-- Time Picker -->\n @if (showTimePicker()) {\n <div class=\"sdc-datepicker__time\">\n <div class=\"sdc-datepicker__time-group\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"incrementHours()\"\n [attr.aria-label]=\"'datepicker.incrementHour' | translate\"\n >\n <i class=\"fas fa-chevron-up\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"sdc-datepicker__time-value\">{{ padTime(hours()) }}</span>\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"decrementHours()\"\n [attr.aria-label]=\"'datepicker.decrementHour' | translate\"\n >\n <i class=\"fas fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <span class=\"sdc-datepicker__time-separator\">:</span>\n\n <div class=\"sdc-datepicker__time-group\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"incrementMinutes()\"\n [attr.aria-label]=\"'datepicker.incrementMinute' | translate\"\n >\n <i class=\"fas fa-chevron-up\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"sdc-datepicker__time-value\">{{ padTime(minutes()) }}</span>\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"decrementMinutes()\"\n [attr.aria-label]=\"'datepicker.decrementMinute' | translate\"\n >\n <i class=\"fas fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n @if (showSeconds) {\n <span class=\"sdc-datepicker__time-separator\">:</span>\n <div class=\"sdc-datepicker__time-group\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"incrementSeconds()\"\n [attr.aria-label]=\"'datepicker.incrementSecond' | translate\"\n >\n <i class=\"fas fa-chevron-up\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"sdc-datepicker__time-value\">{{ padTime(seconds()) }}</span>\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"decrementSeconds()\"\n [attr.aria-label]=\"'datepicker.decrementSecond' | translate\"\n >\n <i class=\"fas fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n </div>\n\n }\n\n <!-- Footer: Today on the left, Clear + Confirm together on the right -->\n @if (showButtonBar || mode === 'datetime' || mode === 'time') {\n <div class=\"sdc-datepicker__button-bar\">\n <div>\n @if (showButtonBar && mode !== 'time') {\n <button\n type=\"button\"\n class=\"sdc-datepicker__bar-btn\"\n (click)=\"selectToday()\"\n >\n {{ 'datepicker.today' | translate }}\n </button>\n }\n </div>\n\n <div class=\"sdc-datepicker__button-bar-end\">\n @if (showButtonBar) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__bar-btn\"\n (click)=\"clearValue()\"\n >\n {{ 'datepicker.clear' | translate }}\n </button>\n }\n @if (mode === 'datetime' || mode === 'time') {\n <button\n type=\"button\"\n class=\"sdc-datepicker__confirm-btn\"\n (click)=\"confirmDateTime()\"\n >\n {{ 'datepicker.confirm' | translate }}\n </button>\n }\n </div>\n </div>\n }\n </div>\n </div>\n </sdc-popover>\n\n @if (messageKey()) {\n <small\n [ngClass]=\"getInvalidMessageClass()\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {{ messageKey() | translate }}\n </small>\n }\n</div>\n", styles: [":host{display:block}.sdc-datepicker__label-row{display:flex;align-items:center;gap:var(--sdc-form-label-row-gap);margin-bottom:var(--sdc-form-label-row-mb)}.sdc-datepicker__label{display:inline-flex;align-items:center;margin-bottom:0;line-height:1;padding-top:var(--sdc-datepicker-label-py, var(--sdc-form-label-py, 0));padding-bottom:var(--sdc-datepicker-label-py, var(--sdc-form-label-py, 0));min-width:0}.sdc-datepicker__label-text{display:inline-flex;align-items:center}.required-field{margin-left:var(--sdc-datepicker-required-ml, var(--sdc-form-required-ml, .25rem));color:var(--sdc-datepicker-required-color, var(--sdc-error-color, #dc3545));font-weight:400}.sdc-datepicker__control{display:flex;align-items:stretch;min-height:var(--sdc-datepicker-control-height, var(--sdc-formfield-default-height, 38px));border:1px solid var(--sdc-datepicker-border-color, var(--sdc-formfield-default-border, #ced4da));border-radius:var(--sdc-datepicker-border-radius, var(--sdc-formfield-border-radius, 4px));background:var(--sdc-datepicker-bg, var(--sdc-formfield-default-bg, #fff));box-sizing:border-box;cursor:pointer;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.sdc-datepicker__control:hover{border-color:var(--sdc-datepicker-hover-border, var(--sdc-formfield-focus-color, #007bff))}.sdc-datepicker__control:focus-within{border-color:var(--sdc-datepicker-focus-border, var(--sdc-formfield-focus-color, #007bff));box-shadow:var(--sdc-datepicker-focus-shadow, var(--sdc-formfield-focus-shadow, 0 0 0 2px rgba(0, 123, 255, .14)))}.sdc-datepicker__control--invalid,.sdc-datepicker__control--invalid:hover,.sdc-datepicker__control--invalid:focus-within{border-color:var(--sdc-datepicker-invalid-border, var(--sdc-formfield-invalid-border, #d98888));box-shadow:var(--sdc-datepicker-invalid-shadow, var(--sdc-formfield-invalid-focus-shadow, 0 0 0 2px rgba(217, 136, 136, .16)))}.sdc-datepicker__control--disabled,.sdc-datepicker__control--disabled:hover{background-color:var(--sdc-datepicker-disabled-bg, var(--sdc-formfield-disabled-bg, #e9ecef));border-color:var(--sdc-datepicker-border-color, var(--sdc-formfield-default-border, #ced4da));box-shadow:none;cursor:not-allowed}.sdc-datepicker__value{display:flex;align-items:center;flex:1 1 auto;min-width:0;padding:0 .75rem}.sdc-datepicker__input{width:100%;min-width:0;border:0;background:transparent;box-shadow:none;outline:0;font:inherit;color:inherit;line-height:var(--sdc-datepicker-input-line-height, var(--sdc-formfield-default-line-height, 1.5));padding:0;cursor:pointer}.sdc-datepicker__input::placeholder{color:var(--sdc-datepicker-placeholder-color, var(--sdc-form-placeholder-color, #9ca3af))}.sdc-datepicker__input:disabled{cursor:not-allowed}.sdc-datepicker__actions{display:flex;align-items:stretch;flex:0 0 auto}.sdc-datepicker__icon{font-size:.875rem}.sdc-datepicker__icon-button{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;border:0;background:transparent;color:var(--sdc-button-icon-default, #333333);cursor:pointer}.sdc-datepicker__icon-button:hover:not(:disabled){background:transparent}.sdc-datepicker__icon-button--clear{min-width:2rem;padding:0 .5rem}.sdc-datepicker__icon-button--toggle{min-width:2.5rem;padding:0 .75rem;border-left:1px solid var(--sdc-formfield-default-border, #ced4da)}.sdc-datepicker__panel{background:var(--sdc-datepicker-panel-bg, #fff);border:1px solid var(--sdc-datepicker-panel-border, #e5e7eb);border-radius:var(--sdc-datepicker-panel-radius, 6px);box-shadow:var(--sdc-datepicker-panel-shadow, 0 4px 12px rgba(0, 0, 0, .1));padding:0;width:var(--sdc-datepicker-panel-width, 280px);outline:none;box-sizing:border-box}.sdc-datepicker__header{display:flex;align-items:center;justify-content:space-between;padding:.5rem .75rem;border-bottom:1px solid var(--sdc-datepicker-separator-color, #e5e7eb)}.sdc-datepicker__nav-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:0;background:transparent;border-radius:var(--sdc-datepicker-nav-btn-radius, 50%);color:var(--sdc-datepicker-nav-btn-color, #374151);cursor:pointer;transition:background-color .15s ease}.sdc-datepicker__nav-btn:hover{background-color:var(--sdc-datepicker-nav-btn-hover-bg, rgba(0, 0, 0, .06))}.sdc-datepicker__title-btn{border:0;background:transparent;font-weight:600;font-size:var(--sdc-datepicker-title-font-size, .875rem);color:var(--sdc-datepicker-title-color, #111827);cursor:pointer;padding:.25rem .5rem;border-radius:4px;transition:background-color .15s ease}.sdc-datepicker__title-btn:hover{background-color:var(--sdc-datepicker-title-hover-bg, rgba(0, 0, 0, .04))}.sdc-datepicker__calendar{-webkit-user-select:none;user-select:none;padding:0 .5rem .5rem;border-collapse:collapse;border-spacing:0;width:100%}.sdc-datepicker__weekdays{display:grid;grid-template-columns:repeat(7,1fr);padding-top:.5rem}.sdc-datepicker__weekday{display:flex;align-items:center;justify-content:center;height:32px;font-size:var(--sdc-datepicker-weekday-font-size, .75rem);font-weight:600;color:var(--sdc-datepicker-weekday-color, #6b7280);text-transform:uppercase}.sdc-datepicker__days{display:grid;grid-template-columns:repeat(7,1fr);gap:var(--sdc-datepicker-day-gap, 2px)}.sdc-datepicker__days>tr{display:contents}.sdc-datepicker__days td{padding:0}.sdc-datepicker__day{display:flex;align-items:center;justify-content:center;width:var(--sdc-datepicker-day-size, 32px);height:var(--sdc-datepicker-day-size, 32px);margin:0 auto;border:0;border-radius:var(--sdc-datepicker-day-radius, 50%);background:transparent;font-size:var(--sdc-datepicker-day-font-size, .75rem);color:var(--sdc-datepicker-day-color, #111827);cursor:pointer;transition:background-color .12s ease,color .12s ease;position:relative;padding:0}.sdc-datepicker__day:hover:not(:disabled):not(.sdc-datepicker__day--selected){background-color:var(--sdc-datepicker-day-hover-bg, rgba(0, 0, 0, .06))}.sdc-datepicker__day--other-month{color:var(--sdc-datepicker-day-other-month-color, #d1d5db)}.sdc-datepicker__day--today{border:2px solid var(--sdc-datepicker-today-border-color, var(--sdc-tab-primary, #007bff))}.sdc-datepicker__day--selected{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);font-weight:600}.sdc-datepicker__day--selected:hover{background-color:var(--sdc-datepicker-selected-hover-bg, #0056b3)}.sdc-datepicker__day--disabled{opacity:var(--sdc-datepicker-disabled-opacity, .35);cursor:not-allowed}.sdc-datepicker__day--in-range{background-color:var(--sdc-datepicker-range-bg, rgba(0, 123, 255, .1));border-radius:0}.sdc-datepicker__day--range-start{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);border-radius:var(--sdc-datepicker-day-radius, 50%) 0 0 var(--sdc-datepicker-day-radius, 50%)}.sdc-datepicker__day--range-end{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);border-radius:0 var(--sdc-datepicker-day-radius, 50%) var(--sdc-datepicker-day-radius, 50%) 0}.sdc-datepicker__months-grid,.sdc-datepicker__years-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:.5rem;padding:.75rem}.sdc-datepicker__month-cell,.sdc-datepicker__year-cell{display:flex;align-items:center;justify-content:center;padding:.625rem .5rem;border:0;border-radius:var(--sdc-datepicker-cell-radius, 6px);background:transparent;font-size:.8125rem;color:var(--sdc-datepicker-cell-color, #374151);cursor:pointer;transition:background-color .12s ease}.sdc-datepicker__month-cell:hover,.sdc-datepicker__year-cell:hover{background-color:var(--sdc-datepicker-cell-hover-bg, rgba(0, 0, 0, .05))}.sdc-datepicker__month-cell--selected,.sdc-datepicker__year-cell--selected{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);font-weight:600}.sdc-datepicker__time{display:flex;align-items:center;justify-content:center;gap:.25rem;padding:.75rem;border-top:1px solid var(--sdc-datepicker-separator-color, #e5e7eb)}.sdc-datepicker__time-group{display:flex;flex-direction:column;align-items:center;gap:.125rem}.sdc-datepicker__time-btn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:24px;border:0;background:transparent;border-radius:4px;color:var(--sdc-datepicker-time-btn-color, #6b7280);cursor:pointer;transition:background-color .12s ease}.sdc-datepicker__time-btn:hover{background-color:var(--sdc-datepicker-time-btn-hover-bg, rgba(0, 0, 0, .06))}.sdc-datepicker__time-value{font-size:var(--sdc-datepicker-time-font-size, 1.125rem);font-weight:600;color:var(--sdc-datepicker-time-value-color, #111827);min-width:2ch;text-align:center}.sdc-datepicker__time-separator{font-size:1.125rem;font-weight:600;color:var(--sdc-datepicker-time-separator-color, #6b7280);padding:0 .125rem;align-self:center}.sdc-datepicker__confirm-btn{padding:.25rem .875rem;border:0;border-radius:var(--sdc-datepicker-confirm-btn-radius, 4px);background-color:var(--sdc-datepicker-confirm-btn-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-confirm-btn-color, #fff);font-size:.8125rem;font-weight:600;cursor:pointer;transition:background-color .15s ease}.sdc-datepicker__confirm-btn:hover{background-color:var(--sdc-datepicker-confirm-btn-hover-bg, #0056b3)}.sdc-datepicker__button-bar{display:flex;align-items:center;justify-content:space-between;padding:.5rem .75rem;border-top:1px solid var(--sdc-datepicker-separator-color, #e5e7eb)}.sdc-datepicker__button-bar-end{display:flex;align-items:center;gap:.5rem}.sdc-datepicker__bar-btn{padding:.25rem .75rem;border:0;border-radius:4px;background:transparent;font-size:.8125rem;font-weight:500;color:var(--sdc-datepicker-bar-btn-color, var(--sdc-tab-primary, #007bff));cursor:pointer;transition:background-color .12s ease}.sdc-datepicker__bar-btn:hover{background-color:var(--sdc-datepicker-bar-btn-hover-bg, rgba(0, 123, 255, .08))}.sdc-datepicker__backdrop{background:transparent}.message{display:block;margin-top:.25rem;font-size:var(--sdc-datepicker-message-font-size, .75rem);color:var(--sdc-datepicker-message-color, #6b7280)}.message.invalid{color:var(--sdc-datepicker-message-invalid-color, var(--sdc-error-color, #dc3545))}::ng-deep .sdc-datepicker-popover-panel{overflow:visible!important;max-width:none!important;max-height:none!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "component", type: PopoverComponent, selector: "sdc-popover", inputs: ["open", "disabled", "toggleOnTriggerClick", "closeOnOutsideClick", "closeOnScroll", "closeOnEscape", "trapFocus", "focusOnOpen", "restoreFocusOnClose", "ariaLabel", "appendTo", "zIndex", "offset", "placement", "role", "matchTriggerWidth", "panelWidth", "panelMinWidth", "panelMaxWidth", "panelMaxHeight", "panelClass"], outputs: ["openChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
902
+ ], viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["inputRef"], descendants: true }, { propertyName: "triggerRef", first: true, predicate: ["triggerRef"], descendants: true }, { propertyName: "panelContentRef", first: true, predicate: ["panelContentRef"], descendants: true }, { propertyName: "dayButtonRefs", predicate: ["dayBtn"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"sdc-datepicker\">\n @if (labelKey()) {\n <div class=\"sdc-datepicker__label-row\">\n <label class=\"sdc-datepicker__label\" [attr.for]=\"inputId\">\n <span class=\"sdc-datepicker__label-text\">\n {{ labelKey() | translate }}\n @if (required) {\n <span class=\"required-field\" aria-hidden=\"true\">*</span>\n }\n </span>\n </label>\n </div>\n }\n\n <sdc-popover\n [open]=\"panelOpen\"\n [toggleOnTriggerClick]=\"false\"\n [closeOnOutsideClick]=\"true\"\n [closeOnEscape]=\"true\"\n [matchTriggerWidth]=\"false\"\n [restoreFocusOnClose]=\"false\"\n [trapFocus]=\"true\"\n [ariaLabel]=\"'datepicker.calendar'\"\n panelClass=\"sdc-datepicker-popover-panel\"\n (openChange)=\"onPopoverOpenChange($event)\"\n >\n <div sdc-popover-trigger>\n <div\n class=\"sdc-datepicker__control\"\n #triggerRef\n [class.sdc-datepicker__control--invalid]=\"invalid\"\n [class.sdc-datepicker__control--disabled]=\"disabled\"\n [ngStyle]=\"getInputStyle()\"\n >\n <div class=\"sdc-datepicker__value\">\n <input\n #inputRef\n [id]=\"inputId\"\n class=\"sdc-datepicker__input\"\n type=\"text\"\n [disabled]=\"disabled\"\n [readOnly]=\"readonlyInput && !allowTyping\"\n [placeholder]=\"placeholder || dateFormat\"\n [value]=\"inputValue()\"\n [attr.aria-label]=\"labelKey() ? (labelKey() | translate) : placeholder\"\n [attr.aria-expanded]=\"panelOpen\"\n [attr.aria-haspopup]=\"'dialog'\"\n aria-autocomplete=\"none\"\n autocomplete=\"off\"\n (click)=\"onInputClick()\"\n (focus)=\"onInputFocus()\"\n (input)=\"onInputTyping($event)\"\n (blur)=\"onInputBlur()\"\n (keydown)=\"onKeydown($event)\"\n />\n </div>\n\n <div class=\"sdc-datepicker__actions\">\n @if (showClear && value) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__icon-button sdc-datepicker__icon-button--clear\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"'datepicker.clear' | translate\"\n (click)=\"clearValue(); $event.stopPropagation()\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n }\n @if (showIcon) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__icon-button sdc-datepicker__icon-button--toggle\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"'datepicker.calendar' | translate\"\n [attr.aria-expanded]=\"panelOpen\"\n (click)=\"togglePanel(); $event.stopPropagation()\"\n >\n <i [class]=\"icon\" class=\"sdc-datepicker__icon\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </div>\n </div>\n\n <div sdc-popover-content>\n <div\n #panelContentRef\n class=\"sdc-datepicker__panel\"\n (keydown)=\"onOverlayKeydown($event)\"\n [attr.aria-label]=\"'datepicker.calendar' | translate\"\n >\n <!-- Navigation Header -->\n @if (mode !== 'time') {\n <div class=\"sdc-datepicker__header\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__nav-btn\"\n [attr.aria-label]=\"'datepicker.prev' | translate\"\n (click)=\"currentView() === 'days' ? prevMonth() : currentView() === 'months' ? prevYear() : prevYearRange()\"\n >\n <i class=\"fas fa-chevron-left\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n type=\"button\"\n class=\"sdc-datepicker__title-btn\"\n (click)=\"\n currentView() === 'days'\n ? switchToMonthView()\n : currentView() === 'months' ? switchToYearView() : null\n \"\n >\n {{ viewMonthYearLabel() }}\n </button>\n\n <button\n type=\"button\"\n class=\"sdc-datepicker__nav-btn\"\n [attr.aria-label]=\"'datepicker.next' | translate\"\n (click)=\"currentView() === 'days' ? nextMonth() : currentView() === 'months' ? nextYear() : nextYearRange()\"\n >\n <i class=\"fas fa-chevron-right\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n\n <!-- Days View -->\n @if (currentView() === 'days' && mode !== 'time') {\n <table class=\"sdc-datepicker__calendar\">\n <thead>\n <tr class=\"sdc-datepicker__weekdays\">\n @for (dayName of weekDayNames(); track dayName) {\n <th class=\"sdc-datepicker__weekday\" scope=\"col\">\n {{ dayName }}\n </th>\n }\n </tr>\n </thead>\n <tbody class=\"sdc-datepicker__days\" (keydown)=\"onDaysGridKeydown($event)\">\n @for (week of calendarWeeks(); track $index) {\n <tr>\n @for (day of week; track day.date.getTime()) {\n <td>\n <button\n #dayBtn\n type=\"button\"\n class=\"sdc-datepicker__day\"\n [class.sdc-datepicker__day--other-month]=\"!day.currentMonth\"\n [class.sdc-datepicker__day--today]=\"day.today\"\n [class.sdc-datepicker__day--selected]=\"day.selected\"\n [class.sdc-datepicker__day--disabled]=\"day.disabled\"\n [class.sdc-datepicker__day--in-range]=\"day.inRange\"\n [class.sdc-datepicker__day--range-start]=\"day.rangeStart\"\n [class.sdc-datepicker__day--range-end]=\"day.rangeEnd\"\n [disabled]=\"day.disabled\"\n [attr.aria-label]=\"day.date.toLocaleDateString()\"\n [attr.aria-selected]=\"day.selected\"\n [attr.aria-disabled]=\"day.disabled\"\n [attr.tabindex]=\"isDayTabStop(day) ? 0 : -1\"\n (click)=\"selectDay(day)\"\n >\n {{ day.day }}\n </button>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n\n <!-- Months View -->\n @if (currentView() === 'months') {\n <div class=\"sdc-datepicker__months-grid\">\n @for (m of calendarMonths(); track m.month) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__month-cell\"\n [class.sdc-datepicker__month-cell--selected]=\"m.selected\"\n (click)=\"selectMonth(m.month)\"\n >\n {{ m.name }}\n </button>\n }\n </div>\n }\n\n <!-- Years View -->\n @if (currentView() === 'years') {\n <div class=\"sdc-datepicker__years-grid\">\n @for (year of yearRange(); track year) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__year-cell\"\n [class.sdc-datepicker__year-cell--selected]=\"year === viewDate().getFullYear()\"\n (click)=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n }\n </div>\n }\n\n <!-- Time Picker -->\n @if (showTimePicker()) {\n <div class=\"sdc-datepicker__time\">\n <div class=\"sdc-datepicker__time-group\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"incrementHours()\"\n [attr.aria-label]=\"'datepicker.incrementHour' | translate\"\n >\n <i class=\"fas fa-chevron-up\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"sdc-datepicker__time-value\">{{ padTime(hours()) }}</span>\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"decrementHours()\"\n [attr.aria-label]=\"'datepicker.decrementHour' | translate\"\n >\n <i class=\"fas fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <span class=\"sdc-datepicker__time-separator\">:</span>\n\n <div class=\"sdc-datepicker__time-group\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"incrementMinutes()\"\n [attr.aria-label]=\"'datepicker.incrementMinute' | translate\"\n >\n <i class=\"fas fa-chevron-up\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"sdc-datepicker__time-value\">{{ padTime(minutes()) }}</span>\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"decrementMinutes()\"\n [attr.aria-label]=\"'datepicker.decrementMinute' | translate\"\n >\n <i class=\"fas fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n @if (showSeconds) {\n <span class=\"sdc-datepicker__time-separator\">:</span>\n <div class=\"sdc-datepicker__time-group\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"incrementSeconds()\"\n [attr.aria-label]=\"'datepicker.incrementSecond' | translate\"\n >\n <i class=\"fas fa-chevron-up\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"sdc-datepicker__time-value\">{{ padTime(seconds()) }}</span>\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"decrementSeconds()\"\n [attr.aria-label]=\"'datepicker.decrementSecond' | translate\"\n >\n <i class=\"fas fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n </div>\n\n }\n\n <!-- Footer: Today on the left, Clear + Confirm together on the right -->\n @if (showButtonBar || mode === 'datetime' || mode === 'time') {\n <div class=\"sdc-datepicker__button-bar\">\n <div>\n @if (showButtonBar && mode !== 'time') {\n <button\n type=\"button\"\n class=\"sdc-datepicker__bar-btn\"\n (click)=\"selectToday()\"\n >\n {{ 'datepicker.today' | translate }}\n </button>\n }\n </div>\n\n <div class=\"sdc-datepicker__button-bar-end\">\n @if (showButtonBar) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__bar-btn\"\n (click)=\"clearValue()\"\n >\n {{ 'datepicker.clear' | translate }}\n </button>\n }\n @if (mode === 'datetime' || mode === 'time') {\n <button\n type=\"button\"\n class=\"sdc-datepicker__confirm-btn\"\n (click)=\"confirmDateTime()\"\n >\n {{ 'datepicker.confirm' | translate }}\n </button>\n }\n </div>\n </div>\n }\n </div>\n </div>\n </sdc-popover>\n\n @if (messageKey()) {\n <small\n [ngClass]=\"getInvalidMessageClass()\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {{ messageKey() | translate }}\n </small>\n }\n</div>\n", styles: [":host{display:block}.sdc-datepicker__label-row{display:flex;align-items:center;gap:var(--sdc-form-label-row-gap);margin-bottom:var(--sdc-form-label-row-mb)}.sdc-datepicker__label{display:inline-flex;align-items:center;margin-bottom:0;line-height:1;padding-top:var(--sdc-datepicker-label-py, var(--sdc-form-label-py, 0));padding-bottom:var(--sdc-datepicker-label-py, var(--sdc-form-label-py, 0));min-width:0}.sdc-datepicker__label-text{display:inline-flex;align-items:center}.required-field{margin-left:var(--sdc-datepicker-required-ml, var(--sdc-form-required-ml, .25rem));color:var(--sdc-datepicker-required-color, var(--sdc-error-color, #dc3545));font-weight:400}.sdc-datepicker__control{display:flex;align-items:stretch;min-height:var(--sdc-datepicker-control-height, var(--sdc-formfield-default-height, 38px));border:1px solid var(--sdc-datepicker-border-color, var(--sdc-formfield-default-border, #ced4da));border-radius:var(--sdc-datepicker-border-radius, var(--sdc-formfield-border-radius, 4px));background:var(--sdc-datepicker-bg, var(--sdc-formfield-default-bg, #fff));box-sizing:border-box;cursor:pointer;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.sdc-datepicker__control:hover{border-color:var(--sdc-datepicker-hover-border, var(--sdc-formfield-focus-color, #007bff))}.sdc-datepicker__control:focus-within{border-color:var(--sdc-datepicker-focus-border, var(--sdc-formfield-focus-color, #007bff));box-shadow:var(--sdc-datepicker-focus-shadow, var(--sdc-formfield-focus-shadow, 0 0 0 2px rgba(0, 123, 255, .14)))}.sdc-datepicker__control--invalid,.sdc-datepicker__control--invalid:hover,.sdc-datepicker__control--invalid:focus-within{border-color:var(--sdc-datepicker-invalid-border, var(--sdc-formfield-invalid-border, #d98888));box-shadow:var(--sdc-datepicker-invalid-shadow, var(--sdc-formfield-invalid-focus-shadow, 0 0 0 2px rgba(217, 136, 136, .16)))}.sdc-datepicker__control--disabled,.sdc-datepicker__control--disabled:hover{background-color:var(--sdc-datepicker-disabled-bg, var(--sdc-formfield-disabled-bg, #e9ecef));border-color:var(--sdc-datepicker-border-color, var(--sdc-formfield-default-border, #ced4da));box-shadow:none;cursor:not-allowed}.sdc-datepicker__value{display:flex;align-items:center;flex:1 1 auto;min-width:0;padding:0 .75rem}.sdc-datepicker__input{width:100%;min-width:0;border:0;background:transparent;box-shadow:none;outline:0;font:inherit;color:inherit;line-height:var(--sdc-datepicker-input-line-height, var(--sdc-formfield-default-line-height, 1.5));padding:0;cursor:pointer}.sdc-datepicker__input::placeholder{color:var(--sdc-datepicker-placeholder-color, var(--sdc-form-placeholder-color, #9ca3af))}.sdc-datepicker__input:disabled{cursor:not-allowed}.sdc-datepicker__actions{display:flex;align-items:stretch;flex:0 0 auto}.sdc-datepicker__icon{font-size:.875rem}.sdc-datepicker__icon-button{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;border:0;background:transparent;color:var(--sdc-button-icon-default, #333333);cursor:pointer}.sdc-datepicker__icon-button:hover:not(:disabled){background:transparent}.sdc-datepicker__icon-button--clear{min-width:2rem;padding:0 .5rem}.sdc-datepicker__icon-button--toggle{min-width:2.5rem;padding:0 .75rem;border-left:1px solid var(--sdc-formfield-default-border, #ced4da)}.sdc-datepicker__panel{background:var(--sdc-datepicker-panel-bg, #fff);border:1px solid var(--sdc-datepicker-panel-border, #e5e7eb);border-radius:var(--sdc-datepicker-panel-radius, 6px);box-shadow:var(--sdc-datepicker-panel-shadow, 0 4px 12px rgba(0, 0, 0, .1));padding:0;width:var(--sdc-datepicker-panel-width, 280px);outline:none;box-sizing:border-box}.sdc-datepicker__header{display:flex;align-items:center;justify-content:space-between;padding:.5rem .75rem;border-bottom:1px solid var(--sdc-datepicker-separator-color, #e5e7eb)}.sdc-datepicker__nav-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:0;background:transparent;border-radius:var(--sdc-datepicker-nav-btn-radius, 50%);color:var(--sdc-datepicker-nav-btn-color, #374151);cursor:pointer;transition:background-color .15s ease}.sdc-datepicker__nav-btn:hover{background-color:var(--sdc-datepicker-nav-btn-hover-bg, rgba(0, 0, 0, .06))}.sdc-datepicker__title-btn{border:0;background:transparent;font-weight:600;font-size:var(--sdc-datepicker-title-font-size, .875rem);color:var(--sdc-datepicker-title-color, #111827);cursor:pointer;padding:.25rem .5rem;border-radius:4px;transition:background-color .15s ease}.sdc-datepicker__title-btn:hover{background-color:var(--sdc-datepicker-title-hover-bg, rgba(0, 0, 0, .04))}.sdc-datepicker__calendar{-webkit-user-select:none;user-select:none;padding:0 .5rem .5rem;border-collapse:collapse;border-spacing:0;width:100%}.sdc-datepicker__weekdays{display:grid;grid-template-columns:repeat(7,1fr);padding-top:.5rem}.sdc-datepicker__weekday{display:flex;align-items:center;justify-content:center;height:32px;font-size:var(--sdc-datepicker-weekday-font-size, .75rem);font-weight:600;color:var(--sdc-datepicker-weekday-color, #6b7280);text-transform:uppercase}.sdc-datepicker__days{display:grid;grid-template-columns:repeat(7,1fr);gap:var(--sdc-datepicker-day-gap, 2px)}.sdc-datepicker__days>tr{display:contents}.sdc-datepicker__days td{padding:0}.sdc-datepicker__day{display:flex;align-items:center;justify-content:center;width:var(--sdc-datepicker-day-size, 32px);height:var(--sdc-datepicker-day-size, 32px);margin:0 auto;border:0;border-radius:var(--sdc-datepicker-day-radius, 50%);background:transparent;font-size:var(--sdc-datepicker-day-font-size, .75rem);color:var(--sdc-datepicker-day-color, #111827);cursor:pointer;transition:background-color .12s ease,color .12s ease;position:relative;padding:0}.sdc-datepicker__day:hover:not(:disabled):not(.sdc-datepicker__day--selected){background-color:var(--sdc-datepicker-day-hover-bg, rgba(0, 0, 0, .06))}.sdc-datepicker__day--other-month{color:var(--sdc-datepicker-day-other-month-color, #d1d5db)}.sdc-datepicker__day--today{border:2px solid var(--sdc-datepicker-today-border-color, var(--sdc-tab-primary, #007bff))}.sdc-datepicker__day--selected{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);font-weight:600}.sdc-datepicker__day--selected:hover{background-color:var(--sdc-datepicker-selected-hover-bg, #0056b3)}.sdc-datepicker__day--disabled{opacity:var(--sdc-datepicker-disabled-opacity, .35);cursor:not-allowed}.sdc-datepicker__day--in-range{background-color:var(--sdc-datepicker-range-bg, rgba(0, 123, 255, .1));border-radius:0}.sdc-datepicker__day--range-start{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);border-radius:var(--sdc-datepicker-day-radius, 50%) 0 0 var(--sdc-datepicker-day-radius, 50%)}.sdc-datepicker__day--range-end{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);border-radius:0 var(--sdc-datepicker-day-radius, 50%) var(--sdc-datepicker-day-radius, 50%) 0}.sdc-datepicker__months-grid,.sdc-datepicker__years-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:.5rem;padding:.75rem}.sdc-datepicker__month-cell,.sdc-datepicker__year-cell{display:flex;align-items:center;justify-content:center;padding:.625rem .5rem;border:0;border-radius:var(--sdc-datepicker-cell-radius, 6px);background:transparent;font-size:.8125rem;color:var(--sdc-datepicker-cell-color, #374151);cursor:pointer;transition:background-color .12s ease}.sdc-datepicker__month-cell:hover,.sdc-datepicker__year-cell:hover{background-color:var(--sdc-datepicker-cell-hover-bg, rgba(0, 0, 0, .05))}.sdc-datepicker__month-cell--selected,.sdc-datepicker__year-cell--selected{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);font-weight:600}.sdc-datepicker__time{display:flex;align-items:center;justify-content:center;gap:.25rem;padding:.75rem;border-top:1px solid var(--sdc-datepicker-separator-color, #e5e7eb)}.sdc-datepicker__time-group{display:flex;flex-direction:column;align-items:center;gap:.125rem}.sdc-datepicker__time-btn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:24px;border:0;background:transparent;border-radius:4px;color:var(--sdc-datepicker-time-btn-color, #6b7280);cursor:pointer;transition:background-color .12s ease}.sdc-datepicker__time-btn:hover{background-color:var(--sdc-datepicker-time-btn-hover-bg, rgba(0, 0, 0, .06))}.sdc-datepicker__time-value{font-size:var(--sdc-datepicker-time-font-size, 1.125rem);font-weight:600;color:var(--sdc-datepicker-time-value-color, #111827);min-width:2ch;text-align:center}.sdc-datepicker__time-separator{font-size:1.125rem;font-weight:600;color:var(--sdc-datepicker-time-separator-color, #6b7280);padding:0 .125rem;align-self:center}.sdc-datepicker__confirm-btn{padding:.25rem .875rem;border:0;border-radius:var(--sdc-datepicker-confirm-btn-radius, 4px);background-color:var(--sdc-datepicker-confirm-btn-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-confirm-btn-color, #fff);font-size:.8125rem;font-weight:600;cursor:pointer;transition:background-color .15s ease}.sdc-datepicker__confirm-btn:hover{background-color:var(--sdc-datepicker-confirm-btn-hover-bg, #0056b3)}.sdc-datepicker__button-bar{display:flex;align-items:center;justify-content:space-between;padding:.5rem .75rem;border-top:1px solid var(--sdc-datepicker-separator-color, #e5e7eb)}.sdc-datepicker__button-bar-end{display:flex;align-items:center;gap:.5rem}.sdc-datepicker__bar-btn{padding:.25rem .75rem;border:0;border-radius:4px;background:transparent;font-size:.8125rem;font-weight:500;color:var(--sdc-datepicker-bar-btn-color, var(--sdc-tab-primary, #007bff));cursor:pointer;transition:background-color .12s ease}.sdc-datepicker__bar-btn:hover{background-color:var(--sdc-datepicker-bar-btn-hover-bg, rgba(0, 123, 255, .08))}.sdc-datepicker__backdrop{background:transparent}.message{display:block;margin-top:.25rem;font-size:var(--sdc-datepicker-message-font-size, .75rem);color:var(--sdc-datepicker-message-color, #6b7280)}.message.invalid{color:var(--sdc-datepicker-message-invalid-color, var(--sdc-error-color, #dc3545))}::ng-deep .sdc-datepicker-popover-panel{overflow:visible!important;max-width:none!important;max-height:none!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "component", type: PopoverComponent, selector: "sdc-popover", inputs: ["open", "disabled", "toggleOnTriggerClick", "closeOnOutsideClick", "closeOnScroll", "closeOnEscape", "trapFocus", "focusOnOpen", "restoreFocusOnClose", "ariaLabel", "appendTo", "zIndex", "offset", "placement", "role", "matchTriggerWidth", "panelWidth", "panelMinWidth", "panelMaxWidth", "panelMaxHeight", "panelClass"], outputs: ["openChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
735
903
  }
736
904
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DatepickerComponent, decorators: [{
737
905
  type: Component,
@@ -751,7 +919,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
751
919
  useExisting: forwardRef(() => DatepickerComponent),
752
920
  multi: true
753
921
  }
754
- ], template: "<div class=\"sdc-datepicker\">\n @if (labelKey()) {\n <div class=\"sdc-datepicker__label-row\">\n <label class=\"sdc-datepicker__label\" [attr.for]=\"inputId\">\n <span class=\"sdc-datepicker__label-text\">\n {{ labelKey() | translate }}\n @if (required) {\n <span class=\"required-field\" aria-hidden=\"true\">*</span>\n }\n </span>\n </label>\n </div>\n }\n\n <sdc-popover\n [open]=\"panelOpen\"\n [toggleOnTriggerClick]=\"false\"\n [closeOnOutsideClick]=\"true\"\n [closeOnEscape]=\"true\"\n [matchTriggerWidth]=\"false\"\n [restoreFocusOnClose]=\"false\"\n [trapFocus]=\"true\"\n [ariaLabel]=\"'datepicker.calendar'\"\n panelClass=\"sdc-datepicker-popover-panel\"\n (openChange)=\"onPopoverOpenChange($event)\"\n >\n <div sdc-popover-trigger>\n <div\n class=\"sdc-datepicker__control\"\n #triggerRef\n [class.sdc-datepicker__control--invalid]=\"invalid\"\n [class.sdc-datepicker__control--disabled]=\"disabled\"\n [ngStyle]=\"getInputStyle()\"\n >\n <div class=\"sdc-datepicker__value\">\n <input\n #inputRef\n [id]=\"inputId\"\n class=\"sdc-datepicker__input\"\n type=\"text\"\n [disabled]=\"disabled\"\n [readOnly]=\"readonlyInput\"\n [placeholder]=\"placeholder || dateFormat\"\n [value]=\"displayValue()\"\n [attr.aria-label]=\"labelKey() ? (labelKey() | translate) : placeholder\"\n [attr.aria-expanded]=\"panelOpen\"\n [attr.aria-haspopup]=\"'dialog'\"\n aria-autocomplete=\"none\"\n autocomplete=\"off\"\n (click)=\"onInputClick()\"\n (focus)=\"onInputFocus()\"\n (keydown)=\"onKeydown($event)\"\n />\n </div>\n\n <div class=\"sdc-datepicker__actions\">\n @if (showClear && value) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__icon-button sdc-datepicker__icon-button--clear\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"'datepicker.clear' | translate\"\n (click)=\"clearValue(); $event.stopPropagation()\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n }\n @if (showIcon) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__icon-button sdc-datepicker__icon-button--toggle\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"'datepicker.calendar' | translate\"\n [attr.aria-expanded]=\"panelOpen\"\n (click)=\"togglePanel(); $event.stopPropagation()\"\n >\n <i [class]=\"icon\" class=\"sdc-datepicker__icon\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </div>\n </div>\n\n <div sdc-popover-content>\n <div\n #panelContentRef\n class=\"sdc-datepicker__panel\"\n (keydown)=\"onOverlayKeydown($event)\"\n [attr.aria-label]=\"'datepicker.calendar' | translate\"\n >\n <!-- Navigation Header -->\n @if (mode !== 'time') {\n <div class=\"sdc-datepicker__header\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__nav-btn\"\n [attr.aria-label]=\"'datepicker.prev' | translate\"\n (click)=\"currentView() === 'days' ? prevMonth() : currentView() === 'months' ? prevYear() : prevYearRange()\"\n >\n <i class=\"fas fa-chevron-left\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n type=\"button\"\n class=\"sdc-datepicker__title-btn\"\n (click)=\"\n currentView() === 'days'\n ? switchToMonthView()\n : currentView() === 'months' ? switchToYearView() : null\n \"\n >\n {{ viewMonthYearLabel() }}\n </button>\n\n <button\n type=\"button\"\n class=\"sdc-datepicker__nav-btn\"\n [attr.aria-label]=\"'datepicker.next' | translate\"\n (click)=\"currentView() === 'days' ? nextMonth() : currentView() === 'months' ? nextYear() : nextYearRange()\"\n >\n <i class=\"fas fa-chevron-right\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n\n <!-- Days View -->\n @if (currentView() === 'days' && mode !== 'time') {\n <table class=\"sdc-datepicker__calendar\">\n <thead>\n <tr class=\"sdc-datepicker__weekdays\">\n @for (dayName of weekDayNames(); track dayName) {\n <th class=\"sdc-datepicker__weekday\" scope=\"col\">\n {{ dayName }}\n </th>\n }\n </tr>\n </thead>\n <tbody class=\"sdc-datepicker__days\" (keydown)=\"onDaysGridKeydown($event)\">\n @for (week of calendarWeeks(); track $index) {\n <tr>\n @for (day of week; track day.date.getTime()) {\n <td>\n <button\n #dayBtn\n type=\"button\"\n class=\"sdc-datepicker__day\"\n [class.sdc-datepicker__day--other-month]=\"!day.currentMonth\"\n [class.sdc-datepicker__day--today]=\"day.today\"\n [class.sdc-datepicker__day--selected]=\"day.selected\"\n [class.sdc-datepicker__day--disabled]=\"day.disabled\"\n [class.sdc-datepicker__day--in-range]=\"day.inRange\"\n [class.sdc-datepicker__day--range-start]=\"day.rangeStart\"\n [class.sdc-datepicker__day--range-end]=\"day.rangeEnd\"\n [disabled]=\"day.disabled\"\n [attr.aria-label]=\"day.date.toLocaleDateString()\"\n [attr.aria-selected]=\"day.selected\"\n [attr.aria-disabled]=\"day.disabled\"\n [attr.tabindex]=\"isDayTabStop(day) ? 0 : -1\"\n (click)=\"selectDay(day)\"\n >\n {{ day.day }}\n </button>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n\n <!-- Months View -->\n @if (currentView() === 'months') {\n <div class=\"sdc-datepicker__months-grid\">\n @for (m of calendarMonths(); track m.month) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__month-cell\"\n [class.sdc-datepicker__month-cell--selected]=\"m.selected\"\n (click)=\"selectMonth(m.month)\"\n >\n {{ m.name }}\n </button>\n }\n </div>\n }\n\n <!-- Years View -->\n @if (currentView() === 'years') {\n <div class=\"sdc-datepicker__years-grid\">\n @for (year of yearRange(); track year) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__year-cell\"\n [class.sdc-datepicker__year-cell--selected]=\"year === viewDate().getFullYear()\"\n (click)=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n }\n </div>\n }\n\n <!-- Time Picker -->\n @if (showTimePicker()) {\n <div class=\"sdc-datepicker__time\">\n <div class=\"sdc-datepicker__time-group\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"incrementHours()\"\n [attr.aria-label]=\"'datepicker.incrementHour' | translate\"\n >\n <i class=\"fas fa-chevron-up\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"sdc-datepicker__time-value\">{{ padTime(hours()) }}</span>\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"decrementHours()\"\n [attr.aria-label]=\"'datepicker.decrementHour' | translate\"\n >\n <i class=\"fas fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <span class=\"sdc-datepicker__time-separator\">:</span>\n\n <div class=\"sdc-datepicker__time-group\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"incrementMinutes()\"\n [attr.aria-label]=\"'datepicker.incrementMinute' | translate\"\n >\n <i class=\"fas fa-chevron-up\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"sdc-datepicker__time-value\">{{ padTime(minutes()) }}</span>\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"decrementMinutes()\"\n [attr.aria-label]=\"'datepicker.decrementMinute' | translate\"\n >\n <i class=\"fas fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n @if (showSeconds) {\n <span class=\"sdc-datepicker__time-separator\">:</span>\n <div class=\"sdc-datepicker__time-group\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"incrementSeconds()\"\n [attr.aria-label]=\"'datepicker.incrementSecond' | translate\"\n >\n <i class=\"fas fa-chevron-up\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"sdc-datepicker__time-value\">{{ padTime(seconds()) }}</span>\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"decrementSeconds()\"\n [attr.aria-label]=\"'datepicker.decrementSecond' | translate\"\n >\n <i class=\"fas fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n </div>\n\n }\n\n <!-- Footer: Today on the left, Clear + Confirm together on the right -->\n @if (showButtonBar || mode === 'datetime' || mode === 'time') {\n <div class=\"sdc-datepicker__button-bar\">\n <div>\n @if (showButtonBar && mode !== 'time') {\n <button\n type=\"button\"\n class=\"sdc-datepicker__bar-btn\"\n (click)=\"selectToday()\"\n >\n {{ 'datepicker.today' | translate }}\n </button>\n }\n </div>\n\n <div class=\"sdc-datepicker__button-bar-end\">\n @if (showButtonBar) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__bar-btn\"\n (click)=\"clearValue()\"\n >\n {{ 'datepicker.clear' | translate }}\n </button>\n }\n @if (mode === 'datetime' || mode === 'time') {\n <button\n type=\"button\"\n class=\"sdc-datepicker__confirm-btn\"\n (click)=\"confirmDateTime()\"\n >\n {{ 'datepicker.confirm' | translate }}\n </button>\n }\n </div>\n </div>\n }\n </div>\n </div>\n </sdc-popover>\n\n @if (messageKey()) {\n <small\n [ngClass]=\"getInvalidMessageClass()\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {{ messageKey() | translate }}\n </small>\n }\n</div>\n", styles: [":host{display:block}.sdc-datepicker__label-row{display:flex;align-items:center;gap:var(--sdc-form-label-row-gap);margin-bottom:var(--sdc-form-label-row-mb)}.sdc-datepicker__label{display:inline-flex;align-items:center;margin-bottom:0;line-height:1;padding-top:var(--sdc-datepicker-label-py, var(--sdc-form-label-py, 0));padding-bottom:var(--sdc-datepicker-label-py, var(--sdc-form-label-py, 0));min-width:0}.sdc-datepicker__label-text{display:inline-flex;align-items:center}.required-field{margin-left:var(--sdc-datepicker-required-ml, var(--sdc-form-required-ml, .25rem));color:var(--sdc-datepicker-required-color, var(--sdc-error-color, #dc3545));font-weight:400}.sdc-datepicker__control{display:flex;align-items:stretch;min-height:var(--sdc-datepicker-control-height, var(--sdc-formfield-default-height, 38px));border:1px solid var(--sdc-datepicker-border-color, var(--sdc-formfield-default-border, #ced4da));border-radius:var(--sdc-datepicker-border-radius, var(--sdc-formfield-border-radius, 4px));background:var(--sdc-datepicker-bg, var(--sdc-formfield-default-bg, #fff));box-sizing:border-box;cursor:pointer;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.sdc-datepicker__control:hover{border-color:var(--sdc-datepicker-hover-border, var(--sdc-formfield-focus-color, #007bff))}.sdc-datepicker__control:focus-within{border-color:var(--sdc-datepicker-focus-border, var(--sdc-formfield-focus-color, #007bff));box-shadow:var(--sdc-datepicker-focus-shadow, var(--sdc-formfield-focus-shadow, 0 0 0 2px rgba(0, 123, 255, .14)))}.sdc-datepicker__control--invalid,.sdc-datepicker__control--invalid:hover,.sdc-datepicker__control--invalid:focus-within{border-color:var(--sdc-datepicker-invalid-border, var(--sdc-formfield-invalid-border, #d98888));box-shadow:var(--sdc-datepicker-invalid-shadow, var(--sdc-formfield-invalid-focus-shadow, 0 0 0 2px rgba(217, 136, 136, .16)))}.sdc-datepicker__control--disabled,.sdc-datepicker__control--disabled:hover{background-color:var(--sdc-datepicker-disabled-bg, var(--sdc-formfield-disabled-bg, #e9ecef));border-color:var(--sdc-datepicker-border-color, var(--sdc-formfield-default-border, #ced4da));box-shadow:none;cursor:not-allowed}.sdc-datepicker__value{display:flex;align-items:center;flex:1 1 auto;min-width:0;padding:0 .75rem}.sdc-datepicker__input{width:100%;min-width:0;border:0;background:transparent;box-shadow:none;outline:0;font:inherit;color:inherit;line-height:var(--sdc-datepicker-input-line-height, var(--sdc-formfield-default-line-height, 1.5));padding:0;cursor:pointer}.sdc-datepicker__input::placeholder{color:var(--sdc-datepicker-placeholder-color, var(--sdc-form-placeholder-color, #9ca3af))}.sdc-datepicker__input:disabled{cursor:not-allowed}.sdc-datepicker__actions{display:flex;align-items:stretch;flex:0 0 auto}.sdc-datepicker__icon{font-size:.875rem}.sdc-datepicker__icon-button{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;border:0;background:transparent;color:var(--sdc-button-icon-default, #333333);cursor:pointer}.sdc-datepicker__icon-button:hover:not(:disabled){background:transparent}.sdc-datepicker__icon-button--clear{min-width:2rem;padding:0 .5rem}.sdc-datepicker__icon-button--toggle{min-width:2.5rem;padding:0 .75rem;border-left:1px solid var(--sdc-formfield-default-border, #ced4da)}.sdc-datepicker__panel{background:var(--sdc-datepicker-panel-bg, #fff);border:1px solid var(--sdc-datepicker-panel-border, #e5e7eb);border-radius:var(--sdc-datepicker-panel-radius, 6px);box-shadow:var(--sdc-datepicker-panel-shadow, 0 4px 12px rgba(0, 0, 0, .1));padding:0;width:var(--sdc-datepicker-panel-width, 280px);outline:none;box-sizing:border-box}.sdc-datepicker__header{display:flex;align-items:center;justify-content:space-between;padding:.5rem .75rem;border-bottom:1px solid var(--sdc-datepicker-separator-color, #e5e7eb)}.sdc-datepicker__nav-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:0;background:transparent;border-radius:var(--sdc-datepicker-nav-btn-radius, 50%);color:var(--sdc-datepicker-nav-btn-color, #374151);cursor:pointer;transition:background-color .15s ease}.sdc-datepicker__nav-btn:hover{background-color:var(--sdc-datepicker-nav-btn-hover-bg, rgba(0, 0, 0, .06))}.sdc-datepicker__title-btn{border:0;background:transparent;font-weight:600;font-size:var(--sdc-datepicker-title-font-size, .875rem);color:var(--sdc-datepicker-title-color, #111827);cursor:pointer;padding:.25rem .5rem;border-radius:4px;transition:background-color .15s ease}.sdc-datepicker__title-btn:hover{background-color:var(--sdc-datepicker-title-hover-bg, rgba(0, 0, 0, .04))}.sdc-datepicker__calendar{-webkit-user-select:none;user-select:none;padding:0 .5rem .5rem;border-collapse:collapse;border-spacing:0;width:100%}.sdc-datepicker__weekdays{display:grid;grid-template-columns:repeat(7,1fr);padding-top:.5rem}.sdc-datepicker__weekday{display:flex;align-items:center;justify-content:center;height:32px;font-size:var(--sdc-datepicker-weekday-font-size, .75rem);font-weight:600;color:var(--sdc-datepicker-weekday-color, #6b7280);text-transform:uppercase}.sdc-datepicker__days{display:grid;grid-template-columns:repeat(7,1fr);gap:var(--sdc-datepicker-day-gap, 2px)}.sdc-datepicker__days>tr{display:contents}.sdc-datepicker__days td{padding:0}.sdc-datepicker__day{display:flex;align-items:center;justify-content:center;width:var(--sdc-datepicker-day-size, 32px);height:var(--sdc-datepicker-day-size, 32px);margin:0 auto;border:0;border-radius:var(--sdc-datepicker-day-radius, 50%);background:transparent;font-size:var(--sdc-datepicker-day-font-size, .75rem);color:var(--sdc-datepicker-day-color, #111827);cursor:pointer;transition:background-color .12s ease,color .12s ease;position:relative;padding:0}.sdc-datepicker__day:hover:not(:disabled):not(.sdc-datepicker__day--selected){background-color:var(--sdc-datepicker-day-hover-bg, rgba(0, 0, 0, .06))}.sdc-datepicker__day--other-month{color:var(--sdc-datepicker-day-other-month-color, #d1d5db)}.sdc-datepicker__day--today{border:2px solid var(--sdc-datepicker-today-border-color, var(--sdc-tab-primary, #007bff))}.sdc-datepicker__day--selected{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);font-weight:600}.sdc-datepicker__day--selected:hover{background-color:var(--sdc-datepicker-selected-hover-bg, #0056b3)}.sdc-datepicker__day--disabled{opacity:var(--sdc-datepicker-disabled-opacity, .35);cursor:not-allowed}.sdc-datepicker__day--in-range{background-color:var(--sdc-datepicker-range-bg, rgba(0, 123, 255, .1));border-radius:0}.sdc-datepicker__day--range-start{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);border-radius:var(--sdc-datepicker-day-radius, 50%) 0 0 var(--sdc-datepicker-day-radius, 50%)}.sdc-datepicker__day--range-end{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);border-radius:0 var(--sdc-datepicker-day-radius, 50%) var(--sdc-datepicker-day-radius, 50%) 0}.sdc-datepicker__months-grid,.sdc-datepicker__years-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:.5rem;padding:.75rem}.sdc-datepicker__month-cell,.sdc-datepicker__year-cell{display:flex;align-items:center;justify-content:center;padding:.625rem .5rem;border:0;border-radius:var(--sdc-datepicker-cell-radius, 6px);background:transparent;font-size:.8125rem;color:var(--sdc-datepicker-cell-color, #374151);cursor:pointer;transition:background-color .12s ease}.sdc-datepicker__month-cell:hover,.sdc-datepicker__year-cell:hover{background-color:var(--sdc-datepicker-cell-hover-bg, rgba(0, 0, 0, .05))}.sdc-datepicker__month-cell--selected,.sdc-datepicker__year-cell--selected{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);font-weight:600}.sdc-datepicker__time{display:flex;align-items:center;justify-content:center;gap:.25rem;padding:.75rem;border-top:1px solid var(--sdc-datepicker-separator-color, #e5e7eb)}.sdc-datepicker__time-group{display:flex;flex-direction:column;align-items:center;gap:.125rem}.sdc-datepicker__time-btn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:24px;border:0;background:transparent;border-radius:4px;color:var(--sdc-datepicker-time-btn-color, #6b7280);cursor:pointer;transition:background-color .12s ease}.sdc-datepicker__time-btn:hover{background-color:var(--sdc-datepicker-time-btn-hover-bg, rgba(0, 0, 0, .06))}.sdc-datepicker__time-value{font-size:var(--sdc-datepicker-time-font-size, 1.125rem);font-weight:600;color:var(--sdc-datepicker-time-value-color, #111827);min-width:2ch;text-align:center}.sdc-datepicker__time-separator{font-size:1.125rem;font-weight:600;color:var(--sdc-datepicker-time-separator-color, #6b7280);padding:0 .125rem;align-self:center}.sdc-datepicker__confirm-btn{padding:.25rem .875rem;border:0;border-radius:var(--sdc-datepicker-confirm-btn-radius, 4px);background-color:var(--sdc-datepicker-confirm-btn-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-confirm-btn-color, #fff);font-size:.8125rem;font-weight:600;cursor:pointer;transition:background-color .15s ease}.sdc-datepicker__confirm-btn:hover{background-color:var(--sdc-datepicker-confirm-btn-hover-bg, #0056b3)}.sdc-datepicker__button-bar{display:flex;align-items:center;justify-content:space-between;padding:.5rem .75rem;border-top:1px solid var(--sdc-datepicker-separator-color, #e5e7eb)}.sdc-datepicker__button-bar-end{display:flex;align-items:center;gap:.5rem}.sdc-datepicker__bar-btn{padding:.25rem .75rem;border:0;border-radius:4px;background:transparent;font-size:.8125rem;font-weight:500;color:var(--sdc-datepicker-bar-btn-color, var(--sdc-tab-primary, #007bff));cursor:pointer;transition:background-color .12s ease}.sdc-datepicker__bar-btn:hover{background-color:var(--sdc-datepicker-bar-btn-hover-bg, rgba(0, 123, 255, .08))}.sdc-datepicker__backdrop{background:transparent}.message{display:block;margin-top:.25rem;font-size:var(--sdc-datepicker-message-font-size, .75rem);color:var(--sdc-datepicker-message-color, #6b7280)}.message.invalid{color:var(--sdc-datepicker-message-invalid-color, var(--sdc-error-color, #dc3545))}::ng-deep .sdc-datepicker-popover-panel{overflow:visible!important;max-width:none!important;max-height:none!important}\n"] }]
922
+ ], template: "<div class=\"sdc-datepicker\">\n @if (labelKey()) {\n <div class=\"sdc-datepicker__label-row\">\n <label class=\"sdc-datepicker__label\" [attr.for]=\"inputId\">\n <span class=\"sdc-datepicker__label-text\">\n {{ labelKey() | translate }}\n @if (required) {\n <span class=\"required-field\" aria-hidden=\"true\">*</span>\n }\n </span>\n </label>\n </div>\n }\n\n <sdc-popover\n [open]=\"panelOpen\"\n [toggleOnTriggerClick]=\"false\"\n [closeOnOutsideClick]=\"true\"\n [closeOnEscape]=\"true\"\n [matchTriggerWidth]=\"false\"\n [restoreFocusOnClose]=\"false\"\n [trapFocus]=\"true\"\n [ariaLabel]=\"'datepicker.calendar'\"\n panelClass=\"sdc-datepicker-popover-panel\"\n (openChange)=\"onPopoverOpenChange($event)\"\n >\n <div sdc-popover-trigger>\n <div\n class=\"sdc-datepicker__control\"\n #triggerRef\n [class.sdc-datepicker__control--invalid]=\"invalid\"\n [class.sdc-datepicker__control--disabled]=\"disabled\"\n [ngStyle]=\"getInputStyle()\"\n >\n <div class=\"sdc-datepicker__value\">\n <input\n #inputRef\n [id]=\"inputId\"\n class=\"sdc-datepicker__input\"\n type=\"text\"\n [disabled]=\"disabled\"\n [readOnly]=\"readonlyInput && !allowTyping\"\n [placeholder]=\"placeholder || dateFormat\"\n [value]=\"inputValue()\"\n [attr.aria-label]=\"labelKey() ? (labelKey() | translate) : placeholder\"\n [attr.aria-expanded]=\"panelOpen\"\n [attr.aria-haspopup]=\"'dialog'\"\n aria-autocomplete=\"none\"\n autocomplete=\"off\"\n (click)=\"onInputClick()\"\n (focus)=\"onInputFocus()\"\n (input)=\"onInputTyping($event)\"\n (blur)=\"onInputBlur()\"\n (keydown)=\"onKeydown($event)\"\n />\n </div>\n\n <div class=\"sdc-datepicker__actions\">\n @if (showClear && value) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__icon-button sdc-datepicker__icon-button--clear\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"'datepicker.clear' | translate\"\n (click)=\"clearValue(); $event.stopPropagation()\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n }\n @if (showIcon) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__icon-button sdc-datepicker__icon-button--toggle\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"'datepicker.calendar' | translate\"\n [attr.aria-expanded]=\"panelOpen\"\n (click)=\"togglePanel(); $event.stopPropagation()\"\n >\n <i [class]=\"icon\" class=\"sdc-datepicker__icon\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </div>\n </div>\n\n <div sdc-popover-content>\n <div\n #panelContentRef\n class=\"sdc-datepicker__panel\"\n (keydown)=\"onOverlayKeydown($event)\"\n [attr.aria-label]=\"'datepicker.calendar' | translate\"\n >\n <!-- Navigation Header -->\n @if (mode !== 'time') {\n <div class=\"sdc-datepicker__header\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__nav-btn\"\n [attr.aria-label]=\"'datepicker.prev' | translate\"\n (click)=\"currentView() === 'days' ? prevMonth() : currentView() === 'months' ? prevYear() : prevYearRange()\"\n >\n <i class=\"fas fa-chevron-left\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n type=\"button\"\n class=\"sdc-datepicker__title-btn\"\n (click)=\"\n currentView() === 'days'\n ? switchToMonthView()\n : currentView() === 'months' ? switchToYearView() : null\n \"\n >\n {{ viewMonthYearLabel() }}\n </button>\n\n <button\n type=\"button\"\n class=\"sdc-datepicker__nav-btn\"\n [attr.aria-label]=\"'datepicker.next' | translate\"\n (click)=\"currentView() === 'days' ? nextMonth() : currentView() === 'months' ? nextYear() : nextYearRange()\"\n >\n <i class=\"fas fa-chevron-right\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n\n <!-- Days View -->\n @if (currentView() === 'days' && mode !== 'time') {\n <table class=\"sdc-datepicker__calendar\">\n <thead>\n <tr class=\"sdc-datepicker__weekdays\">\n @for (dayName of weekDayNames(); track dayName) {\n <th class=\"sdc-datepicker__weekday\" scope=\"col\">\n {{ dayName }}\n </th>\n }\n </tr>\n </thead>\n <tbody class=\"sdc-datepicker__days\" (keydown)=\"onDaysGridKeydown($event)\">\n @for (week of calendarWeeks(); track $index) {\n <tr>\n @for (day of week; track day.date.getTime()) {\n <td>\n <button\n #dayBtn\n type=\"button\"\n class=\"sdc-datepicker__day\"\n [class.sdc-datepicker__day--other-month]=\"!day.currentMonth\"\n [class.sdc-datepicker__day--today]=\"day.today\"\n [class.sdc-datepicker__day--selected]=\"day.selected\"\n [class.sdc-datepicker__day--disabled]=\"day.disabled\"\n [class.sdc-datepicker__day--in-range]=\"day.inRange\"\n [class.sdc-datepicker__day--range-start]=\"day.rangeStart\"\n [class.sdc-datepicker__day--range-end]=\"day.rangeEnd\"\n [disabled]=\"day.disabled\"\n [attr.aria-label]=\"day.date.toLocaleDateString()\"\n [attr.aria-selected]=\"day.selected\"\n [attr.aria-disabled]=\"day.disabled\"\n [attr.tabindex]=\"isDayTabStop(day) ? 0 : -1\"\n (click)=\"selectDay(day)\"\n >\n {{ day.day }}\n </button>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n\n <!-- Months View -->\n @if (currentView() === 'months') {\n <div class=\"sdc-datepicker__months-grid\">\n @for (m of calendarMonths(); track m.month) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__month-cell\"\n [class.sdc-datepicker__month-cell--selected]=\"m.selected\"\n (click)=\"selectMonth(m.month)\"\n >\n {{ m.name }}\n </button>\n }\n </div>\n }\n\n <!-- Years View -->\n @if (currentView() === 'years') {\n <div class=\"sdc-datepicker__years-grid\">\n @for (year of yearRange(); track year) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__year-cell\"\n [class.sdc-datepicker__year-cell--selected]=\"year === viewDate().getFullYear()\"\n (click)=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n }\n </div>\n }\n\n <!-- Time Picker -->\n @if (showTimePicker()) {\n <div class=\"sdc-datepicker__time\">\n <div class=\"sdc-datepicker__time-group\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"incrementHours()\"\n [attr.aria-label]=\"'datepicker.incrementHour' | translate\"\n >\n <i class=\"fas fa-chevron-up\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"sdc-datepicker__time-value\">{{ padTime(hours()) }}</span>\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"decrementHours()\"\n [attr.aria-label]=\"'datepicker.decrementHour' | translate\"\n >\n <i class=\"fas fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <span class=\"sdc-datepicker__time-separator\">:</span>\n\n <div class=\"sdc-datepicker__time-group\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"incrementMinutes()\"\n [attr.aria-label]=\"'datepicker.incrementMinute' | translate\"\n >\n <i class=\"fas fa-chevron-up\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"sdc-datepicker__time-value\">{{ padTime(minutes()) }}</span>\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"decrementMinutes()\"\n [attr.aria-label]=\"'datepicker.decrementMinute' | translate\"\n >\n <i class=\"fas fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n @if (showSeconds) {\n <span class=\"sdc-datepicker__time-separator\">:</span>\n <div class=\"sdc-datepicker__time-group\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"incrementSeconds()\"\n [attr.aria-label]=\"'datepicker.incrementSecond' | translate\"\n >\n <i class=\"fas fa-chevron-up\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"sdc-datepicker__time-value\">{{ padTime(seconds()) }}</span>\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"decrementSeconds()\"\n [attr.aria-label]=\"'datepicker.decrementSecond' | translate\"\n >\n <i class=\"fas fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n </div>\n\n }\n\n <!-- Footer: Today on the left, Clear + Confirm together on the right -->\n @if (showButtonBar || mode === 'datetime' || mode === 'time') {\n <div class=\"sdc-datepicker__button-bar\">\n <div>\n @if (showButtonBar && mode !== 'time') {\n <button\n type=\"button\"\n class=\"sdc-datepicker__bar-btn\"\n (click)=\"selectToday()\"\n >\n {{ 'datepicker.today' | translate }}\n </button>\n }\n </div>\n\n <div class=\"sdc-datepicker__button-bar-end\">\n @if (showButtonBar) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__bar-btn\"\n (click)=\"clearValue()\"\n >\n {{ 'datepicker.clear' | translate }}\n </button>\n }\n @if (mode === 'datetime' || mode === 'time') {\n <button\n type=\"button\"\n class=\"sdc-datepicker__confirm-btn\"\n (click)=\"confirmDateTime()\"\n >\n {{ 'datepicker.confirm' | translate }}\n </button>\n }\n </div>\n </div>\n }\n </div>\n </div>\n </sdc-popover>\n\n @if (messageKey()) {\n <small\n [ngClass]=\"getInvalidMessageClass()\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {{ messageKey() | translate }}\n </small>\n }\n</div>\n", styles: [":host{display:block}.sdc-datepicker__label-row{display:flex;align-items:center;gap:var(--sdc-form-label-row-gap);margin-bottom:var(--sdc-form-label-row-mb)}.sdc-datepicker__label{display:inline-flex;align-items:center;margin-bottom:0;line-height:1;padding-top:var(--sdc-datepicker-label-py, var(--sdc-form-label-py, 0));padding-bottom:var(--sdc-datepicker-label-py, var(--sdc-form-label-py, 0));min-width:0}.sdc-datepicker__label-text{display:inline-flex;align-items:center}.required-field{margin-left:var(--sdc-datepicker-required-ml, var(--sdc-form-required-ml, .25rem));color:var(--sdc-datepicker-required-color, var(--sdc-error-color, #dc3545));font-weight:400}.sdc-datepicker__control{display:flex;align-items:stretch;min-height:var(--sdc-datepicker-control-height, var(--sdc-formfield-default-height, 38px));border:1px solid var(--sdc-datepicker-border-color, var(--sdc-formfield-default-border, #ced4da));border-radius:var(--sdc-datepicker-border-radius, var(--sdc-formfield-border-radius, 4px));background:var(--sdc-datepicker-bg, var(--sdc-formfield-default-bg, #fff));box-sizing:border-box;cursor:pointer;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.sdc-datepicker__control:hover{border-color:var(--sdc-datepicker-hover-border, var(--sdc-formfield-focus-color, #007bff))}.sdc-datepicker__control:focus-within{border-color:var(--sdc-datepicker-focus-border, var(--sdc-formfield-focus-color, #007bff));box-shadow:var(--sdc-datepicker-focus-shadow, var(--sdc-formfield-focus-shadow, 0 0 0 2px rgba(0, 123, 255, .14)))}.sdc-datepicker__control--invalid,.sdc-datepicker__control--invalid:hover,.sdc-datepicker__control--invalid:focus-within{border-color:var(--sdc-datepicker-invalid-border, var(--sdc-formfield-invalid-border, #d98888));box-shadow:var(--sdc-datepicker-invalid-shadow, var(--sdc-formfield-invalid-focus-shadow, 0 0 0 2px rgba(217, 136, 136, .16)))}.sdc-datepicker__control--disabled,.sdc-datepicker__control--disabled:hover{background-color:var(--sdc-datepicker-disabled-bg, var(--sdc-formfield-disabled-bg, #e9ecef));border-color:var(--sdc-datepicker-border-color, var(--sdc-formfield-default-border, #ced4da));box-shadow:none;cursor:not-allowed}.sdc-datepicker__value{display:flex;align-items:center;flex:1 1 auto;min-width:0;padding:0 .75rem}.sdc-datepicker__input{width:100%;min-width:0;border:0;background:transparent;box-shadow:none;outline:0;font:inherit;color:inherit;line-height:var(--sdc-datepicker-input-line-height, var(--sdc-formfield-default-line-height, 1.5));padding:0;cursor:pointer}.sdc-datepicker__input::placeholder{color:var(--sdc-datepicker-placeholder-color, var(--sdc-form-placeholder-color, #9ca3af))}.sdc-datepicker__input:disabled{cursor:not-allowed}.sdc-datepicker__actions{display:flex;align-items:stretch;flex:0 0 auto}.sdc-datepicker__icon{font-size:.875rem}.sdc-datepicker__icon-button{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;border:0;background:transparent;color:var(--sdc-button-icon-default, #333333);cursor:pointer}.sdc-datepicker__icon-button:hover:not(:disabled){background:transparent}.sdc-datepicker__icon-button--clear{min-width:2rem;padding:0 .5rem}.sdc-datepicker__icon-button--toggle{min-width:2.5rem;padding:0 .75rem;border-left:1px solid var(--sdc-formfield-default-border, #ced4da)}.sdc-datepicker__panel{background:var(--sdc-datepicker-panel-bg, #fff);border:1px solid var(--sdc-datepicker-panel-border, #e5e7eb);border-radius:var(--sdc-datepicker-panel-radius, 6px);box-shadow:var(--sdc-datepicker-panel-shadow, 0 4px 12px rgba(0, 0, 0, .1));padding:0;width:var(--sdc-datepicker-panel-width, 280px);outline:none;box-sizing:border-box}.sdc-datepicker__header{display:flex;align-items:center;justify-content:space-between;padding:.5rem .75rem;border-bottom:1px solid var(--sdc-datepicker-separator-color, #e5e7eb)}.sdc-datepicker__nav-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:0;background:transparent;border-radius:var(--sdc-datepicker-nav-btn-radius, 50%);color:var(--sdc-datepicker-nav-btn-color, #374151);cursor:pointer;transition:background-color .15s ease}.sdc-datepicker__nav-btn:hover{background-color:var(--sdc-datepicker-nav-btn-hover-bg, rgba(0, 0, 0, .06))}.sdc-datepicker__title-btn{border:0;background:transparent;font-weight:600;font-size:var(--sdc-datepicker-title-font-size, .875rem);color:var(--sdc-datepicker-title-color, #111827);cursor:pointer;padding:.25rem .5rem;border-radius:4px;transition:background-color .15s ease}.sdc-datepicker__title-btn:hover{background-color:var(--sdc-datepicker-title-hover-bg, rgba(0, 0, 0, .04))}.sdc-datepicker__calendar{-webkit-user-select:none;user-select:none;padding:0 .5rem .5rem;border-collapse:collapse;border-spacing:0;width:100%}.sdc-datepicker__weekdays{display:grid;grid-template-columns:repeat(7,1fr);padding-top:.5rem}.sdc-datepicker__weekday{display:flex;align-items:center;justify-content:center;height:32px;font-size:var(--sdc-datepicker-weekday-font-size, .75rem);font-weight:600;color:var(--sdc-datepicker-weekday-color, #6b7280);text-transform:uppercase}.sdc-datepicker__days{display:grid;grid-template-columns:repeat(7,1fr);gap:var(--sdc-datepicker-day-gap, 2px)}.sdc-datepicker__days>tr{display:contents}.sdc-datepicker__days td{padding:0}.sdc-datepicker__day{display:flex;align-items:center;justify-content:center;width:var(--sdc-datepicker-day-size, 32px);height:var(--sdc-datepicker-day-size, 32px);margin:0 auto;border:0;border-radius:var(--sdc-datepicker-day-radius, 50%);background:transparent;font-size:var(--sdc-datepicker-day-font-size, .75rem);color:var(--sdc-datepicker-day-color, #111827);cursor:pointer;transition:background-color .12s ease,color .12s ease;position:relative;padding:0}.sdc-datepicker__day:hover:not(:disabled):not(.sdc-datepicker__day--selected){background-color:var(--sdc-datepicker-day-hover-bg, rgba(0, 0, 0, .06))}.sdc-datepicker__day--other-month{color:var(--sdc-datepicker-day-other-month-color, #d1d5db)}.sdc-datepicker__day--today{border:2px solid var(--sdc-datepicker-today-border-color, var(--sdc-tab-primary, #007bff))}.sdc-datepicker__day--selected{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);font-weight:600}.sdc-datepicker__day--selected:hover{background-color:var(--sdc-datepicker-selected-hover-bg, #0056b3)}.sdc-datepicker__day--disabled{opacity:var(--sdc-datepicker-disabled-opacity, .35);cursor:not-allowed}.sdc-datepicker__day--in-range{background-color:var(--sdc-datepicker-range-bg, rgba(0, 123, 255, .1));border-radius:0}.sdc-datepicker__day--range-start{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);border-radius:var(--sdc-datepicker-day-radius, 50%) 0 0 var(--sdc-datepicker-day-radius, 50%)}.sdc-datepicker__day--range-end{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);border-radius:0 var(--sdc-datepicker-day-radius, 50%) var(--sdc-datepicker-day-radius, 50%) 0}.sdc-datepicker__months-grid,.sdc-datepicker__years-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:.5rem;padding:.75rem}.sdc-datepicker__month-cell,.sdc-datepicker__year-cell{display:flex;align-items:center;justify-content:center;padding:.625rem .5rem;border:0;border-radius:var(--sdc-datepicker-cell-radius, 6px);background:transparent;font-size:.8125rem;color:var(--sdc-datepicker-cell-color, #374151);cursor:pointer;transition:background-color .12s ease}.sdc-datepicker__month-cell:hover,.sdc-datepicker__year-cell:hover{background-color:var(--sdc-datepicker-cell-hover-bg, rgba(0, 0, 0, .05))}.sdc-datepicker__month-cell--selected,.sdc-datepicker__year-cell--selected{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);font-weight:600}.sdc-datepicker__time{display:flex;align-items:center;justify-content:center;gap:.25rem;padding:.75rem;border-top:1px solid var(--sdc-datepicker-separator-color, #e5e7eb)}.sdc-datepicker__time-group{display:flex;flex-direction:column;align-items:center;gap:.125rem}.sdc-datepicker__time-btn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:24px;border:0;background:transparent;border-radius:4px;color:var(--sdc-datepicker-time-btn-color, #6b7280);cursor:pointer;transition:background-color .12s ease}.sdc-datepicker__time-btn:hover{background-color:var(--sdc-datepicker-time-btn-hover-bg, rgba(0, 0, 0, .06))}.sdc-datepicker__time-value{font-size:var(--sdc-datepicker-time-font-size, 1.125rem);font-weight:600;color:var(--sdc-datepicker-time-value-color, #111827);min-width:2ch;text-align:center}.sdc-datepicker__time-separator{font-size:1.125rem;font-weight:600;color:var(--sdc-datepicker-time-separator-color, #6b7280);padding:0 .125rem;align-self:center}.sdc-datepicker__confirm-btn{padding:.25rem .875rem;border:0;border-radius:var(--sdc-datepicker-confirm-btn-radius, 4px);background-color:var(--sdc-datepicker-confirm-btn-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-confirm-btn-color, #fff);font-size:.8125rem;font-weight:600;cursor:pointer;transition:background-color .15s ease}.sdc-datepicker__confirm-btn:hover{background-color:var(--sdc-datepicker-confirm-btn-hover-bg, #0056b3)}.sdc-datepicker__button-bar{display:flex;align-items:center;justify-content:space-between;padding:.5rem .75rem;border-top:1px solid var(--sdc-datepicker-separator-color, #e5e7eb)}.sdc-datepicker__button-bar-end{display:flex;align-items:center;gap:.5rem}.sdc-datepicker__bar-btn{padding:.25rem .75rem;border:0;border-radius:4px;background:transparent;font-size:.8125rem;font-weight:500;color:var(--sdc-datepicker-bar-btn-color, var(--sdc-tab-primary, #007bff));cursor:pointer;transition:background-color .12s ease}.sdc-datepicker__bar-btn:hover{background-color:var(--sdc-datepicker-bar-btn-hover-bg, rgba(0, 123, 255, .08))}.sdc-datepicker__backdrop{background:transparent}.message{display:block;margin-top:.25rem;font-size:var(--sdc-datepicker-message-font-size, .75rem);color:var(--sdc-datepicker-message-color, #6b7280)}.message.invalid{color:var(--sdc-datepicker-message-invalid-color, var(--sdc-error-color, #dc3545))}::ng-deep .sdc-datepicker-popover-panel{overflow:visible!important;max-width:none!important;max-height:none!important}\n"] }]
755
923
  }], propDecorators: { mode: [{
756
924
  type: Input
757
925
  }], selectionMode: [{
@@ -768,6 +936,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
768
936
  type: Input
769
937
  }], dateFormat: [{
770
938
  type: Input
939
+ }], allowTyping: [{
940
+ type: Input
771
941
  }], hourFormat: [{
772
942
  type: Input
773
943
  }], minuteStep: [{
@@ -811,4 +981,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
811
981
  type: ViewChildren,
812
982
  args: ['dayBtn']
813
983
  }] } });
814
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFFBQVEsRUFDUixVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sTUFBTSxFQUNOLFNBQVMsRUFDVCxZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixNQUFNLEVBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQWdELE1BQU0sZ0JBQWdCLENBQUM7QUFDN0gsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFcEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7O0FBWWhFLE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBQztBQUN2QixNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7QUFDMUIsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUM7QUFD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ci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgY29tcHV0ZWQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgUXVlcnlMaXN0LFxuICAgIHNpZ25hbCxcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NoaWxkcmVuLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxuICAgIGZvcndhcmRSZWYsXG4gICAgaW5qZWN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIE5HX1ZBTFVFX0FDQ0VTU09SLCBOR19WQUxJREFUT1JTLCBWYWxpZGF0b3IsIEFic3RyYWN0Q29udHJvbCwgVmFsaWRhdGlvbkVycm9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IElucHV0c0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvcmUvZGlyZWN0aXZlcy9pbnB1dHMuZGlyZWN0aXZlJztcbmltcG9ydCB7IGZvY3VzRmlyc3REZXNjZW5kYW50IH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9mb2N1cy51dGlsJztcbmltcG9ydCB7IG5leHRTZXF1ZW50aWFsSWQgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzL2lkLnV0aWwnO1xuaW1wb3J0IHsgUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJy4uL3BvcG92ZXIvcG9wb3Zlci5jb21wb25lbnQnO1xuaW1wb3J0IHR5cGUge1xuICAgIENhbGVuZGFyRGF5LFxuICAgIERhdGVQaWNrZXJNb2RlLFxuICAgIERhdGVQaWNrZXJTZWxlY3Rpb25Nb2RlLFxuICAgIERhdGVSYW5nZSxcbiAgICBEYXRlcGlja2VyTW9udGhDaGFuZ2VFdmVudCxcbiAgICBEYXRlcGlja2VyVmlld1xufSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL2RhdGVwaWNrZXIudHlwZSc7XG5cbnR5cGUgRGF0ZXBpY2tlclZhbHVlID0gRGF0ZSB8IERhdGVSYW5nZSB8IERhdGVbXSB8IG51bGw7XG5cbmNvbnN0IERBWVNfSU5fV0VFSyA9IDc7XG5jb25zdCBZRUFSU19QRVJfUEFHRSA9IDEyO1xuY29uc3QgSE9VUl9GT1JNQVRfMTJfTUFYID0gMTI7XG5jb25zdCBIT1VSX0ZPUk1BVF8yNF9NQVggPSAyMztcbmNvbnN0IFlFQVJfU0hPUlRfTEVOR1RIID0gMjtcblxuQENvbXBvbmVudCh7XG4gICAgaW1wb3J0czogW1xuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgICAgIFBvcG92ZXJDb21wb25lbnRcbiAgICBdLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICdzZGMtZGF0ZXBpY2tlcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RhdGVwaWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsOiAnLi9kYXRlcGlja2VyLmNvbXBvbmVudC5zY3NzJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZCxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEYXRlcGlja2VyQ29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEYXRlcGlja2VyQ29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlXG4gICAgICAgIH1cbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIERhdGVwaWNrZXJDb21wb25lbnQgZXh0ZW5kcyBJbnB1dHNDb21wb25lbnQ8RGF0ZXBpY2tlclZhbHVlPiBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBWYWxpZGF0b3Ige1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gICAgLy8gLS0tIElucHV0cyAtLS1cbiAgICBASW5wdXQoKSBtb2RlOiBEYXRlUGlja2VyTW9kZSA9ICdkYXRlJztcbiAgICBASW5wdXQoKSBzZWxlY3Rpb25Nb2RlOiBEYXRlUGlja2VyU2VsZWN0aW9uTW9kZSA9ICdzaW5nbGUnO1xuICAgIEBJbnB1dCgpIHNob3dJY29uID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBpY29uID0gJ2ZhcyBmYS1jYWxlbmRhcic7XG4gICAgQElucHV0KCkgbWluOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgQElucHV0KCkgbWF4OiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgQElucHV0KCkgZGVmYXVsdERhdGU6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgICBASW5wdXQoKSBkYXRlRm9ybWF0ID0gJ2RkL01NL3l5eXknO1xuICAgIEBJbnB1dCgpIGhvdXJGb3JtYXQ6ICcxMicgfCAnMjQnID0gJzI0JztcbiAgICBASW5wdXQoKSBtaW51dGVTdGVwID0gNTtcbiAgICBASW5wdXQoKSBzaG93U2Vjb25kcyA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHJhbmdlU2VwYXJhdG9yID0gJyDigJQgJztcbiAgICBASW5wdXQoKSBzaG93T25Gb2N1cyA9IHRydWU7XG4gICAgQElucHV0KCkgcmVhZG9ubHlJbnB1dCA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIGZpcnN0RGF5T2ZXZWVrID0gMDtcbiAgICBASW5wdXQoKSBzaG93QnV0dG9uQmFyID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBzaG93Q2xlYXIgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBkaXNhYmxlZERhdGVzOiBEYXRlW10gPSBbXTtcbiAgICBASW5wdXQoKSBkaXNhYmxlZERheXM6IG51bWJlcltdID0gW107XG5cbiAgICAvLyAtLS0gT3V0cHV0cyAtLS1cbiAgICBAT3V0cHV0KCkgc2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGVwaWNrZXJWYWx1ZT4oKTtcbiAgICBAT3V0cHV0KCkgY2xvc2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAgIEBPdXRwdXQoKSBtb250aENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZXBpY2tlck1vbnRoQ2hhbmdlRXZlbnQ+KCk7XG4gICAgQE91dHB1dCgpIHllYXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGVwaWNrZXJNb250aENoYW5nZUV2ZW50PigpO1xuXG4gICAgLy8gLS0tIFZpZXcgQ2hpbGRyZW4gLS0tXG4gICAgQFZpZXdDaGlsZCgnaW5wdXRSZWYnKSBpbnB1dFJlZj86IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG4gICAgQFZpZXdDaGlsZCgndHJpZ2dlclJlZicpIHRyaWdnZXJSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgICBAVmlld0NoaWxkKCdwYW5lbENvbnRlbnRSZWYnKSBwcml2YXRlIHJlYWRvbmx5IHBhbmVsQ29udGVudFJlZj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICAgIEBWaWV3Q2hpbGRyZW4oJ2RheUJ0bicpIHByaXZhdGUgcmVhZG9ubHkgZGF5QnV0dG9uUmVmcz86IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxCdXR0b25FbGVtZW50Pj47XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW5wdXRJZCA9IG5leHRTZXF1ZW50aWFsSWQoJ3NkYy1kYXRlcGlja2VyLWlucHV0Jyk7XG5cbiAgICAvLyAtLS0gU2lnbmFscyAtLS1cbiAgICBwdWJsaWMgcGFuZWxPcGVuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBzdXBwcmVzc05leHRGb2N1c09wZW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgY3VycmVudFZpZXcgPSBzaWduYWw8RGF0ZXBpY2tlclZpZXc+KCdkYXlzJyk7XG4gICAgcHVibGljIHJlYWRvbmx5IHZpZXdEYXRlID0gc2lnbmFsPERhdGU+KG5ldyBEYXRlKCkpO1xuICAgIHB1YmxpYyByZWFkb25seSBmb2N1c2VkRGF0ZSA9IHNpZ25hbDxEYXRlIHwgbnVsbD4obnVsbCk7XG5cbiAgICAvLyBUaW1lIHNpZ25hbHNcbiAgICBwdWJsaWMgcmVhZG9ubHkgaG91cnMgPSBzaWduYWwoMCk7XG4gICAgcHVibGljIHJlYWRvbmx5IG1pbnV0ZXMgPSBzaWduYWwoMCk7XG4gICAgcHVibGljIHJlYWRvbmx5IHNlY29uZHMgPSBzaWduYWwoMCk7XG5cbiAgICAvLyBSYW5nZSBzZWxlY3Rpb24gc3RhdGVcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJhbmdlU3RhcnQgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmFuZ2VFbmQgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmFuZ2VTZWxlY3RpbmcgPSBzaWduYWwoZmFsc2UpO1xuXG4gICAgLy8gLS0tIENvbXB1dGVkIC0tLVxuXG4gICAgcHVibGljIHJlYWRvbmx5IHdlZWtEYXlOYW1lcyA9IGNvbXB1dGVkKCgpOiBzdHJpbmdbXSA9PiB7XG4gICAgICAgIGNvbnN0IGRheXMgPSBbJ1N1JywgJ01vJywgJ1R1JywgJ1dlJywgJ1RoJywgJ0ZyJywgJ1NhJ107XG4gICAgICAgIGNvbnN0IHNoaWZ0ZWQ6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgREFZU19JTl9XRUVLOyBpKyspIHtcbiAgICAgICAgICAgIHNoaWZ0ZWQucHVzaChkYXlzWyhpICsgdGhpcy5maXJzdERheU9mV2VlaykgJSBEQVlTX0lOX1dFRUtdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2hpZnRlZDtcbiAgICB9KTtcblxuICAgIC8vIE5PVEU6IGludGVudGlvbmFsbHkgYSBwbGFpbiBtZXRob2QgKG5vdCBgY29tcHV0ZWQoKWApLiBgdGhpcy52YWx1ZWAgaXMgYSBwbGFpblxuICAgIC8vIEBJbnB1dCBpbmhlcml0ZWQgZnJvbSBJbnB1dHNDb21wb25lbnQsIG5vdCBhIFNpZ25hbCwgc28gd3JhcHBpbmcgdGhpcyBpbiBgY29tcHV0ZWQoKWBcbiAgICAvLyB3b3VsZCBmcmVlemUgaXQgYWZ0ZXIgdGhlIGZpcnN0IHJlYWQgKEFuZ3VsYXIgY29tcHV0ZWQoKSBvbmx5IHJlYWN0cyB0byBTaWduYWwgcmVhZHMpLlxuICAgIC8vIE9uUHVzaCArIHRoZSBleGlzdGluZyBgbWFya0ZvckNoZWNrKClgIGNhbGxzIGFmdGVyIGV2ZXJ5IHZhbHVlIG11dGF0aW9uIGtlZXAgdGhpcyBjb3JyZWN0LlxuICAgIHB1YmxpYyBjYWxlbmRhckRheXMoKTogQ2FsZW5kYXJEYXlbXSB7XG4gICAgICAgIGNvbnN0IHZpZXdEID0gdGhpcy52aWV3RGF0ZSgpO1xuICAgICAgICBjb25zdCB5ZWFyID0gdmlld0QuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgY29uc3QgbW9udGggPSB2aWV3RC5nZXRNb250aCgpO1xuICAgICAgICBjb25zdCBmaXJzdE9mTW9udGggPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0RGF5ID0gZmlyc3RPZk1vbnRoLmdldERheSgpO1xuICAgICAgICBjb25zdCBkYXlzQmVmb3JlU3RhcnQgPSAoc3RhcnREYXkgLSB0aGlzLmZpcnN0RGF5T2ZXZWVrICsgREFZU19JTl9XRUVLKSAlIERBWVNfSU5fV0VFSztcbiAgICAgICAgY29uc3Qgc3RhcnREYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDEgLSBkYXlzQmVmb3JlU3RhcnQpO1xuICAgICAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHRvZGF5LnNldEhvdXJzKDAsIDAsIDAsIDApO1xuXG4gICAgICAgIGNvbnN0IGRheXM6IENhbGVuZGFyRGF5W10gPSBbXTtcbiAgICAgICAgY29uc3QgZGF5c0luTW9udGggPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCArIDEsIDApLmdldERhdGUoKTtcbiAgICAgICAgLy8gRHluYW1pYyByb3cgY291bnQgKDUsIDYsIG9yIHJhcmVseSA0IHdlZWtzKSBpbnN0ZWFkIG9mIGEgZml4ZWQgNDItY2VsbCAoNiByb3cpIGdyaWQsXG4gICAgICAgIC8vIG1hdGNoaW5nIEFuZ3VsYXIgQ29tcG9uZW50cyBiZWhhdmlvci4gQXZvaWRzIGEgdHJhaWxpbmcgYWxsLWRpc2FibGVkL2JsYW5rIHdlZWtcbiAgICAgICAgLy8gZm9yIG1vbnRocyB0aGF0IG9ubHkgbmVlZCA1IHJvd3MuXG4gICAgICAgIGNvbnN0IHRvdGFsQ2VsbHMgPSBNYXRoLmNlaWwoKGRheXNCZWZvcmVTdGFydCArIGRheXNJbk1vbnRoKSAvIERBWVNfSU5fV0VFSykgKiBEQVlTX0lOX1dFRUs7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b3RhbENlbGxzOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShzdGFydERhdGUuZ2V0RnVsbFllYXIoKSwgc3RhcnREYXRlLmdldE1vbnRoKCksIHN0YXJ0RGF0ZS5nZXREYXRlKCkgKyBpKTtcbiAgICAgICAgICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgICAgICAgICBkYXlzLnB1c2goe1xuICAgICAgICAgICAgICAgIGRhdGUsXG4gICAgICAgICAgICAgICAgZGF5OiBkYXRlLmdldERhdGUoKSxcbiAgICAgICAgICAgICAgICBjdXJyZW50TW9udGg6IGRhdGUuZ2V0TW9udGgoKSA9PT0gbW9udGgsXG4gICAgICAgICAgICAgICAgdG9kYXk6IGRhdGUuZ2V0VGltZSgpID09PSB0b2RheS5nZXRUaW1lKCksXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IHRoaXMuaXNEYXRlU2VsZWN0ZWQoZGF0ZSksXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IHRoaXMuaXNEYXRlRGlzYWJsZWQoZGF0ZSksXG4gICAgICAgICAgICAgICAgaW5SYW5nZTogdGhpcy5pc0luUmFuZ2UoZGF0ZSksXG4gICAgICAgICAgICAgICAgcmFuZ2VTdGFydDogdGhpcy5pc1JhbmdlU3RhcnQoZGF0ZSksXG4gICAgICAgICAgICAgICAgcmFuZ2VFbmQ6IHRoaXMuaXNSYW5nZUVuZChkYXRlKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRheXM7XG4gICAgfVxuXG4gICAgLy8gR3JvdXBzIGBjYWxlbmRhckRheXMoKWAgaW50byA3LWRheSB3ZWVrcyBzbyB0aGUgdGVtcGxhdGUgY2FuIHJlbmRlciBhIHJlYWxcbiAgICAvLyA8dGFibGU+Lzx0cj4vPHRkPiBncmlkIChuYXRpdmUgcm93L2dyaWRjZWxsIHNlbWFudGljcykgaW5zdGVhZCBvZiBBUklBIHJvbGVzIG9uIDxkaXY+cy5cbiAgICBwdWJsaWMgY2FsZW5kYXJXZWVrcygpOiBDYWxlbmRhckRheVtdW10ge1xuICAgICAgICBjb25zdCBkYXlzID0gdGhpcy5jYWxlbmRhckRheXMoKTtcbiAgICAgICAgY29uc3Qgd2Vla3M6IENhbGVuZGFyRGF5W11bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRheXMubGVuZ3RoOyBpICs9IERBWVNfSU5fV0VFSykge1xuICAgICAgICAgICAgd2Vla3MucHVzaChkYXlzLnNsaWNlKGksIGkgKyBEQVlTX0lOX1dFRUspKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd2Vla3M7XG4gICAgfVxuXG4gICAgLy8gTk9URTogcGxhaW4gbWV0aG9kIGZvciB0aGUgc2FtZSByZWFzb24gYXMgYGNhbGVuZGFyRGF5c2AgYWJvdmUgKGRlcGVuZHMgb24gYHRoaXMudmFsdWVgLFxuICAgIC8vIGEgbm9uLVNpZ25hbCBASW5wdXQpLlxuICAgIHB1YmxpYyBjYWxlbmRhck1vbnRocygpOiB7IG1vbnRoOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgc2VsZWN0ZWQ6IGJvb2xlYW4gfVtdIHtcbiAgICAgICAgY29uc3QgbW9udGhOYW1lcyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXTtcbiAgICAgICAgY29uc3Qgdmlld0QgPSB0aGlzLnZpZXdEYXRlKCk7XG4gICAgICAgIHJldHVybiBtb250aE5hbWVzLm1hcCgobmFtZSwgaW5kZXgpID0+ICh7XG4gICAgICAgICAgICBtb250aDogaW5kZXgsXG4gICAgICAgICAgICBzZWxlY3RlZDogdGhpcy5pc01vbnRoU2VsZWN0ZWQoaW5kZXgsIHZpZXdELmdldEZ1bGxZZWFyKCkpLFxuICAgICAgICAgICAgbmFtZVxuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRvbmx5IHllYXJSYW5nZSA9IGNvbXB1dGVkKCgpOiBudW1iZXJbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZpZXdEID0gdGhpcy52aWV3RGF0ZSgpO1xuICAgICAgICBjb25zdCBjdXJyZW50WWVhciA9IHZpZXdELmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGNvbnN0IHN0YXJ0WWVhciA9IGN1cnJlbnRZZWFyIC0gKGN1cnJlbnRZZWFyICUgWUVBUlNfUEVSX1BBR0UpO1xuICAgICAgICBjb25zdCB5ZWFyczogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBZRUFSU19QRVJfUEFHRTsgaSsrKSB7XG4gICAgICAgICAgICB5ZWFycy5wdXNoKHN0YXJ0WWVhciArIGkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB5ZWFycztcbiAgICB9KTtcblxuICAgIC8vIE5PVEU6IHBsYWluIG1ldGhvZCBmb3IgdGhlIHNhbWUgcmVhc29uIGFzIGBjYWxlbmRhckRheXNgIGFib3ZlIChkZXBlbmRzIG9uIGB0aGlzLnZhbHVlYCxcbiAgICAvLyBhIG5vbi1TaWduYWwgQElucHV0KS5cbiAgICBwdWJsaWMgZGlzcGxheVZhbHVlKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHZhbCA9IHRoaXMudmFsdWU7XG4gICAgICAgIGlmICghdmFsKSB7IHJldHVybiAnJzsgfVxuICAgICAgICBpZiAodGhpcy5tb2RlID09PSAncmFuZ2UnKSB7XG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IHZhbCBhcyBEYXRlUmFuZ2U7XG4gICAgICAgICAgICBjb25zdCBzdGFydFN0ciA9IHJhbmdlLnN0YXJ0ID8gdGhpcy5mb3JtYXREYXRlKHJhbmdlLnN0YXJ0KSA6ICcnO1xuICAgICAgICAgICAgY29uc3QgZW5kU3RyID0gcmFuZ2UuZW5kID8gdGhpcy5mb3JtYXREYXRlKHJhbmdlLmVuZCkgOiAnJztcbiAgICAgICAgICAgIHJldHVybiBzdGFydFN0ciAmJiBlbmRTdHIgPyBgJHtzdGFydFN0cn0ke3RoaXMucmFuZ2VTZXBhcmF0b3J9JHtlbmRTdHJ9YCA6IHN0YXJ0U3RyO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdtdWx0aXBsZScgJiYgQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsLm1hcChkID0+IHRoaXMuZm9ybWF0RGF0ZShkKSkuam9pbignLCAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0RGF0ZSh2YWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgdmlld01vbnRoWWVhckxhYmVsID0gY29tcHV0ZWQoKCk6IHN0cmluZyA9PiB7XG4gICAgICAgIGNvbnN0IG1vbnRoTmFtZXMgPSBbJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLCAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLFxuICAgICAgICAgICAgJ0p1bHknLCAnQXVndXN0JywgJ1NlcHRlbWJlcicsICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ107XG4gICAgICAgIGNvbnN0IHZpZXdEID0gdGhpcy52aWV3RGF0ZSgpO1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50VmlldygpID09PSAneWVhcnMnKSB7XG4gICAgICAgICAgICBjb25zdCB5ZWFycyA9IHRoaXMueWVhclJhbmdlKCk7XG4gICAgICAgICAgICByZXR1cm4gYCR7eWVhcnNbMF19IC0gJHt5ZWFyc1t5ZWFycy5sZW5ndGggLSAxXX1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHttb250aE5hbWVzW3ZpZXdELmdldE1vbnRoKCldfSAke3ZpZXdELmdldEZ1bGxZZWFyKCl9YDtcbiAgICB9KTtcblxuICAgIHB1YmxpYyByZWFkb25seSBzaG93VGltZVBpY2tlciA9IGNvbXB1dGVkKCgpOiBib29sZWFuID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gJ2RhdGV0aW1lJyB8fCB0aGlzLm1vZGUgPT09ICd0aW1lJztcbiAgICB9KTtcblxuICAgIC8vIC0tLSBMaWZlY3ljbGUgLS0tXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmluaXRpYWxpemVWaWV3RGF0ZSgpO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgICAgICAgdGhpcy50cmFuc2xhdGUub25MYW5nQ2hhbmdlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgLy8gLS0tIENvbnRyb2xWYWx1ZUFjY2Vzc29yIG92ZXJyaWRlIC0tLVxuICAgIHB1YmxpYyBvdmVycmlkZSB3cml0ZVZhbHVlKHZhbHVlOiBEYXRlcGlja2VyVmFsdWUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZSh2YWx1ZS5nZXRGdWxsWWVhcigpLCB2YWx1ZS5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgICAgICB0aGlzLmhvdXJzLnNldCh2YWx1ZS5nZXRIb3VycygpKTtcbiAgICAgICAgICAgIHRoaXMubWludXRlcy5zZXQodmFsdWUuZ2V0TWludXRlcygpKTtcbiAgICAgICAgICAgIHRoaXMuc2Vjb25kcy5zZXQodmFsdWUuZ2V0U2Vjb25kcygpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvLyAtLS0gVmFsaWRhdG9yIC0tLVxuICAgIHB1YmxpYyB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHZhbCA9IGNvbnRyb2wudmFsdWU7XG4gICAgICAgIGlmICghdmFsKSB7IHJldHVybiBudWxsOyB9XG5cbiAgICAgICAgaWYgKHRoaXMubWluICYmIHZhbCBpbnN0YW5jZW9mIERhdGUgJiYgdmFsIDwgdGhpcy5taW4pIHtcbiAgICAgICAgICAgIHJldHVybiB7IHNkY0RhdGVwaWNrZXJNaW46IHsgbWluOiB0aGlzLm1pbiwgYWN0dWFsOiB2YWwgfSB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1heCAmJiB2YWwgaW5zdGFuY2VvZiBEYXRlICYmIHZhbCA+IHRoaXMubWF4KSB7XG4gICAgICAgICAgICByZXR1cm4geyBzZGNEYXRlcGlja2VyTWF4OiB7IG1heDogdGhpcy5tYXgsIGFjdHVhbDogdmFsIH0gfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyAtLS0gUGFuZWwgYWN0aW9ucyAtLS1cbiAgICBwdWJsaWMgb3BlblBhbmVsKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnBhbmVsT3BlbikgeyByZXR1cm47IH1cbiAgICAgICAgdGhpcy5wYW5lbE9wZW4gPSB0cnVlO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVWaWV3RGF0ZSgpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7IC8vIEZvcmNlIGltbWVkaWF0ZSBDRCBmb3IgQ0RLIG92ZXJsYXlcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xvc2VQYW5lbCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnBhbmVsT3BlbikgeyByZXR1cm47IH1cbiAgICAgICAgdGhpcy5wYW5lbE9wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jbG9zZWQuZW1pdCgpO1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7IC8vIEZvcmNlIGltbWVkaWF0ZSBDRCBmb3IgQ0RLIG92ZXJsYXlcbiAgICB9XG5cbiAgICAvLyBDbG9zZXMgdGhlIHBhbmVsIGFuZCByZXR1cm5zIGZvY3VzIHRvIHRoZSB0cmlnZ2VyIGlucHV0LiBPbmx5IHVzZWQgZm9yIGNsb3NlcyBkcml2ZW5cbiAgICAvLyBkaXJlY3RseSBieSBhbiBpbi13aWRnZXQgYWN0aW9uIChFc2NhcGUsIGEgZGF5L2Zvb3Rlci1idXR0b24gc2VsZWN0aW9uKSDigJQgdGhlIGRheSBidXR0b25cbiAgICAvLyBvciBmb290ZXIgYnV0dG9uIHRoYXQgaGFkIGZvY3VzIGlzIGFib3V0IHRvIGJlIGRlc3Ryb3llZCwgc28gcmVzdG9yaW5nIGZvY3VzIHRvIHRoZSBpbnB1dFxuICAgIC8vIGlzIGFsd2F5cyBjb3JyZWN0IHRoZXJlLiBOT1QgdXNlZCBmb3IgYG9uUG9wb3Zlck9wZW5DaGFuZ2VgIChvdXRzaWRlLWNsaWNrKSwgd2hlcmUgZm9yY2luZ1xuICAgIC8vIGZvY3VzIGJhY2sgd291bGQgZmlnaHQgdGhlIGNsaWNrIHRoZSB1c2VyIGp1c3QgbWFkZSBvbiBzb21ldGhpbmcgZWxzZS5cbiAgICBwcml2YXRlIGNsb3NlUGFuZWxBbmRGb2N1c0lucHV0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICAgICAgLy8gYHNob3dPbkZvY3VzYCByZW9wZW5zIHRoZSBwYW5lbCBvbiAoZm9jdXMpIOKAlCB3aXRob3V0IHRoaXMgZ3VhcmQsIGZvY3VzaW5nIHRoZSBpbnB1dFxuICAgICAgICAvLyBiYWNrIGhlcmUgd291bGQgaW1tZWRpYXRlbHkgcmVvcGVuIHRoZSBwYW5lbCB3ZSBqdXN0IGNsb3NlZC5cbiAgICAgICAgdGhpcy5zdXBwcmVzc05leHRGb2N1c09wZW4gPSB0cnVlO1xuICAgICAgICB0aGlzLmlucHV0UmVmPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b2dnbGVQYW5lbCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucGFuZWxPcGVuKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub3BlblBhbmVsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25JbnB1dENsaWNrKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zaG93T25Gb2N1cyAmJiAhdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5vcGVuUGFuZWwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbklucHV0Rm9jdXMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN1cHByZXNzTmV4dEZvY3VzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5zdXBwcmVzc05leHRGb2N1c09wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uSW5wdXRDbGljaygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbk92ZXJsYXlLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlUGFuZWxBbmRGb2N1c0lucHV0KCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnVGFiJyAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgdGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNJbnRvUGFuZWwoZXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLmN1cnJlbnRWaWV3KCk7XG4gICAgICAgIGlmICh2aWV3ID09PSAnZGF5cycpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRGF5c0tleWRvd24oZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGFiIGZyb20gdGhlIGlucHV0IHdvdWxkIG90aGVyd2lzZSBlc2NhcGUgc3RyYWlnaHQgcGFzdCB0aGUgY2FsZW5kYXI6IHRoZSBwb3BvdmVyJ3MgcGFuZWxcbiAgICAvLyBpcyBwb3J0YWxlZCB0byA8Ym9keT4gKGZhciBmcm9tIHRoZSBpbnB1dCBpbiBET00gb3JkZXIpLCBzbyB3aXRob3V0IHRoaXMgaXQganVtcHMgdG9cbiAgICAvLyB3aGF0ZXZlciBwYWdlIGVsZW1lbnQgaGFwcGVucyB0byBjb21lIG5leHQsIG5ldmVyIHJlYWNoaW5nIHRoZSBjYWxlbmRhciBhdCBhbGwuIFRoaXNcbiAgICAvLyByZWRpcmVjdHMgVGFiIGludG8gdGhlIHBhbmVsIGluc3RlYWQg4oCUIGRlbGliZXJhdGVseSBOT1QgZG9uZSBvbiBvcGVuL2ZvY3VzIChlLmcuIHZpYVxuICAgIC8vIGBmb2N1c09uT3BlbmApLCB3aGljaCB3b3VsZCBzdGVhbCBmb2N1cyBmcm9tIHRoZSBpbnB1dCBhbmQgYnJlYWsgdHlwaW5nIGEgZGF0ZSBtYW51YWxseS5cbiAgICBwcml2YXRlIGZvY3VzSW50b1BhbmVsKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRWaWV3KCkgPT09ICdkYXlzJykge1xuICAgICAgICAgICAgY29uc3QgZGF5cyA9IHRoaXMuY2FsZW5kYXJEYXlzKCk7XG4gICAgICAgICAgICBjb25zdCBhY3RpdmVEYXRlID0gdGhpcy5mb2N1c2VkRGF0ZSgpXG4gICAgICAgICAgICAgICAgPz8gZGF5cy5maW5kKGQgPT4gZC50b2RheSk/LmRhdGVcbiAgICAgICAgICAgICAgICA/PyBkYXlzLmZpbmQoZCA9PiBkLmN1cnJlbnRNb250aCk/LmRhdGU7XG5cbiAgICAgICAgICAgIGlmIChhY3RpdmVEYXRlKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzRGF5QnV0dG9uKGFjdGl2ZURhdGUpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5wYW5lbENvbnRlbnRSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGlmIChwYW5lbCkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGZvY3VzRmlyc3REZXNjZW5kYW50KHBhbmVsLCBwYW5lbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCb3VuZCBvbiB0aGUgY2FsZW5kYXIgZ3JpZCBpdHNlbGYgKGAuc2RjLWRhdGVwaWNrZXJfX2RheXNgKSwgd2hpY2ggbGl2ZXMgaW4gdGhlIHBvcG92ZXInc1xuICAgIC8vIHBvcnRhbCDigJQgYSBzZXBhcmF0ZSBET00gc3VidHJlZSBmcm9tIHRoZSBpbnB1dCwgc28gYG9uS2V5ZG93bmAgYWJvdmUgKGJvdW5kIG9uIHRoZSBpbnB1dClcbiAgICAvLyBuZXZlciBzZWVzIGtleWRvd25zIHRoYXQgb3JpZ2luYXRlIGZyb20gYSBkYXkgYnV0dG9uIHRoYXQgYWxyZWFkeSBoYXMgcmVhbCBmb2N1cy4gT25seVxuICAgIC8vIGFycm93IGtleXMgYXJlIGZvcndhcmRlZCBoZXJlOiBFbnRlci9TcGFjZSBhcmUgbGVmdCB0byB0aGUgYnV0dG9uJ3MgbmF0aXZlIGFjdGl2YXRpb25cbiAgICAvLyAod2hpY2ggYWxyZWFkeSBmaXJlcyBgc2VsZWN0RGF5YCB2aWEgYChjbGljaylgKSwgb3RoZXJ3aXNlIHRoZXknZCBkb3VibGUtZmlyZS5cbiAgICBwdWJsaWMgb25EYXlzR3JpZEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFZpZXcoKSAhPT0gJ2RheXMnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LmtleSAhPT0gJ0Fycm93TGVmdCcgJiYgZXZlbnQua2V5ICE9PSAnQXJyb3dSaWdodCcgJiYgZXZlbnQua2V5ICE9PSAnQXJyb3dVcCcgJiYgZXZlbnQua2V5ICE9PSAnQXJyb3dEb3duJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGFuZGxlRGF5c0tleWRvd24oZXZlbnQpO1xuICAgIH1cblxuICAgIC8vIC0tLSBOYXZpZ2F0aW9uIC0tLVxuICAgIHB1YmxpYyBwcmV2TW9udGgoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGQgPSB0aGlzLnZpZXdEYXRlKCk7XG4gICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksIGQuZ2V0TW9udGgoKSAtIDEsIDEpO1xuICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXdEYXRlKTtcbiAgICAgICAgdGhpcy5tb250aENoYW5nZS5lbWl0KHsgbW9udGg6IG5ld0RhdGUuZ2V0TW9udGgoKSArIDEsIHllYXI6IG5ld0RhdGUuZ2V0RnVsbFllYXIoKSB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmV4dE1vbnRoKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBkID0gdGhpcy52aWV3RGF0ZSgpO1xuICAgICAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLCBkLmdldE1vbnRoKCkgKyAxLCAxKTtcbiAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3RGF0ZSk7XG4gICAgICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh7IG1vbnRoOiBuZXdEYXRlLmdldE1vbnRoKCkgKyAxLCB5ZWFyOiBuZXdEYXRlLmdldEZ1bGxZZWFyKCkgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXZZZWFyKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBkID0gdGhpcy52aWV3RGF0ZSgpO1xuICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCkgLSAxLCBkLmdldE1vbnRoKCksIDEpKTtcbiAgICAgICAgdGhpcy55ZWFyQ2hhbmdlLmVtaXQoeyBtb250aDogZC5nZXRNb250aCgpICsgMSwgeWVhcjogZC5nZXRGdWxsWWVhcigpIC0gMSB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmV4dFllYXIoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGQgPSB0aGlzLnZpZXdEYXRlKCk7XG4gICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKGQuZ2V0RnVsbFllYXIoKSArIDEsIGQuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICB0aGlzLnllYXJDaGFuZ2UuZW1pdCh7IG1vbnRoOiBkLmdldE1vbnRoKCkgKyAxLCB5ZWFyOiBkLmdldEZ1bGxZZWFyKCkgKyAxIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmV2WWVhclJhbmdlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBkID0gdGhpcy52aWV3RGF0ZSgpO1xuICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCkgLSBZRUFSU19QRVJfUEFHRSwgZC5nZXRNb250aCgpLCAxKSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5leHRZZWFyUmFuZ2UoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGQgPSB0aGlzLnZpZXdEYXRlKCk7XG4gICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKGQuZ2V0RnVsbFllYXIoKSArIFlFQVJTX1BFUl9QQUdFLCBkLmdldE1vbnRoKCksIDEpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3dpdGNoVG9Nb250aFZpZXcoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY3VycmVudFZpZXcuc2V0KCdtb250aHMnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3dpdGNoVG9ZZWFyVmlldygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jdXJyZW50Vmlldy5zZXQoJ3llYXJzJyk7XG4gICAgfVxuXG4gICAgcHVibGljIHNlbGVjdE1vbnRoKG1vbnRoOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZCA9IHRoaXMudmlld0RhdGUoKTtcbiAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLCBtb250aCwgMSkpO1xuICAgICAgICBpZiAodGhpcy5tb2RlID09PSAnbW9udGgnKSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZERhdGUgPSBuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksIG1vbnRoLCAxKTtcbiAgICAgICAgICAgIHRoaXMuY29tbWl0RGF0ZVZhbHVlKHNlbGVjdGVkRGF0ZSk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlUGFuZWxBbmRGb2N1c0lucHV0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRWaWV3LnNldCgnZGF5cycpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh7IG1vbnRoOiBtb250aCArIDEsIHllYXI6IGQuZ2V0RnVsbFllYXIoKSB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VsZWN0WWVhcih5ZWFyOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZCA9IHRoaXMudmlld0RhdGUoKTtcbiAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUoeWVhciwgZC5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgIHRoaXMuY3VycmVudFZpZXcuc2V0KCdtb250aHMnKTtcbiAgICAgICAgdGhpcy55ZWFyQ2hhbmdlLmVtaXQoeyBtb250aDogZC5nZXRNb250aCgpICsgMSwgeWVhciB9KTtcbiAgICB9XG5cbiAgICAvLyAtLS0gRGF5IHNlbGVjdGlvbiAtLS1cbiAgICBwdWJsaWMgc2VsZWN0RGF5KGRheTogQ2FsZW5kYXJEYXkpOiB2b2lkIHtcbiAgICAgICAgaWYgKGRheS5kaXNhYmxlZCkgeyByZXR1cm47IH1cblxuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoZGF5LmRhdGUpO1xuXG4gICAgICAgIGlmICh0aGlzLm1vZGUgPT09ICdyYW5nZScpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUmFuZ2VTZWxlY3Rpb24oZGF0ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnbXVsdGlwbGUnKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZU11bHRpcGxlU2VsZWN0aW9uKGRhdGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2luZ2xlIHNlbGVjdGlvblxuICAgICAgICBpZiAodGhpcy5zaG93VGltZVBpY2tlcigpKSB7XG4gICAgICAgICAgICBkYXRlLnNldEhvdXJzKHRoaXMuaG91cnMoKSwgdGhpcy5taW51dGVzKCksIHRoaXMuc2Vjb25kcygpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbW1pdERhdGVWYWx1ZShkYXRlKTtcblxuICAgICAgICBpZiAodGhpcy5tb2RlID09PSAnZGF0ZScpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbEFuZEZvY3VzSW5wdXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIC0tLSBUaW1lIC0tLVxuICAgIHB1YmxpYyBpbmNyZW1lbnRIb3VycygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5ob3VyRm9ybWF0ID09PSAnMTInID8gSE9VUl9GT1JNQVRfMTJfTUFYIDogSE9VUl9GT1JNQVRfMjRfTUFYO1xuICAgICAgICB0aGlzLmhvdXJzLnNldCgodGhpcy5ob3VycygpICsgMSkgJSAobWF4ICsgMSkpO1xuICAgICAgICB0aGlzLnVwZGF0ZVRpbWVPblZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlY3JlbWVudEhvdXJzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBtYXggPSB0aGlzLmhvdXJGb3JtYXQgPT09ICcxMicgPyBIT1VSX0ZPUk1BVF8xMl9NQVggOiBIT1VSX0ZPUk1BVF8yNF9NQVg7XG4gICAgICAgIHRoaXMuaG91cnMuc2V0KCh0aGlzLmhvdXJzKCkgLSAxICsgKG1heCArIDEpKSAlIChtYXggKyAxKSk7XG4gICAgICAgIHRoaXMudXBkYXRlVGltZU9uVmFsdWUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5jcmVtZW50TWludXRlcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5taW51dGVzLnNldCgodGhpcy5taW51dGVzKCkgKyB0aGlzLm1pbnV0ZVN0ZXApICUgNjApO1xuICAgICAgICB0aGlzLnVwZGF0ZVRpbWVPblZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlY3JlbWVudE1pbnV0ZXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWludXRlcy5zZXQoKHRoaXMubWludXRlcygpIC0gdGhpcy5taW51dGVTdGVwICsgNjApICUgNjApO1xuICAgICAgICB0aGlzLnVwZGF0ZVRpbWVPblZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGluY3JlbWVudFNlY29uZHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2Vjb25kcy5zZXQoKHRoaXMuc2Vjb25kcygpICsgMSkgJSA2MCk7XG4gICAgICAgIHRoaXMudXBkYXRlVGltZU9uVmFsdWUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVjcmVtZW50U2Vjb25kcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWNvbmRzLnNldCgodGhpcy5zZWNvbmRzKCkgLSAxICsgNjApICUgNjApO1xuICAgICAgICB0aGlzLnVwZGF0ZVRpbWVPblZhbHVlKCk7XG4gICAgfVxuXG4gICAgLy8gLS0tIEJ1dHRvbiBiYXIgYWN0aW9ucyAtLS1cbiAgICBwdWJsaWMgc2VsZWN0VG9kYXkoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICB0aGlzLmhvdXJzLnNldCh0b2RheS5nZXRIb3VycygpKTtcbiAgICAgICAgICAgIHRoaXMubWludXRlcy5zZXQodG9kYXkuZ2V0TWludXRlcygpKTtcbiAgICAgICAgICAgIHRoaXMuc2Vjb25kcy5zZXQodG9kYXkuZ2V0U2Vjb25kcygpKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVGltZU9uVmFsdWUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRvZGF5LnNldEhvdXJzKHRoaXMuaG91cnMoKSwgdGhpcy5taW51dGVzKCksIHRoaXMuc2Vjb25kcygpKTtcbiAgICAgICAgICAgIHRoaXMuY29tbWl0RGF0ZVZhbHVlKHRvZGF5KTtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKHRvZGF5LmdldEZ1bGxZZWFyKCksIHRvZGF5LmdldE1vbnRoKCksIDEpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsb3NlUGFuZWxBbmRGb2N1c0lucHV0KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyVmFsdWUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKG51bGwpO1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQobnVsbCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChudWxsKTtcbiAgICAgICAgdGhpcy5yYW5nZVN0YXJ0LnNldChudWxsKTtcbiAgICAgICAgdGhpcy5yYW5nZUVuZC5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMucmFuZ2VTZWxlY3Rpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbmZpcm1EYXRlVGltZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkID0gbmV3IERhdGUodGhpcy52YWx1ZSk7XG4gICAgICAgICAgICB1cGRhdGVkLnNldEhvdXJzKHRoaXMuaG91cnMoKSwgdGhpcy5taW51dGVzKCksIHRoaXMuc2Vjb25kcygpKTtcbiAgICAgICAgICAgIHRoaXMuY29tbWl0RGF0ZVZhbHVlKHVwZGF0ZWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xvc2VQYW5lbEFuZEZvY3VzSW5wdXQoKTtcbiAgICB9XG5cbiAgICAvLyAtLS0gUG9wb3ZlciBldmVudHMgLS0tXG4gICAgcHVibGljIG9uUG9wb3Zlck9wZW5DaGFuZ2Uob3BlbjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAoIW9wZW4gJiYgdGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gLS0tIFByaXZhdGUgaGVscGVycyAtLS1cbiAgICBwcml2YXRlIGluaXRpYWxpemVWaWV3RGF0ZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZSh0aGlzLnZhbHVlLmdldEZ1bGxZZWFyKCksIHRoaXMudmFsdWUuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGVmYXVsdERhdGUpIHtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKHRoaXMuZGVmYXVsdERhdGUuZ2V0RnVsbFllYXIoKSwgdGhpcy5kZWZhdWx0RGF0ZS5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUobm93LmdldEZ1bGxZZWFyKCksIG5vdy5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5tb2RlID09PSAnbW9udGgnKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRWaWV3LnNldCgnbW9udGhzJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRWaWV3LnNldCgnZGF5cycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb21taXREYXRlVmFsdWUoZGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbHVlID0gZGF0ZTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZShkYXRlKTtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KGRhdGUpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQoZGF0ZSk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlUmFuZ2VTZWxlY3Rpb24oZGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMucmFuZ2VTZWxlY3RpbmcoKSkge1xuICAgICAgICAgICAgLy8gRmlyc3QgY2xpY2s6IHNldCBzdGFydFxuICAgICAgICAgICAgdGhpcy5yYW5nZVN0YXJ0LnNldChkYXRlKTtcbiAgICAgICAgICAgIHRoaXMucmFuZ2VFbmQuc2V0KG51bGwpO1xuICAgICAgICAgICAgdGhpcy5yYW5nZVNlbGVjdGluZy5zZXQodHJ1ZSk7XG4gICAgICAgICAgICBjb25zdCByYW5nZTogRGF0ZVJhbmdlID0geyBzdGFydDogZGF0ZSwgZW5kOiBudWxsIH07XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gcmFuZ2U7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHJhbmdlKTtcbiAgICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChyYW5nZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBTZWNvbmQgY2xpY2s6IHNldCBlbmRcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMucmFuZ2VTdGFydCgpID8/IGRhdGU7XG4gICAgICAgICAgICBsZXQgZW5kID0gZGF0ZTtcbiAgICAgICAgICAgIGlmIChlbmQgPCBzdGFydCkge1xuICAgICAgICAgICAgICAgIFtzdGFydCwgZW5kXSA9IFtlbmQsIHN0YXJ0XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmFuZ2VTdGFydC5zZXQoc3RhcnQpO1xuICAgICAgICAgICAgdGhpcy5yYW5nZUVuZC5zZXQoZW5kKTtcbiAgICAgICAgICAgIHRoaXMucmFuZ2VTZWxlY3Rpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlOiBEYXRlUmFuZ2UgPSB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSByYW5nZTtcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2UocmFuZ2UpO1xuICAgICAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHJhbmdlKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChyYW5nZSk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlUGFuZWxBbmRGb2N1c0lucHV0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVNdWx0aXBsZVNlbGVjdGlvbihkYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpID8gdGhpcy52YWx1ZSA6IFtdO1xuICAgICAgICBjb25zdCBpbmRleCA9IGN1cnJlbnQuZmluZEluZGV4KGQgPT4gdGhpcy5pc1NhbWVEYXkoZCwgZGF0ZSkpO1xuICAgICAgICBsZXQgdXBkYXRlZDogRGF0ZVtdO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgdXBkYXRlZCA9IFsuLi5jdXJyZW50LnNsaWNlKDAsIGluZGV4KSwgLi4uY3VycmVudC5zbGljZShpbmRleCArIDEpXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVwZGF0ZWQgPSBbLi4uY3VycmVudCwgZGF0ZV07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWx1ZSA9IHVwZGF0ZWQ7XG4gICAgICAgIHRoaXMub25DaGFuZ2UodXBkYXRlZCk7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh1cGRhdGVkKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5lbWl0KHVwZGF0ZWQpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVRpbWVPblZhbHVlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5tb2RlID09PSAndGltZScpIHtcbiAgICAgICAgICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgZC5zZXRIb3Vycyh0aGlzLmhvdXJzKCksIHRoaXMubWludXRlcygpLCB0aGlzLnNlY29uZHMoKSwgMCk7XG4gICAgICAgICAgICB0aGlzLmNvbW1pdERhdGVWYWx1ZShkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy52YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWQgPSBuZXcgRGF0ZSh0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIHVwZGF0ZWQuc2V0SG91cnModGhpcy5ob3VycygpLCB0aGlzLm1pbnV0ZXMoKSwgdGhpcy5zZWNvbmRzKCkpO1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHVwZGF0ZWQ7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHVwZGF0ZWQpO1xuICAgICAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHVwZGF0ZWQpO1xuICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGlzRGF0ZVNlbGVjdGVkKGRhdGU6IERhdGUpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgdmFsID0gdGhpcy52YWx1ZTtcbiAgICAgICAgaWYgKCF2YWwpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ3JhbmdlJykge1xuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSB2YWwgYXMgRGF0ZVJhbmdlO1xuICAgICAgICAgICAgcmV0dXJuICghIXJhbmdlLnN0YXJ0ICYmIHRoaXMuaXNTYW1lRGF5KHJhbmdlLnN0YXJ0LCBkYXRlKSkgfHxcbiAgICAgICAgICAgICAgICAoISFyYW5nZS5lbmQgJiYgdGhpcy5pc1NhbWVEYXkocmFuZ2UuZW5kLCBkYXRlKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnbXVsdGlwbGUnICYmIEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5zb21lKGQgPT4gdGhpcy5pc1NhbWVEYXkoZCwgZGF0ZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzU2FtZURheSh2YWwsIGRhdGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzRGF0ZURpc2FibGVkKGRhdGU6IERhdGUpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMubWluICYmIGRhdGUgPCB0aGlzLm1pbikgeyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICBpZiAodGhpcy5tYXggJiYgZGF0ZSA+IHRoaXMubWF4KSB7IHJldHVybiB0cnVlOyB9XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkRGF5cy5pbmNsdWRlcyhkYXRlLmdldERheSgpKSkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZERhdGVzLnNvbWUoZCA9PiB0aGlzLmlzU2FtZURheShkLCBkYXRlKSkpIHsgcmV0dXJuIHRydWU7IH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNJblJhbmdlKGRhdGU6IERhdGUpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMubW9kZSAhPT0gJ3JhbmdlJykgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgY29uc3QgdmFsID0gdGhpcy52YWx1ZSBhcyBEYXRlUmFuZ2UgfCBudWxsO1xuICAgICAgICBpZiAoIXZhbD8uc3RhcnQgfHwgIXZhbD8uZW5kKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICByZXR1cm4gZGF0ZSA+IHZhbC5zdGFydCAmJiBkYXRlIDwgdmFsLmVuZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzUmFuZ2VTdGFydChkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLm1vZGUgIT09ICdyYW5nZScpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgIGNvbnN0IHZhbCA9IHRoaXMudmFsdWUgYXMgRGF0ZVJhbmdlIHwgbnVsbDtcbiAgICAgICAgcmV0dXJuICEhdmFsPy5zdGFydCAmJiB0aGlzLmlzU2FtZURheSh2YWwuc3RhcnQsIGRhdGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNSYW5nZUVuZChkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLm1vZGUgIT09ICdyYW5nZScpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgIGNvbnN0IHZhbCA9IHRoaXMudmFsdWUgYXMgRGF0ZVJhbmdlIHwgbnVsbDtcbiAgICAgICAgcmV0dXJuICEhdmFsPy5lbmQgJiYgdGhpcy5pc1NhbWVEYXkodmFsLmVuZCwgZGF0ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc01vbnRoU2VsZWN0ZWQobW9udGg6IG51bWJlciwgeWVhcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHZhbCA9IHRoaXMudmFsdWU7XG4gICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsLmdldE1vbnRoKCkgPT09IG1vbnRoICYmIHZhbC5nZXRGdWxsWWVhcigpID09PSB5ZWFyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzU2FtZURheShhOiBEYXRlLCBiOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBhLmdldEZ1bGxZZWFyKCkgPT09IGIuZ2V0RnVsbFllYXIoKSAmJlxuICAgICAgICAgICAgYS5nZXRNb250aCgpID09PSBiLmdldE1vbnRoKCkgJiZcbiAgICAgICAgICAgIGEuZ2V0RGF0ZSgpID09PSBiLmdldERhdGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZURheXNLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZvY3VzZWQgPSB0aGlzLmZvY3VzZWREYXRlKCkgPz8gdGhpcy52aWV3RGF0ZSgpO1xuICAgICAgICBsZXQgbmV3RGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICAgICAgICBjYXNlICdBcnJvd0xlZnQnOlxuICAgICAgICAgICAgICAgIG5ld0RhdGUgPSBuZXcgRGF0ZShmb2N1c2VkLmdldEZ1bGxZZWFyKCksIGZvY3VzZWQuZ2V0TW9udGgoKSwgZm9jdXNlZC5nZXREYXRlKCkgLSAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxuICAgICAgICAgICAgICAgIG5ld0RhdGUgPSBuZXcgRGF0ZShmb2N1c2VkLmdldEZ1bGxZZWFyKCksIGZvY3VzZWQuZ2V0TW9udGgoKSwgZm9jdXNlZC5nZXREYXRlKCkgKyAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgICAgIG5ld0RhdGUgPSBuZXcgRGF0ZShmb2N1c2VkLmdldEZ1bGxZZWFyKCksIGZvY3VzZWQuZ2V0TW9udGgoKSwgZm9jdXNlZC5nZXREYXRlKCkgLSBEQVlTX0lOX1dFRUspO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgICAgICBuZXdEYXRlID0gbmV3IERhdGUoZm9jdXNlZC5nZXRGdWxsWWVhcigpLCBmb2N1c2VkLmdldE1vbnRoKCksIGZvY3VzZWQuZ2V0RGF0ZSgpICsgREFZU19JTl9XRUVLKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgICAgIGNhc2UgJyAnOlxuICAgICAgICAgICAgICAgIGlmIChmb2N1c2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0RGF5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU6IGZvY3VzZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXk6IGZvY3VzZWQuZ2V0RGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE1vbnRoOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9kYXk6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IHRoaXMuaXNEYXRlRGlzYWJsZWQoZm9jdXNlZCksXG4gICAgICAgICAgICAgICAgICAgICAgICBpblJhbmdlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlU3RhcnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VFbmQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5ld0RhdGUpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWREYXRlLnNldChuZXdEYXRlKTtcbiAgICAgICAgICAgIC8vIE5hdmlnYXRlIG1vbnRoIGlmIG5lZWRlZFxuICAgICAgICAgICAgaWYgKG5ld0RhdGUuZ2V0TW9udGgoKSAhPT0gdGhpcy52aWV3RGF0ZSgpLmdldE1vbnRoKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZShuZXdEYXRlLmdldEZ1bGxZZWFyKCksIG5ld0RhdGUuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU3luY2hyb25vdXMgc28gdGhlIChwb3NzaWJseSBuZXcgbW9udGgncykgZGF5IGJ1dHRvbnMgZXhpc3QgYmVmb3JlIHdlIGZvY3VzIG9uZS5cbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNEYXlCdXR0b24obmV3RGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNb3ZlcyByZWFsIERPTSBmb2N1cyBvbnRvIHRoZSBkYXkgYnV0dG9uIG1hdGNoaW5nIGBkYXRlYCwga2VlcGluZyByb3ZpbmcgdGFiaW5kZXgvZm9jdXNcbiAgICAvLyBpbiBzeW5jIHdpdGggYGZvY3VzZWREYXRlYCDigJQgd2l0aG91dCB0aGlzLCBhcnJvdy1rZXkgbmF2aWdhdGlvbiBvbmx5IHVwZGF0ZWQgaW50ZXJuYWxcbiAgICAvLyBzdGF0ZSBhbmQgdGhlIHZpc2libGUgYnJvd3Nlci9zY3JlZW4tcmVhZGVyIGZvY3VzIG5ldmVyIGFjdHVhbGx5IG1vdmVkLlxuICAgIHByaXZhdGUgZm9jdXNEYXlCdXR0b24oZGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuY2FsZW5kYXJEYXlzKCkuZmluZEluZGV4KGRheSA9PiB0aGlzLmlzU2FtZURheShkYXkuZGF0ZSwgZGF0ZSkpO1xuICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXlCdXR0b25SZWZzPy50b0FycmF5KClbaW5kZXhdPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5lcyB3aGljaCBkYXkgaXMgdGhlIGNhbGVuZGFyIGdyaWQncyBzaW5nbGUgcm92aW5nIHRhYmluZGV4PTAgc3RvcDogdGhlIGxhc3RcbiAgICAvLyBrZXlib2FyZC1mb2N1c2VkIGRheSBpZiBhbnksIG90aGVyd2lzZSB0b2RheSAoaWYgdmlzaWJsZSBpbiB0aGUgY3VycmVudCBtb250aCksIG90aGVyd2lzZVxuICAgIC8vIHRoZSBmaXJzdCBkYXkgYmVsb25naW5nIHRvIHRoZSBjdXJyZW50IG1vbnRoIOKAlCBzbyB0aGUgZ3JpZCBhbHdheXMgaGFzIGV4YWN0bHkgb25lIHRhYiBzdG9wLlxuICAgIHB1YmxpYyBpc0RheVRhYlN0b3AoZGF5OiBDYWxlbmRhckRheSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBmb2N1c2VkID0gdGhpcy5mb2N1c2VkRGF0ZSgpO1xuICAgICAgICBpZiAoZm9jdXNlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNTYW1lRGF5KGRheS5kYXRlLCBmb2N1c2VkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRheXMgPSB0aGlzLmNhbGVuZGFyRGF5cygpO1xuICAgICAgICBpZiAoZGF5cy5zb21lKGQgPT4gZC50b2RheSkpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXkudG9kYXk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdEN1cnJlbnRNb250aERheSA9IGRheXMuZmluZChkID0+IGQuY3VycmVudE1vbnRoKSA/PyBkYXlzWzBdO1xuICAgICAgICByZXR1cm4gZmlyc3RDdXJyZW50TW9udGhEYXkgPyB0aGlzLmlzU2FtZURheShkYXkuZGF0ZSwgZmlyc3RDdXJyZW50TW9udGhEYXkuZGF0ZSkgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZvcm1hdERhdGUoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGQgPSBkYXRlLmdldERhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICAgIGNvbnN0IG0gPSAoZGF0ZS5nZXRNb250aCgpICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgICBjb25zdCB5ID0gZGF0ZS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IGhoID0gZGF0ZS5nZXRIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgICAgY29uc3QgbW0gPSBkYXRlLmdldE1pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICAgIGNvbnN0IHNzID0gZGF0ZS5nZXRTZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuXG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLmRhdGVGb3JtYXRcbiAgICAgICAgICAgIC5yZXBsYWNlKCdkZCcsIGQpXG4gICAgICAgICAgICAucmVwbGFjZSgnTU0nLCBtKVxuICAgICAgICAgICAgLnJlcGxhY2UoJ3l5eXknLCB5KVxuICAgICAgICAgICAgLnJlcGxhY2UoJ3l5JywgeS5zbGljZSgtWUVBUl9TSE9SVF9MRU5HVEgpKTtcblxuICAgICAgICBpZiAodGhpcy5tb2RlID09PSAnZGF0ZXRpbWUnKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gYCAke2hofToke21tfWA7XG4gICAgICAgICAgICBpZiAodGhpcy5zaG93U2Vjb25kcykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBgOiR7c3N9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm1vZGUgPT09ICd0aW1lJykge1xuICAgICAgICAgICAgcmVzdWx0ID0gYCR7aGh9OiR7bW19YDtcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3dTZWNvbmRzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGA6JHtzc31gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFkVGltZShuOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gbi50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInNkYy1kYXRlcGlja2VyXCI+XG4gIEBpZiAobGFiZWxLZXkoKSkge1xuICAgIDxkaXYgY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9fbGFiZWwtcm93XCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9fbGFiZWxcIiBbYXR0ci5mb3JdPVwiaW5wdXRJZFwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1kYXRlcGlja2VyX19sYWJlbC10ZXh0XCI+XG4gICAgICAgICAge3sgbGFiZWxLZXkoKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIEBpZiAocmVxdWlyZWQpIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWQtZmllbGRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj4qPC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9sYWJlbD5cbiAgICA8L2Rpdj5cbiAgfVxuXG4gIDxzZGMtcG9wb3ZlclxuICAgIFtvcGVuXT1cInBhbmVsT3BlblwiXG4gICAgW3RvZ2dsZU9uVHJpZ2dlckNsaWNrXT1cImZhbHNlXCJcbiAgICBbY2xvc2VPbk91dHNpZGVDbGlja109XCJ0cnVlXCJcbiAgICBbY2xvc2VPbkVzY2FwZV09XCJ0cnVlXCJcbiAgICBbbWF0Y2hUcmlnZ2VyV2lkdGhdPVwiZmFsc2VcIlxuICAgIFtyZXN0b3JlRm9jdXNPbkNsb3NlXT1cImZhbHNlXCJcbiAgICBbdHJhcEZvY3VzXT1cInRydWVcIlxuICAgIFthcmlhTGFiZWxdPVwiJ2RhdGVwaWNrZXIuY2FsZW5kYXInXCJcbiAgICBwYW5lbENsYXNzPVwic2RjLWRhdGVwaWNrZXItcG9wb3Zlci1wYW5lbFwiXG4gICAgKG9wZW5DaGFuZ2UpPVwib25Qb3BvdmVyT3BlbkNoYW5nZSgkZXZlbnQpXCJcbiAgPlxuICAgIDxkaXYgc2RjLXBvcG92ZXItdHJpZ2dlcj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9fY29udHJvbFwiXG4gICAgICAgICN0cmlnZ2VyUmVmXG4gICAgICAgIFtjbGFzcy5zZGMtZGF0ZXBpY2tlcl9fY29udHJvbC0taW52YWxpZF09XCJpbnZhbGlkXCJcbiAgICAgICAgW2NsYXNzLnNkYy1kYXRlcGlja2VyX19jb250cm9sLS1kaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldElucHV0U3R5bGUoKVwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9fdmFsdWVcIj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICNpbnB1dFJlZlxuICAgICAgICAgICAgW2lkXT1cImlucHV0SWRcIlxuICAgICAgICAgICAgY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9faW5wdXRcIlxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgIFtyZWFkT25seV09XCJyZWFkb25seUlucHV0XCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlciB8fCBkYXRlRm9ybWF0XCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJkaXNwbGF5VmFsdWUoKVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImxhYmVsS2V5KCkgPyAobGFiZWxLZXkoKSB8IHRyYW5zbGF0ZSkgOiBwbGFjZWhvbGRlclwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInBhbmVsT3BlblwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cIidkaWFsb2cnXCJcbiAgICAgICAgICAgIGFyaWEtYXV0b2NvbXBsZXRlPVwibm9uZVwiXG4gICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uSW5wdXRDbGljaygpXCJcbiAgICAgICAgICAgIChmb2N1cyk9XCJvbklucHV0Rm9jdXMoKVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJvbktleWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNkYy1kYXRlcGlja2VyX19hY3Rpb25zXCI+XG4gICAgICAgICAgQGlmIChzaG93Q2xlYXIgJiYgdmFsdWUpIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic2RjLWRhdGVwaWNrZXJfX2ljb24tYnV0dG9uIHNkYy1kYXRlcGlja2VyX19pY29uLWJ1dHRvbi0tY2xlYXJcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidkYXRlcGlja2VyLmNsZWFyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjbGVhclZhbHVlKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoc2hvd0ljb24pIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic2RjLWRhdGVwaWNrZXJfX2ljb24tYnV0dG9uIHNkYy1kYXRlcGlja2VyX19pY29uLWJ1dHRvbi0tdG9nZ2xlXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInZGF0ZXBpY2tlci5jYWxlbmRhcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInBhbmVsT3BlblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVQYW5lbCgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aSBbY2xhc3NdPVwiaWNvblwiIGNsYXNzPVwic2RjLWRhdGVwaWNrZXJfX2ljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IHNkYy1wb3BvdmVyLWNvbnRlbnQ+XG4gICAgICA8ZGl2XG4gICAgICAjcGFuZWxDb250ZW50UmVmXG4gICAgICBjbGFzcz1cInNkYy1kYXRlcGlja2VyX19wYW5lbFwiXG4gICAgICAoa2V5ZG93bik9XCJvbk92ZXJsYXlLZXlkb3duKCRldmVudClcIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInZGF0ZXBpY2tlci5jYWxlbmRhcicgfCB0cmFuc2xhdGVcIlxuICAgID5cbiAgICAgIDwhLS0gTmF2aWdhdGlvbiBIZWFkZXIgLS0+XG4gICAgICBAaWYgKG1vZGUgIT09ICd0aW1lJykge1xuICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLWRhdGVwaWNrZXJfX2hlYWRlclwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9fbmF2LWJ0blwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidkYXRlcGlja2VyLnByZXYnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjdXJyZW50VmlldygpID09PSAnZGF5cycgPyBwcmV2TW9udGgoKSA6IGN1cnJlbnRWaWV3KCkgPT09ICdtb250aHMnID8gcHJldlllYXIoKSA6IHByZXZZZWFyUmFuZ2UoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1sZWZ0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInNkYy1kYXRlcGlja2VyX190aXRsZS1idG5cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICBjdXJyZW50VmlldygpID09PSAnZGF5cydcbiAgICAgICAgICAgICAgICA/IHN3aXRjaFRvTW9udGhWaWV3KClcbiAgICAgICAgICAgICAgICA6IGN1cnJlbnRWaWV3KCkgPT09ICdtb250aHMnID8gc3dpdGNoVG9ZZWFyVmlldygpIDogbnVsbFxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyB2aWV3TW9udGhZZWFyTGFiZWwoKSB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInNkYy1kYXRlcGlja2VyX19uYXYtYnRuXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ2RhdGVwaWNrZXIubmV4dCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImN1cnJlbnRWaWV3KCkgPT09ICdkYXlzJyA/IG5leHRNb250aCgpIDogY3VycmVudFZpZXcoKSA9PT0gJ21vbnRocycgPyBuZXh0WWVhcigpIDogbmV4dFllYXJSYW5nZSgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXJpZ2h0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgPCEtLSBEYXlzIFZpZXcgLS0+XG4gICAgICBAaWYgKGN1cnJlbnRWaWV3KCkgPT09ICdkYXlzJyAmJiBtb2RlICE9PSAndGltZScpIHtcbiAgICAgICAgPHRhYmxlIGNsYXNzPVwic2RjLWRhdGVwaWNrZXJfX2NhbGVuZGFyXCI+XG4gICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgPHRyIGNsYXNzPVwic2RjLWRhdGVwaWNrZXJfX3dlZWtkYXlzXCI+XG4gICAgICAgICAgICAgIEBmb3IgKGRheU5hbWUgb2Ygd2Vla0RheU5hbWVzKCk7IHRyYWNrIGRheU5hbWUpIHtcbiAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9fd2Vla2RheVwiIHNjb3BlPVwiY29sXCI+XG4gICAgICAgICAgICAgICAgICB7eyBkYXlOYW1lIH19XG4gICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgIDx0Ym9keSBjbGFzcz1cInNkYy1kYXRlcGlja2VyX19kYXlzXCIgKGtleWRvd24pPVwib25EYXlzR3JpZEtleWRvd24oJGV2ZW50KVwiPlxuICAgICAgICAgICAgQGZvciAod2VlayBvZiBjYWxlbmRhcldlZWtzKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgQGZvciAoZGF5IG9mIHdlZWs7IHRyYWNrIGRheS5kYXRlLmdldFRpbWUoKSkge1xuICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgI2RheUJ0blxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLWRhdGVwaWNrZXJfX2RheVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy1kYXRlcGlja2VyX19kYXktLW90aGVyLW1vbnRoXT1cIiFkYXkuY3VycmVudE1vbnRoXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLWRhdGVwaWNrZXJfX2RheS0tdG9kYXldPVwiZGF5LnRvZGF5XCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLWRhdGVwaWNrZXJfX2RheS0tc2VsZWN0ZWRdPVwiZGF5LnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLWRhdGVwaWNrZXJfX2RheS0tZGlzYWJsZWRdPVwiZGF5LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLWRhdGVwaWNrZXJfX2RheS0taW4tcmFuZ2VdPVwiZGF5LmluUmFuZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtZGF0ZXBpY2tlcl9fZGF5LS1yYW5nZS1zdGFydF09XCJkYXkucmFuZ2VTdGFydFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy1kYXRlcGlja2VyX19kYXktLXJhbmdlLWVuZF09XCJkYXkucmFuZ2VFbmRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkYXkuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZGF5LmRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiZGF5LnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRheS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiaXNEYXlUYWJTdG9wKGRheSkgPyAwIDogLTFcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3REYXkoZGF5KVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBkYXkuZGF5IH19XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgPC90YWJsZT5cbiAgICAgIH1cblxuICAgICAgPCEtLSBNb250aHMgVmlldyAtLT5cbiAgICAgIEBpZiAoY3VycmVudFZpZXcoKSA9PT0gJ21vbnRocycpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInNkYy1kYXRlcGlja2VyX19tb250aHMtZ3JpZFwiPlxuICAgICAgICAgIEBmb3IgKG0gb2YgY2FsZW5kYXJNb250aHMoKTsgdHJhY2sgbS5tb250aCkge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9fbW9udGgtY2VsbFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5zZGMtZGF0ZXBpY2tlcl9fbW9udGgtY2VsbC0tc2VsZWN0ZWRdPVwibS5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RNb250aChtLm1vbnRoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IG0ubmFtZSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgPCEtLSBZZWFycyBWaWV3IC0tPlxuICAgICAgQGlmIChjdXJyZW50VmlldygpID09PSAneWVhcnMnKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9feWVhcnMtZ3JpZFwiPlxuICAgICAgICAgIEBmb3IgKHllYXIgb2YgeWVhclJhbmdlKCk7IHRyYWNrIHllYXIpIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic2RjLWRhdGVwaWNrZXJfX3llYXItY2VsbFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5zZGMtZGF0ZXBpY2tlcl9feWVhci1jZWxsLS1zZWxlY3RlZF09XCJ5ZWFyID09PSB2aWV3RGF0ZSgpLmdldEZ1bGxZZWFyKClcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0WWVhcih5ZWFyKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IHllYXIgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIDwhLS0gVGltZSBQaWNrZXIgLS0+XG4gICAgICBAaWYgKHNob3dUaW1lUGlja2VyKCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInNkYy1kYXRlcGlja2VyX190aW1lXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy1kYXRlcGlja2VyX190aW1lLWdyb3VwXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cInNkYy1kYXRlcGlja2VyX190aW1lLWJ0blwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJpbmNyZW1lbnRIb3VycygpXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInZGF0ZXBpY2tlci5pbmNyZW1lbnRIb3VyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tdXBcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWRhdGVwaWNrZXJfX3RpbWUtdmFsdWVcIj57eyBwYWRUaW1lKGhvdXJzKCkpIH19PC9zcGFuPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9fdGltZS1idG5cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiZGVjcmVtZW50SG91cnMoKVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ2RhdGVwaWNrZXIuZGVjcmVtZW50SG91cicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWRvd25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWRhdGVwaWNrZXJfX3RpbWUtc2VwYXJhdG9yXCI+Ojwvc3Bhbj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9fdGltZS1ncm91cFwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9fdGltZS1idG5cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiaW5jcmVtZW50TWludXRlcygpXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInZGF0ZXBpY2tlci5pbmNyZW1lbnRNaW51dGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi11cFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9fdGltZS12YWx1ZVwiPnt7IHBhZFRpbWUobWludXRlcygpKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic2RjLWRhdGVwaWNrZXJfX3RpbWUtYnRuXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImRlY3JlbWVudE1pbnV0ZXMoKVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ2RhdGVwaWNrZXIuZGVjcmVtZW50TWludXRlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tZG93blwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgQGlmIChzaG93U2Vjb25kcykge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9fdGltZS1zZXBhcmF0b3JcIj46PC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy1kYXRlcGlja2VyX190aW1lLWdyb3VwXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1kYXRlcGlja2VyX190aW1lLWJ0blwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImluY3JlbWVudFNlY29uZHMoKVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInZGF0ZXBpY2tlci5pbmNyZW1lbnRTZWNvbmQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tdXBcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1kYXRlcGlja2VyX190aW1lLXZhbHVlXCI+e3sgcGFkVGltZShzZWNvbmRzKCkpIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9fdGltZS1idG5cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWNyZW1lbnRTZWNvbmRzKClcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ2RhdGVwaWNrZXIuZGVjcmVtZW50U2Vjb25kJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWRvd25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cblxuICAgICAgfVxuXG4gICAgICA8IS0tIEZvb3RlcjogVG9kYXkgb24gdGhlIGxlZnQsIENsZWFyICsgQ29uZmlybSB0b2dldGhlciBvbiB0aGUgcmlnaHQgLS0+XG4gICAgICBAaWYgKHNob3dCdXR0b25CYXIgfHwgbW9kZSA9PT0gJ2RhdGV0aW1lJyB8fCBtb2RlID09PSAndGltZScpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInNkYy1kYXRlcGlja2VyX19idXR0b24tYmFyXCI+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIEBpZiAoc2hvd0J1dHRvbkJhciAmJiBtb2RlICE9PSAndGltZScpIHtcbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLWRhdGVwaWNrZXJfX2Jhci1idG5cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUb2RheSgpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7ICdkYXRlcGlja2VyLnRvZGF5JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9fYnV0dG9uLWJhci1lbmRcIj5cbiAgICAgICAgICAgIEBpZiAoc2hvd0J1dHRvbkJhcikge1xuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9fYmFyLWJ0blwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyVmFsdWUoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyAnZGF0ZXBpY2tlci5jbGVhcicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKG1vZGUgPT09ICdkYXRldGltZScgfHwgbW9kZSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1kYXRlcGlja2VyX19jb25maXJtLWJ0blwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbmZpcm1EYXRlVGltZSgpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7ICdkYXRlcGlja2VyLmNvbmZpcm0nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9zZGMtcG9wb3Zlcj5cblxuICBAaWYgKG1lc3NhZ2VLZXkoKSkge1xuICAgIDxzbWFsbFxuICAgICAgW25nQ2xhc3NdPVwiZ2V0SW52YWxpZE1lc3NhZ2VDbGFzcygpXCJcbiAgICAgIHJvbGU9XCJhbGVydFwiXG4gICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgID5cbiAgICAgIHt7IG1lc3NhZ2VLZXkoKSB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvc21hbGw+XG4gIH1cbjwvZGl2PlxuIl19
984
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFFBQVEsRUFDUixVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sTUFBTSxFQUNOLFNBQVMsRUFDVCxZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixNQUFNLEVBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQWdELE1BQU0sZ0JBQWdCLENBQUM7QUFDN0gsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFcEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7O0FBWWhFLE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBQztBQUN2QixNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7QUFDMUIsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDO0FBQzFC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RUFBRSxDQUFDO1FBQzFCLE1BQU0sT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDMUYsQ0FBQztJQUVNLFNBQVM7UUFDWixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDMUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMxRixDQUFDO0lBRU0sUUFBUTtRQUNYLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUs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LFFBQVE7c0JBQTlCLFNBQVM7dUJBQUMsVUFBVTtnQkFDSSxVQUFVO3NCQUFsQyxTQUFTO3VCQUFDLFlBQVk7Z0JBQ3dCLGVBQWU7c0JBQTdELFNBQVM7dUJBQUMsaUJBQWlCO2dCQUNhLGFBQWE7c0JBQXJELFlBQVk7dUJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBjb21wdXRlZCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBRdWVyeUxpc3QsXG4gICAgc2lnbmFsLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q2hpbGRyZW4sXG4gICAgVmlld0VuY2Fwc3VsYXRpb24sXG4gICAgZm9yd2FyZFJlZixcbiAgICBpbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgTkdfVkFMVUVfQUNDRVNTT1IsIE5HX1ZBTElEQVRPUlMsIFZhbGlkYXRvciwgQWJzdHJhY3RDb250cm9sLCBWYWxpZGF0aW9uRXJyb3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgSW5wdXRzQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29yZS9kaXJlY3RpdmVzL2lucHV0cy5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgZm9jdXNGaXJzdERlc2NlbmRhbnQgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzL2ZvY3VzLnV0aWwnO1xuaW1wb3J0IHsgbmV4dFNlcXVlbnRpYWxJZCB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMvaWQudXRpbCc7XG5pbXBvcnQgeyBQb3BvdmVyQ29tcG9uZW50IH0gZnJvbSAnLi4vcG9wb3Zlci9wb3BvdmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgdHlwZSB7XG4gICAgQ2FsZW5kYXJEYXksXG4gICAgRGF0ZVBpY2tlck1vZGUsXG4gICAgRGF0ZVBpY2tlclNlbGVjdGlvbk1vZGUsXG4gICAgRGF0ZVJhbmdlLFxuICAgIERhdGVwaWNrZXJNb250aENoYW5nZUV2ZW50LFxuICAgIERhdGVwaWNrZXJWaWV3XG59IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMvZGF0ZXBpY2tlci50eXBlJztcblxudHlwZSBEYXRlcGlja2VyVmFsdWUgPSBEYXRlIHwgRGF0ZVJhbmdlIHwgRGF0ZVtdIHwgbnVsbDtcblxuY29uc3QgREFZU19JTl9XRUVLID0gNztcbmNvbnN0IE1PTlRIU19JTl9ZRUFSID0gMTI7XG5jb25zdCBZRUFSU19QRVJfUEFHRSA9IDEyO1xuY29uc3QgSE9VUl9GT1JNQVRfMTJfTUFYID0gMTI7XG5jb25zdCBIT1VSX0ZPUk1BVF8yNF9NQVggPSAyMztcbmNvbnN0IFlFQVJfU0hPUlRfTEVOR1RIID0gMjtcblxuQENvbXBvbmVudCh7XG4gICAgaW1wb3J0czogW1xuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgICAgIFBvcG92ZXJDb21wb25lbnRcbiAgICBdLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICdzZGMtZGF0ZXBpY2tlcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RhdGVwaWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsOiAnLi9kYXRlcGlja2VyLmNvbXBvbmVudC5zY3NzJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZCxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEYXRlcGlja2VyQ29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEYXRlcGlja2VyQ29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlXG4gICAgICAgIH1cbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIERhdGVwaWNrZXJDb21wb25lbnQgZXh0ZW5kcyBJbnB1dHNDb21wb25lbnQ8RGF0ZXBpY2tlclZhbHVlPiBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBWYWxpZGF0b3Ige1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gICAgLy8gLS0tIElucHV0cyAtLS1cbiAgICBASW5wdXQoKSBtb2RlOiBEYXRlUGlja2VyTW9kZSA9ICdkYXRlJztcbiAgICBASW5wdXQoKSBzZWxlY3Rpb25Nb2RlOiBEYXRlUGlja2VyU2VsZWN0aW9uTW9kZSA9ICdzaW5nbGUnO1xuICAgIEBJbnB1dCgpIHNob3dJY29uID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBpY29uID0gJ2ZhcyBmYS1jYWxlbmRhcic7XG4gICAgQElucHV0KCkgbWluOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgQElucHV0KCkgbWF4OiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgQElucHV0KCkgZGVmYXVsdERhdGU6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgICBASW5wdXQoKSBkYXRlRm9ybWF0ID0gJ2RkL01NL3l5eXknO1xuXG4gICAgLy8gRGlnaXRhY2FvIG5vIGNhbXBvLCBkZXNsaWdhZGEgcG9yIHBhZHJhby4gQXRlIGFxdWkgbyA8aW5wdXQ+IHNvIHJlZmxldGlhIG8gcXVlXG4gICAgLy8gZm9pIGNsaWNhZG8gbm8gY2FsZW5kYXJpbzogbmFvIGhhdmlhIGhhbmRsZXIgZGUgKGlucHV0KSwgZW50YW8gbyBxdWUgbyB1c3VhcmlvXG4gICAgLy8gZGlnaXRhdmEgbnVuY2EgY2hlZ2F2YSBhbyBjb21wb25lbnRlLiBMaWdhciBwb3IgcGFkcmFvIG11ZGFyaWEgb1xuICAgIC8vIGNvbXBvcnRhbWVudG8gZGUgdGVsYXMgcXVlIGphIGNvbnRhbSBjb20gbyBjYW1wbyBzZXIgZWZldGl2YW1lbnRlIHNvLWxlaXR1cmEsXG4gICAgLy8gcG9yIGlzc28gZSBvcHQtaW4uXG4gICAgQElucHV0KCkgYWxsb3dUeXBpbmcgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBob3VyRm9ybWF0OiAnMTInIHwgJzI0JyA9ICcyNCc7XG4gICAgQElucHV0KCkgbWludXRlU3RlcCA9IDU7XG4gICAgQElucHV0KCkgc2hvd1NlY29uZHMgPSBmYWxzZTtcbiAgICBASW5wdXQoKSByYW5nZVNlcGFyYXRvciA9ICcg4oCUICc7XG4gICAgQElucHV0KCkgc2hvd09uRm9jdXMgPSB0cnVlO1xuICAgIEBJbnB1dCgpIHJlYWRvbmx5SW5wdXQgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBmaXJzdERheU9mV2VlayA9IDA7XG4gICAgQElucHV0KCkgc2hvd0J1dHRvbkJhciA9IHRydWU7XG4gICAgQElucHV0KCkgc2hvd0NsZWFyID0gZmFsc2U7XG4gICAgQElucHV0KCkgZGlzYWJsZWREYXRlczogRGF0ZVtdID0gW107XG4gICAgQElucHV0KCkgZGlzYWJsZWREYXlzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgLy8gLS0tIE91dHB1dHMgLS0tXG4gICAgQE91dHB1dCgpIHNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlcGlja2VyVmFsdWU+KCk7XG4gICAgQE91dHB1dCgpIGNsb3NlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgICBAT3V0cHV0KCkgbW9udGhDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGVwaWNrZXJNb250aENoYW5nZUV2ZW50PigpO1xuICAgIEBPdXRwdXQoKSB5ZWFyQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlcGlja2VyTW9udGhDaGFuZ2VFdmVudD4oKTtcblxuICAgIC8vIC0tLSBWaWV3IENoaWxkcmVuIC0tLVxuICAgIEBWaWV3Q2hpbGQoJ2lucHV0UmVmJykgaW5wdXRSZWY/OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuICAgIEBWaWV3Q2hpbGQoJ3RyaWdnZXJSZWYnKSB0cmlnZ2VyUmVmPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gICAgQFZpZXdDaGlsZCgncGFuZWxDb250ZW50UmVmJykgcHJpdmF0ZSByZWFkb25seSBwYW5lbENvbnRlbnRSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgICBAVmlld0NoaWxkcmVuKCdkYXlCdG4nKSBwcml2YXRlIHJlYWRvbmx5IGRheUJ1dHRvblJlZnM/OiBRdWVyeUxpc3Q8RWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD4+O1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlucHV0SWQgPSBuZXh0U2VxdWVudGlhbElkKCdzZGMtZGF0ZXBpY2tlci1pbnB1dCcpO1xuXG4gICAgLy8gLS0tIFNpZ25hbHMgLS0tXG4gICAgcHVibGljIHBhbmVsT3BlbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgc3VwcHJlc3NOZXh0Rm9jdXNPcGVuID0gZmFsc2U7XG4gICAgcHVibGljIHJlYWRvbmx5IGN1cnJlbnRWaWV3ID0gc2lnbmFsPERhdGVwaWNrZXJWaWV3PignZGF5cycpO1xuICAgIHB1YmxpYyByZWFkb25seSB2aWV3RGF0ZSA9IHNpZ25hbDxEYXRlPihuZXcgRGF0ZSgpKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZm9jdXNlZERhdGUgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwpO1xuXG4gICAgLy8gVGltZSBzaWduYWxzXG4gICAgcHVibGljIHJlYWRvbmx5IGhvdXJzID0gc2lnbmFsKDApO1xuICAgIHB1YmxpYyByZWFkb25seSBtaW51dGVzID0gc2lnbmFsKDApO1xuICAgIHB1YmxpYyByZWFkb25seSBzZWNvbmRzID0gc2lnbmFsKDApO1xuXG4gICAgLy8gTyBpZGlvbWEgcHJlY2lzYSBzZXIgdW0gU2lnbmFsOiBvcyBub21lcyBkZSBtZXMgZSBkZSBkaWEgc2FvIGBjb21wdXRlZCgpYCwgZVxuICAgIC8vIGNvbXB1dGVkIHNvIHJlY2FsY3VsYSBxdWFuZG8gdW0gU2lnbmFsIHF1ZSBlbGUgTEUgbXVkYS4gTGVyIHRyYW5zbGF0ZS5jdXJyZW50TGFuZ1xuICAgIC8vIGRpcmV0byBkZWl4YXJpYSBvcyBub21lcyBjb25nZWxhZG9zIG5vIGlkaW9tYSBkbyBwcmltZWlybyByZW5kZXIgLSBvXG4gICAgLy8gbWFya0ZvckNoZWNrIGRvIG9uTGFuZ0NoYW5nZSAodmVyIG5nT25Jbml0KSByZWRlc2VuaGEsIG1hcyBjb20gbyB2YWxvciB2ZWxoby5cbiAgICAvLyBTZW0gZ2V0RGVmYXVsdExhbmcoKSBhcXVpOiBuZW0gdG9kYSBtb250YWdlbSBkbyBUcmFuc2xhdGVTZXJ2aWNlIGV4cG9lIGVzc2VcbiAgICAvLyBtZXRvZG8gKG8gbW9jayBkbyBwcm9wcmlvIHNwZWMgZGVzdGUgY29tcG9uZW50ZSBuYW8gZXhwb2UpLCBlIG8gZmFsbGJhY2sgZGVcbiAgICAvLyBpZGlvbWEgamEgZXN0YSBub3MgaGVscGVycyBkZSBJbnRsIG1haXMgYWJhaXhvLlxuICAgIHByaXZhdGUgcmVhZG9ubHkgY3VycmVudExhbmcgPSBzaWduYWw8c3RyaW5nPih0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZyA/PyAnJyk7XG5cbiAgICAvLyBUZXh0byBlbnF1YW50byBvIHVzdWFyaW8gZGlnaXRhLiBOYW8tbnVsbyBhcGVuYXMgZHVyYW50ZSBhIGRpZ2l0YWNhbzogZW5xdWFudG9cbiAgICAvLyBleGlzdGUsIHRlbSBwcmVjZWRlbmNpYSBzb2JyZSBkaXNwbGF5VmFsdWUoKSBubyBjYW1wbywgc2VuYW8gYSBmb3JtYXRhY2FvXG4gICAgLy8gcmVlc2NyZXZlcmlhIG8gdGV4dG8gbm8gbWVpbyBkYSBkaWdpdGFjYW8gYSBjYWRhIGNpY2xvIGRlIGRldGVjY2FvLlxuICAgIHByaXZhdGUgcmVhZG9ubHkgdHlwZWRUZXh0ID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gICAgLy8gUmFuZ2Ugc2VsZWN0aW9uIHN0YXRlXG4gICAgcHJpdmF0ZSByZWFkb25seSByYW5nZVN0YXJ0ID0gc2lnbmFsPERhdGUgfCBudWxsPihudWxsKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJhbmdlRW5kID0gc2lnbmFsPERhdGUgfCBudWxsPihudWxsKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJhbmdlU2VsZWN0aW5nID0gc2lnbmFsKGZhbHNlKTtcblxuICAgIC8vIC0tLSBDb21wdXRlZCAtLS1cblxuICAgIHB1YmxpYyByZWFkb25seSB3ZWVrRGF5TmFtZXMgPSBjb21wdXRlZCgoKTogc3RyaW5nW10gPT4ge1xuICAgICAgICBjb25zdCBkYXlzID0gdGhpcy5sb2NhbGl6ZWRXZWVrRGF5TmFtZXModGhpcy5jdXJyZW50TGFuZygpKTtcbiAgICAgICAgY29uc3Qgc2hpZnRlZDogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBEQVlTX0lOX1dFRUs7IGkrKykge1xuICAgICAgICAgICAgc2hpZnRlZC5wdXNoKGRheXNbKGkgKyB0aGlzLmZpcnN0RGF5T2ZXZWVrKSAlIERBWVNfSU5fV0VFS10pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaGlmdGVkO1xuICAgIH0pO1xuXG4gICAgLy8gTk9URTogaW50ZW50aW9uYWxseSBhIHBsYWluIG1ldGhvZCAobm90IGBjb21wdXRlZCgpYCkuIGB0aGlzLnZhbHVlYCBpcyBhIHBsYWluXG4gICAgLy8gQElucHV0IGluaGVyaXRlZCBmcm9tIElucHV0c0NvbXBvbmVudCwgbm90IGEgU2lnbmFsLCBzbyB3cmFwcGluZyB0aGlzIGluIGBjb21wdXRlZCgpYFxuICAgIC8vIHdvdWxkIGZyZWV6ZSBpdCBhZnRlciB0aGUgZmlyc3QgcmVhZCAoQW5ndWxhciBjb21wdXRlZCgpIG9ubHkgcmVhY3RzIHRvIFNpZ25hbCByZWFkcykuXG4gICAgLy8gT25QdXNoICsgdGhlIGV4aXN0aW5nIGBtYXJrRm9yQ2hlY2soKWAgY2FsbHMgYWZ0ZXIgZXZlcnkgdmFsdWUgbXV0YXRpb24ga2VlcCB0aGlzIGNvcnJlY3QuXG4gICAgcHVibGljIGNhbGVuZGFyRGF5cygpOiBDYWxlbmRhckRheVtdIHtcbiAgICAgICAgY29uc3Qgdmlld0QgPSB0aGlzLnZpZXdEYXRlKCk7XG4gICAgICAgIGNvbnN0IHllYXIgPSB2aWV3RC5nZXRGdWxsWWVhcigpO1xuICAgICAgICBjb25zdCBtb250aCA9IHZpZXdELmdldE1vbnRoKCk7XG4gICAgICAgIGNvbnN0IGZpcnN0T2ZNb250aCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKTtcbiAgICAgICAgY29uc3Qgc3RhcnREYXkgPSBmaXJzdE9mTW9udGguZ2V0RGF5KCk7XG4gICAgICAgIGNvbnN0IGRheXNCZWZvcmVTdGFydCA9IChzdGFydERheSAtIHRoaXMuZmlyc3REYXlPZldlZWsgKyBEQVlTX0lOX1dFRUspICUgREFZU19JTl9XRUVLO1xuICAgICAgICBjb25zdCBzdGFydERhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSAtIGRheXNCZWZvcmVTdGFydCk7XG4gICAgICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICAgICAgdG9kYXkuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG5cbiAgICAgICAgY29uc3QgZGF5czogQ2FsZW5kYXJEYXlbXSA9IFtdO1xuICAgICAgICBjb25zdCBkYXlzSW5Nb250aCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoICsgMSwgMCkuZ2V0RGF0ZSgpO1xuICAgICAgICAvLyBEeW5hbWljIHJvdyBjb3VudCAoNSwgNiwgb3IgcmFyZWx5IDQgd2Vla3MpIGluc3RlYWQgb2YgYSBmaXhlZCA0Mi1jZWxsICg2IHJvdykgZ3JpZCxcbiAgICAgICAgLy8gbWF0Y2hpbmcgQW5ndWxhciBDb21wb25lbnRzIGJlaGF2aW9yLiBBdm9pZHMgYSB0cmFpbGluZyBhbGwtZGlzYWJsZWQvYmxhbmsgd2Vla1xuICAgICAgICAvLyBmb3IgbW9udGhzIHRoYXQgb25seSBuZWVkIDUgcm93cy5cbiAgICAgICAgY29uc3QgdG90YWxDZWxscyA9IE1hdGguY2VpbCgoZGF5c0JlZm9yZVN0YXJ0ICsgZGF5c0luTW9udGgpIC8gREFZU19JTl9XRUVLKSAqIERBWVNfSU5fV0VFSztcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvdGFsQ2VsbHM7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHN0YXJ0RGF0ZS5nZXRGdWxsWWVhcigpLCBzdGFydERhdGUuZ2V0TW9udGgoKSwgc3RhcnREYXRlLmdldERhdGUoKSArIGkpO1xuICAgICAgICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICAgICAgICAgIGRheXMucHVzaCh7XG4gICAgICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgICAgICBkYXk6IGRhdGUuZ2V0RGF0ZSgpLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRNb250aDogZGF0ZS5nZXRNb250aCgpID09PSBtb250aCxcbiAgICAgICAgICAgICAgICB0b2RheTogZGF0ZS5nZXRUaW1lKCkgPT09IHRvZGF5LmdldFRpbWUoKSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZDogdGhpcy5pc0RhdGVTZWxlY3RlZChkYXRlKSxcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogdGhpcy5pc0RhdGVEaXNhYmxlZChkYXRlKSxcbiAgICAgICAgICAgICAgICBpblJhbmdlOiB0aGlzLmlzSW5SYW5nZShkYXRlKSxcbiAgICAgICAgICAgICAgICByYW5nZVN0YXJ0OiB0aGlzLmlzUmFuZ2VTdGFydChkYXRlKSxcbiAgICAgICAgICAgICAgICByYW5nZUVuZDogdGhpcy5pc1JhbmdlRW5kKGRhdGUpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF5cztcbiAgICB9XG5cbiAgICAvLyBHcm91cHMgYGNhbGVuZGFyRGF5cygpYCBpbnRvIDctZGF5IHdlZWtzIHNvIHRoZSB0ZW1wbGF0ZSBjYW4gcmVuZGVyIGEgcmVhbFxuICAgIC8vIDx0YWJsZT4vPHRyPi88dGQ+IGdyaWQgKG5hdGl2ZSByb3cvZ3JpZGNlbGwgc2VtYW50aWNzKSBpbnN0ZWFkIG9mIEFSSUEgcm9sZXMgb24gPGRpdj5zLlxuICAgIHB1YmxpYyBjYWxlbmRhcldlZWtzKCk6IENhbGVuZGFyRGF5W11bXSB7XG4gICAgICAgIGNvbnN0IGRheXMgPSB0aGlzLmNhbGVuZGFyRGF5cygpO1xuICAgICAgICBjb25zdCB3ZWVrczogQ2FsZW5kYXJEYXlbXVtdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF5cy5sZW5ndGg7IGkgKz0gREFZU19JTl9XRUVLKSB7XG4gICAgICAgICAgICB3ZWVrcy5wdXNoKGRheXMuc2xpY2UoaSwgaSArIERBWVNfSU5fV0VFSykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3ZWVrcztcbiAgICB9XG5cbiAgICAvLyBOT1RFOiBwbGFpbiBtZXRob2QgZm9yIHRoZSBzYW1lIHJlYXNvbiBhcyBgY2FsZW5kYXJEYXlzYCBhYm92ZSAoZGVwZW5kcyBvbiBgdGhpcy52YWx1ZWAsXG4gICAgLy8gYSBub24tU2lnbmFsIEBJbnB1dCkuXG4gICAgcHVibGljIGNhbGVuZGFyTW9udGhzKCk6IHsgbW9udGg6IG51bWJlcjsgbmFtZTogc3RyaW5nOyBzZWxlY3RlZDogYm9vbGVhbiB9W10ge1xuICAgICAgICBjb25zdCBtb250aE5hbWVzID0gdGhpcy5sb2NhbGl6ZWRNb250aE5hbWVzKHRoaXMuY3VycmVudExhbmcoKSwgJ3Nob3J0Jyk7XG4gICAgICAgIGNvbnN0IHZpZXdEID0gdGhpcy52aWV3RGF0ZSgpO1xuICAgICAgICByZXR1cm4gbW9udGhOYW1lcy5tYXAoKG5hbWUsIGluZGV4KSA9PiAoe1xuICAgICAgICAgICAgbW9udGg6IGluZGV4LFxuICAgICAgICAgICAgc2VsZWN0ZWQ6IHRoaXMuaXNNb250aFNlbGVjdGVkKGluZGV4LCB2aWV3RC5nZXRGdWxsWWVhcigpKSxcbiAgICAgICAgICAgIG5hbWVcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSB5ZWFyUmFuZ2UgPSBjb21wdXRlZCgoKTogbnVtYmVyW10gPT4ge1xuICAgICAgICBjb25zdCB2aWV3RCA9IHRoaXMudmlld0RhdGUoKTtcbiAgICAgICAgY29uc3QgY3VycmVudFllYXIgPSB2aWV3RC5nZXRGdWxsWWVhcigpO1xuICAgICAgICBjb25zdCBzdGFydFllYXIgPSBjdXJyZW50WWVhciAtIChjdXJyZW50WWVhciAlIFlFQVJTX1BFUl9QQUdFKTtcbiAgICAgICAgY29uc3QgeWVhcnM6IG51bWJlcltdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgWUVBUlNfUEVSX1BBR0U7IGkrKykge1xuICAgICAgICAgICAgeWVhcnMucHVzaChzdGFydFllYXIgKyBpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geWVhcnM7XG4gICAgfSk7XG5cbiAgICAvLyBOT1RFOiBwbGFpbiBtZXRob2QgZm9yIHRoZSBzYW1lIHJlYXNvbiBhcyBgY2FsZW5kYXJEYXlzYCBhYm92ZSAoZGVwZW5kcyBvbiBgdGhpcy52YWx1ZWAsXG4gICAgLy8gYSBub24tU2lnbmFsIEBJbnB1dCkuXG4gICAgcHVibGljIGRpc3BsYXlWYWx1ZSgpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCB2YWwgPSB0aGlzLnZhbHVlO1xuICAgICAgICBpZiAoIXZhbCkgeyByZXR1cm4gJyc7IH1cbiAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ3JhbmdlJykge1xuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSB2YWwgYXMgRGF0ZVJhbmdlO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRTdHIgPSByYW5nZS5zdGFydCA/IHRoaXMuZm9ybWF0RGF0ZShyYW5nZS5zdGFydCkgOiAnJztcbiAgICAgICAgICAgIGNvbnN0IGVuZFN0ciA9IHJhbmdlLmVuZCA/IHRoaXMuZm9ybWF0RGF0ZShyYW5nZS5lbmQpIDogJyc7XG4gICAgICAgICAgICByZXR1cm4gc3RhcnRTdHIgJiYgZW5kU3RyID8gYCR7c3RhcnRTdHJ9JHt0aGlzLnJhbmdlU2VwYXJhdG9yfSR7ZW5kU3RyfWAgOiBzdGFydFN0cjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnbXVsdGlwbGUnICYmIEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5tYXAoZCA9PiB0aGlzLmZvcm1hdERhdGUoZCkpLmpvaW4oJywgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm1hdERhdGUodmFsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLy8gTyBxdWUgbyBjYW1wbyBtb3N0cmE6IG8gdGV4dG8gZW0gZGlnaXRhY2FvLCBxdWFuZG8gaGEsIHNlbmFvIG8gdmFsb3IgZm9ybWF0YWRvLlxuICAgIHB1YmxpYyBpbnB1dFZhbHVlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGVkVGV4dCgpID8/IHRoaXMuZGlzcGxheVZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRvbmx5IHZpZXdNb250aFllYXJMYWJlbCA9IGNvbXB1dGVkKCgpOiBzdHJpbmcgPT4ge1xuICAgICAgICBjb25zdCBtb250aE5hbWVzID0gdGhpcy5sb2NhbGl6ZWRNb250aE5hbWVzKHRoaXMuY3VycmVudExhbmcoKSwgJ2xvbmcnKTtcbiAgICAgICAgY29uc3Qgdmlld0QgPSB0aGlzLnZpZXdEYXRlKCk7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRWaWV3KCkgPT09ICd5ZWFycycpIHtcbiAgICAgICAgICAgIGNvbnN0IHllYXJzID0gdGhpcy55ZWFyUmFuZ2UoKTtcbiAgICAgICAgICAgIHJldHVybiBgJHt5ZWFyc1swXX0gLSAke3llYXJzW3llYXJzLmxlbmd0aCAtIDFdfWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke21vbnRoTmFtZXNbdmlld0QuZ2V0TW9udGgoKV19ICR7dmlld0QuZ2V0RnVsbFllYXIoKX1gO1xuICAgIH0pO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IHNob3dUaW1lUGlja2VyID0gY29tcHV0ZWQoKCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlID09PSAnZGF0ZXRpbWUnIHx8IHRoaXMubW9kZSA9PT0gJ3RpbWUnO1xuICAgIH0pO1xuXG4gICAgLy8gLS0tIExpZmVjeWNsZSAtLS1cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVZpZXdEYXRlKCk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZS5vbkxhbmdDaGFuZ2Uuc3Vic2NyaWJlKChldmVudG8pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5nLnNldChldmVudG8ubGFuZyk7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgLy8gLS0tIENvbnRyb2xWYWx1ZUFjY2Vzc29yIG92ZXJyaWRlIC0tLVxuICAgIHB1YmxpYyBvdmVycmlkZSB3cml0ZVZhbHVlKHZhbHVlOiBEYXRlcGlja2VyVmFsdWUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZSh2YWx1ZS5nZXRGdWxsWWVhcigpLCB2YWx1ZS5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgICAgICB0aGlzLmhvdXJzLnNldCh2YWx1ZS5nZXRIb3VycygpKTtcbiAgICAgICAgICAgIHRoaXMubWludXRlcy5zZXQodmFsdWUuZ2V0TWludXRlcygpKTtcbiAgICAgICAgICAgIHRoaXMuc2Vjb25kcy5zZXQodmFsdWUuZ2V0U2Vjb25kcygpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvLyAtLS0gVmFsaWRhdG9yIC0tLVxuICAgIHB1YmxpYyB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHZhbCA9IGNvbnRyb2wudmFsdWU7XG4gICAgICAgIGlmICghdmFsKSB7IHJldHVybiBudWxsOyB9XG5cbiAgICAgICAgaWYgKHRoaXMubWluICYmIHZhbCBpbnN0YW5jZW9mIERhdGUgJiYgdmFsIDwgdGhpcy5taW4pIHtcbiAgICAgICAgICAgIHJldHVybiB7IHNkY0RhdGVwaWNrZXJNaW46IHsgbWluOiB0aGlzLm1pbiwgYWN0dWFsOiB2YWwgfSB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1heCAmJiB2YWwgaW5zdGFuY2VvZiBEYXRlICYmIHZhbCA+IHRoaXMubWF4KSB7XG4gICAgICAgICAgICByZXR1cm4geyBzZGNEYXRlcGlja2VyTWF4OiB7IG1heDogdGhpcy5tYXgsIGFjdHVhbDogdmFsIH0gfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyAtLS0gUGFuZWwgYWN0aW9ucyAtLS1cbiAgICBwdWJsaWMgb3BlblBhbmVsKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnBhbmVsT3BlbikgeyByZXR1cm47IH1cbiAgICAgICAgdGhpcy5wYW5lbE9wZW4gPSB0cnVlO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVWaWV3RGF0ZSgpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7IC8vIEZvcmNlIGltbWVkaWF0ZSBDRCBmb3IgQ0RLIG92ZXJsYXlcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xvc2VQYW5lbCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnBhbmVsT3BlbikgeyByZXR1cm47IH1cbiAgICAgICAgdGhpcy5wYW5lbE9wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jbG9zZWQuZW1pdCgpO1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7IC8vIEZvcmNlIGltbWVkaWF0ZSBDRCBmb3IgQ0RLIG92ZXJsYXlcbiAgICB9XG5cbiAgICAvLyBDbG9zZXMgdGhlIHBhbmVsIGFuZCByZXR1cm5zIGZvY3VzIHRvIHRoZSB0cmlnZ2VyIGlucHV0LiBPbmx5IHVzZWQgZm9yIGNsb3NlcyBkcml2ZW5cbiAgICAvLyBkaXJlY3RseSBieSBhbiBpbi13aWRnZXQgYWN0aW9uIChFc2NhcGUsIGEgZGF5L2Zvb3Rlci1idXR0b24gc2VsZWN0aW9uKSDigJQgdGhlIGRheSBidXR0b25cbiAgICAvLyBvciBmb290ZXIgYnV0dG9uIHRoYXQgaGFkIGZvY3VzIGlzIGFib3V0IHRvIGJlIGRlc3Ryb3llZCwgc28gcmVzdG9yaW5nIGZvY3VzIHRvIHRoZSBpbnB1dFxuICAgIC8vIGlzIGFsd2F5cyBjb3JyZWN0IHRoZXJlLiBOT1QgdXNlZCBmb3IgYG9uUG9wb3Zlck9wZW5DaGFuZ2VgIChvdXRzaWRlLWNsaWNrKSwgd2hlcmUgZm9yY2luZ1xuICAgIC8vIGZvY3VzIGJhY2sgd291bGQgZmlnaHQgdGhlIGNsaWNrIHRoZSB1c2VyIGp1c3QgbWFkZSBvbiBzb21ldGhpbmcgZWxzZS5cbiAgICBwcml2YXRlIGNsb3NlUGFuZWxBbmRGb2N1c0lucHV0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICAgICAgLy8gYHNob3dPbkZvY3VzYCByZW9wZW5zIHRoZSBwYW5lbCBvbiAoZm9jdXMpIOKAlCB3aXRob3V0IHRoaXMgZ3VhcmQsIGZvY3VzaW5nIHRoZSBpbnB1dFxuICAgICAgICAvLyBiYWNrIGhlcmUgd291bGQgaW1tZWRpYXRlbHkgcmVvcGVuIHRoZSBwYW5lbCB3ZSBqdXN0IGNsb3NlZC5cbiAgICAgICAgdGhpcy5zdXBwcmVzc05leHRGb2N1c09wZW4gPSB0cnVlO1xuICAgICAgICB0aGlzLmlucHV0UmVmPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b2dnbGVQYW5lbCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucGFuZWxPcGVuKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub3BlblBhbmVsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25JbnB1dENsaWNrKCk6IHZvaWQge1xuICAgICAgICAvLyBDb20gZGlnaXRhY2FvIGxpZ2FkYSwgY2xpY2FyIG5vIGNhbXBvIHF1ZXIgZGl6ZXIgXCJ2b3UgZXNjcmV2ZXJcIiwgbmFvIFwiYWJyYSBvXG4gICAgICAgIC8vIGNhbGVuZGFyaW9cIiAtIGUgbyBwYWluZWwgYWluZGEgY29icmlyaWEgbyBjYW1wbyBlbnF1YW50byBhIHBlc3NvYSBkaWdpdGEuIEFxdWlcbiAgICAgICAgLy8gbyBjYWxlbmRhcmlvIHBhc3NhIGEgc2VyIHNvIGRvIGJvdGFvIGFvIGxhZG8uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFByZXNvIGFvIGFsbG93VHlwaW5nIGRlIHByb3Bvc2l0bywgZSBuYW8gdmFsZW5kbyBwcmEgdG9kbyBtdW5kbzogYWJyaXIgYW9cbiAgICAgICAgLy8gY2xpY2FyIGUgbyBjb21wb3J0YW1lbnRvIHF1ZSBhcyB0ZWxhcyBxdWUgamEgdXNhbSBvIGNvbXBvbmVudGUgZXNwZXJhbVxuICAgICAgICAvLyAoc2hvd09uRm9jdXMgZSB0cnVlIHBvciBwYWRyYW8pLCBlIG11ZGFyIGlzc28gc2VtIG8gb3B0LWluIHNlcmlhIHF1ZWJyYXIgcXVlbVxuICAgICAgICAvLyBudW5jYSBwZWRpdSBkaWdpdGFjYW8uXG4gICAgICAgIGlmICh0aGlzLmFsbG93VHlwaW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zaG93T25Gb2N1cyAmJiAhdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5vcGVuUGFuZWwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbklucHV0Rm9jdXMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN1cHByZXNzTmV4dEZvY3VzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5zdXBwcmVzc05leHRGb2N1c09wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uSW5wdXRDbGljaygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbk92ZXJsYXlLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlUGFuZWxBbmRGb2N1c0lucHV0KCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnVGFiJyAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgdGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNJbnRvUGFuZWwoZXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLmN1cnJlbnRWaWV3KCk7XG4gICAgICAgIGlmICh2aWV3ID09PSAnZGF5cycpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRGF5c0tleWRvd24oZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGFiIGZyb20gdGhlIGlucHV0IHdvdWxkIG90aGVyd2lzZSBlc2NhcGUgc3RyYWlnaHQgcGFzdCB0aGUgY2FsZW5kYXI6IHRoZSBwb3BvdmVyJ3MgcGFuZWxcbiAgICAvLyBpcyBwb3J0YWxlZCB0byA8Ym9keT4gKGZhciBmcm9tIHRoZSBpbnB1dCBpbiBET00gb3JkZXIpLCBzbyB3aXRob3V0IHRoaXMgaXQganVtcHMgdG9cbiAgICAvLyB3aGF0ZXZlciBwYWdlIGVsZW1lbnQgaGFwcGVucyB0byBjb21lIG5leHQsIG5ldmVyIHJlYWNoaW5nIHRoZSBjYWxlbmRhciBhdCBhbGwuIFRoaXNcbiAgICAvLyByZWRpcmVjdHMgVGFiIGludG8gdGhlIHBhbmVsIGluc3RlYWQg4oCUIGRlbGliZXJhdGVseSBOT1QgZG9uZSBvbiBvcGVuL2ZvY3VzIChlLmcuIHZpYVxuICAgIC8vIGBmb2N1c09uT3BlbmApLCB3aGljaCB3b3VsZCBzdGVhbCBmb2N1cyBmcm9tIHRoZSBpbnB1dCBhbmQgYnJlYWsgdHlwaW5nIGEgZGF0ZSBtYW51YWxseS5cbiAgICBwcml2YXRlIGZvY3VzSW50b1BhbmVsKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRWaWV3KCkgPT09ICdkYXlzJykge1xuICAgICAgICAgICAgY29uc3QgZGF5cyA9IHRoaXMuY2FsZW5kYXJEYXlzKCk7XG4gICAgICAgICAgICBjb25zdCBhY3RpdmVEYXRlID0gdGhpcy5mb2N1c2VkRGF0ZSgpXG4gICAgICAgICAgICAgICAgPz8gZGF5cy5maW5kKGQgPT4gZC50b2RheSk/LmRhdGVcbiAgICAgICAgICAgICAgICA/PyBkYXlzLmZpbmQoZCA9PiBkLmN1cnJlbnRNb250aCk/LmRhdGU7XG5cbiAgICAgICAgICAgIGlmIChhY3RpdmVEYXRlKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzRGF5QnV0dG9uKGFjdGl2ZURhdGUpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5wYW5lbENvbnRlbnRSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGlmIChwYW5lbCkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGZvY3VzRmlyc3REZXNjZW5kYW50KHBhbmVsLCBwYW5lbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCb3VuZCBvbiB0aGUgY2FsZW5kYXIgZ3JpZCBpdHNlbGYgKGAuc2RjLWRhdGVwaWNrZXJfX2RheXNgKSwgd2hpY2ggbGl2ZXMgaW4gdGhlIHBvcG92ZXInc1xuICAgIC8vIHBvcnRhbCDigJQgYSBzZXBhcmF0ZSBET00gc3VidHJlZSBmcm9tIHRoZSBpbnB1dCwgc28gYG9uS2V5ZG93bmAgYWJvdmUgKGJvdW5kIG9uIHRoZSBpbnB1dClcbiAgICAvLyBuZXZlciBzZWVzIGtleWRvd25zIHRoYXQgb3JpZ2luYXRlIGZyb20gYSBkYXkgYnV0dG9uIHRoYXQgYWxyZWFkeSBoYXMgcmVhbCBmb2N1cy4gT25seVxuICAgIC8vIGFycm93IGtleXMgYXJlIGZvcndhcmRlZCBoZXJlOiBFbnRlci9TcGFjZSBhcmUgbGVmdCB0byB0aGUgYnV0dG9uJ3MgbmF0aXZlIGFjdGl2YXRpb25cbiAgICAvLyAod2hpY2ggYWxyZWFkeSBmaXJlcyBgc2VsZWN0RGF5YCB2aWEgYChjbGljaylgKSwgb3RoZXJ3aXNlIHRoZXknZCBkb3VibGUtZmlyZS5cbiAgICBwdWJsaWMgb25EYXlzR3JpZEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFZpZXcoKSAhPT0gJ2RheXMnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LmtleSAhPT0gJ0Fycm93TGVmdCcgJiYgZXZlbnQua2V5ICE9PSAnQXJyb3dSaWdodCcgJiYgZXZlbnQua2V5ICE9PSAnQXJyb3dVcCcgJiYgZXZlbnQua2V5ICE9PSAnQXJyb3dEb3duJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGFuZGxlRGF5c0tleWRvd24oZXZlbnQpO1xuICAgIH1cblxuICAgIC8vIC0tLSBOYXZpZ2F0aW9uIC0tLVxuICAgIHB1YmxpYyBwcmV2TW9udGgoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGQgPSB0aGlzLnZpZXdEYXRlKCk7XG4gICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksIGQuZ2V0TW9udGgoKSAtIDEsIDEpO1xuICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXdEYXRlKTtcbiAgICAgICAgdGhpcy5tb250aENoYW5nZS5lbWl0KHsgbW9udGg6IG5ld0RhdGUuZ2V0TW9udGgoKSArIDEsIHllYXI6IG5ld0RhdGUuZ2V0RnVsbFllYXIoKSB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmV4dE1vbnRoKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBkID0gdGhpcy52aWV3RGF0ZSgpO1xuICAgICAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLCBkLmdldE1vbnRoKCkgKyAxLCAxKTtcbiAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3RGF0ZSk7XG4gICAgICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh7IG1vbnRoOiBuZXdEYXRlLmdldE1vbnRoKCkgKyAxLCB5ZWFyOiBuZXdEYXRlLmdldEZ1bGxZZWFyKCkgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXZZZWFyKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBkID0gdGhpcy52aWV3RGF0ZSgpO1xuICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCkgLSAxLCBkLmdldE1vbnRoKCksIDEpKTtcbiAgICAgICAgdGhpcy55ZWFyQ2hhbmdlLmVtaXQoeyBtb250aDogZC5nZXRNb250aCgpICsgMSwgeWVhcjogZC5nZXRGdWxsWWVhcigpIC0gMSB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmV4dFllYXIoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGQgPSB0aGlzLnZpZXdEYXRlKCk7XG4gICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKGQuZ2V0RnVsbFllYXIoKSArIDEsIGQuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICB0aGlzLnllYXJDaGFuZ2UuZW1pdCh7IG1vbnRoOiBkLmdldE1vbnRoKCkgKyAxLCB5ZWFyOiBkLmdldEZ1bGxZZWFyKCkgKyAxIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmV2WWVhclJhbmdlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBkID0gdGhpcy52aWV3RGF0ZSgpO1xuICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCkgLSBZRUFSU19QRVJfUEFHRSwgZC5nZXRNb250aCgpLCAxKSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5leHRZZWFyUmFuZ2UoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGQgPSB0aGlzLnZpZXdEYXRlKCk7XG4gICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKGQuZ2V0RnVsbFllYXIoKSArIFlFQVJTX1BFUl9QQUdFLCBkLmdldE1vbnRoKCksIDEpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3dpdGNoVG9Nb250aFZpZXcoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY3VycmVudFZpZXcuc2V0KCdtb250aHMnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3dpdGNoVG9ZZWFyVmlldygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jdXJyZW50Vmlldy5zZXQoJ3llYXJzJyk7XG4gICAgfVxuXG4gICAgcHVibGljIHNlbGVjdE1vbnRoKG1vbnRoOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZCA9IHRoaXMudmlld0RhdGUoKTtcbiAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLCBtb250aCwgMSkpO1xuICAgICAgICBpZiAodGhpcy5tb2RlID09PSAnbW9udGgnKSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZERhdGUgPSBuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksIG1vbnRoLCAxKTtcbiAgICAgICAgICAgIHRoaXMuY29tbWl0RGF0ZVZhbHVlKHNlbGVjdGVkRGF0ZSk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlUGFuZWxBbmRGb2N1c0lucHV0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRWaWV3LnNldCgnZGF5cycpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh7IG1vbnRoOiBtb250aCArIDEsIHllYXI6IGQuZ2V0RnVsbFllYXIoKSB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VsZWN0WWVhcih5ZWFyOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZCA9IHRoaXMudmlld0RhdGUoKTtcbiAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUoeWVhciwgZC5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgIHRoaXMuY3VycmVudFZpZXcuc2V0KCdtb250aHMnKTtcbiAgICAgICAgdGhpcy55ZWFyQ2hhbmdlLmVtaXQoeyBtb250aDogZC5nZXRNb250aCgpICsgMSwgeWVhciB9KTtcbiAgICB9XG5cbiAgICAvLyAtLS0gRGF5IHNlbGVjdGlvbiAtLS1cbiAgICBwdWJsaWMgc2VsZWN0RGF5KGRheTogQ2FsZW5kYXJEYXkpOiB2b2lkIHtcbiAgICAgICAgaWYgKGRheS5kaXNhYmxlZCkgeyByZXR1cm47IH1cblxuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoZGF5LmRhdGUpO1xuXG4gICAgICAgIGlmICh0aGlzLm1vZGUgPT09ICdyYW5nZScpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUmFuZ2VTZWxlY3Rpb24oZGF0ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnbXVsdGlwbGUnKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZU11bHRpcGxlU2VsZWN0aW9uKGRhdGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2luZ2xlIHNlbGVjdGlvblxuICAgICAgICBpZiAodGhpcy5zaG93VGltZVBpY2tlcigpKSB7XG4gICAgICAgICAgICBkYXRlLnNldEhvdXJzKHRoaXMuaG91cnMoKSwgdGhpcy5taW51dGVzKCksIHRoaXMuc2Vjb25kcygpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbW1pdERhdGVWYWx1ZShkYXRlKTtcblxuICAgICAgICBpZiAodGhpcy5tb2RlID09PSAnZGF0ZScpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbEFuZEZvY3VzSW5wdXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIC0tLSBUaW1lIC0tLVxuICAgIHB1YmxpYyBpbmNyZW1lbnRIb3VycygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5ob3VyRm9ybWF0ID09PSAnMTInID8gSE9VUl9GT1JNQVRfMTJfTUFYIDogSE9VUl9GT1JNQVRfMjRfTUFYO1xuICAgICAgICB0aGlzLmhvdXJzLnNldCgodGhpcy5ob3VycygpICsgMSkgJSAobWF4ICsgMSkpO1xuICAgICAgICB0aGlzLnVwZGF0ZVRpbWVPblZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlY3JlbWVudEhvdXJzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBtYXggPSB0aGlzLmhvdXJGb3JtYXQgPT09ICcxMicgPyBIT1VSX0ZPUk1BVF8xMl9NQVggOiBIT1VSX0ZPUk1BVF8yNF9NQVg7XG4gICAgICAgIHRoaXMuaG91cnMuc2V0KCh0aGlzLmhvdXJzKCkgLSAxICsgKG1heCArIDEpKSAlIChtYXggKyAxKSk7XG4gICAgICAgIHRoaXMudXBkYXRlVGltZU9uVmFsdWUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5jcmVtZW50TWludXRlcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5taW51dGVzLnNldCgodGhpcy5taW51dGVzKCkgKyB0aGlzLm1pbnV0ZVN0ZXApICUgNjApO1xuICAgICAgICB0aGlzLnVwZGF0ZVRpbWVPblZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlY3JlbWVudE1pbnV0ZXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWludXRlcy5zZXQoKHRoaXMubWludXRlcygpIC0gdGhpcy5taW51dGVTdGVwICsgNjApICUgNjApO1xuICAgICAgICB0aGlzLnVwZGF0ZVRpbWVPblZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGluY3JlbWVudFNlY29uZHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2Vjb25kcy5zZXQoKHRoaXMuc2Vjb25kcygpICsgMSkgJSA2MCk7XG4gICAgICAgIHRoaXMudXBkYXRlVGltZU9uVmFsdWUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVjcmVtZW50U2Vjb25kcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWNvbmRzLnNldCgodGhpcy5zZWNvbmRzKCkgLSAxICsgNjApICUgNjApO1xuICAgICAgICB0aGlzLnVwZGF0ZVRpbWVPblZhbHVlKCk7XG4gICAgfVxuXG4gICAgLy8gLS0tIEJ1dHRvbiBiYXIgYWN0aW9ucyAtLS1cbiAgICBwdWJsaWMgc2VsZWN0VG9kYXkoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICB0aGlzLmhvdXJzLnNldCh0b2RheS5nZXRIb3VycygpKTtcbiAgICAgICAgICAgIHRoaXMubWludXRlcy5zZXQodG9kYXkuZ2V0TWludXRlcygpKTtcbiAgICAgICAgICAgIHRoaXMuc2Vjb25kcy5zZXQodG9kYXkuZ2V0U2Vjb25kcygpKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVGltZU9uVmFsdWUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRvZGF5LnNldEhvdXJzKHRoaXMuaG91cnMoKSwgdGhpcy5taW51dGVzKCksIHRoaXMuc2Vjb25kcygpKTtcbiAgICAgICAgICAgIHRoaXMuY29tbWl0RGF0ZVZhbHVlKHRvZGF5KTtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKHRvZGF5LmdldEZ1bGxZZWFyKCksIHRvZGF5LmdldE1vbnRoKCksIDEpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsb3NlUGFuZWxBbmRGb2N1c0lucHV0KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyVmFsdWUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKG51bGwpO1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQobnVsbCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChudWxsKTtcbiAgICAgICAgdGhpcy5yYW5nZVN0YXJ0LnNldChudWxsKTtcbiAgICAgICAgdGhpcy5yYW5nZUVuZC5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMucmFuZ2VTZWxlY3Rpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbmZpcm1EYXRlVGltZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkID0gbmV3IERhdGUodGhpcy52YWx1ZSk7XG4gICAgICAgICAgICB1cGRhdGVkLnNldEhvdXJzKHRoaXMuaG91cnMoKSwgdGhpcy5taW51dGVzKCksIHRoaXMuc2Vjb25kcygpKTtcbiAgICAgICAgICAgIHRoaXMuY29tbWl0RGF0ZVZhbHVlKHVwZGF0ZWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xvc2VQYW5lbEFuZEZvY3VzSW5wdXQoKTtcbiAgICB9XG5cbiAgICAvLyAtLS0gUG9wb3ZlciBldmVudHMgLS0tXG4gICAgcHVibGljIG9uUG9wb3Zlck9wZW5DaGFuZ2Uob3BlbjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAoIW9wZW4gJiYgdGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gLS0tIFByaXZhdGUgaGVscGVycyAtLS1cbiAgICBwcml2YXRlIGluaXRpYWxpemVWaWV3RGF0ZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZSh0aGlzLnZhbHVlLmdldEZ1bGxZZWFyKCksIHRoaXMudmFsdWUuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGVmYXVsdERhdGUpIHtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKHRoaXMuZGVmYXVsdERhdGUuZ2V0RnVsbFllYXIoKSwgdGhpcy5kZWZhdWx0RGF0ZS5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUobm93LmdldEZ1bGxZZWFyKCksIG5vdy5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5tb2RlID09PSAnbW9udGgnKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRWaWV3LnNldCgnbW9udGhzJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRWaWV3LnNldCgnZGF5cycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb21taXREYXRlVmFsdWUoZGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbHVlID0gZGF0ZTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZShkYXRlKTtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KGRhdGUpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQoZGF0ZSk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlUmFuZ2VTZWxlY3Rpb24oZGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMucmFuZ2VTZWxlY3RpbmcoKSkge1xuICAgICAgICAgICAgLy8gRmlyc3QgY2xpY2s6IHNldCBzdGFydFxuICAgICAgICAgICAgdGhpcy5yYW5nZVN0YXJ0LnNldChkYXRlKTtcbiAgICAgICAgICAgIHRoaXMucmFuZ2VFbmQuc2V0KG51bGwpO1xuICAgICAgICAgICAgdGhpcy5yYW5nZVNlbGVjdGluZy5zZXQodHJ1ZSk7XG4gICAgICAgICAgICBjb25zdCByYW5nZTogRGF0ZVJhbmdlID0geyBzdGFydDogZGF0ZSwgZW5kOiBudWxsIH07XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gcmFuZ2U7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHJhbmdlKTtcbiAgICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChyYW5nZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBTZWNvbmQgY2xpY2s6IHNldCBlbmRcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMucmFuZ2VTdGFydCgpID8/IGRhdGU7XG4gICAgICAgICAgICBsZXQgZW5kID0gZGF0ZTtcbiAgICAgICAgICAgIGlmIChlbmQgPCBzdGFydCkge1xuICAgICAgICAgICAgICAgIFtzdGFydCwgZW5kXSA9IFtlbmQsIHN0YXJ0XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmFuZ2VTdGFydC5zZXQoc3RhcnQpO1xuICAgICAgICAgICAgdGhpcy5yYW5nZUVuZC5zZXQoZW5kKTtcbiAgICAgICAgICAgIHRoaXMucmFuZ2VTZWxlY3Rpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlOiBEYXRlUmFuZ2UgPSB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSByYW5nZTtcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2UocmFuZ2UpO1xuICAgICAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHJhbmdlKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChyYW5nZSk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlUGFuZWxBbmRGb2N1c0lucHV0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVNdWx0aXBsZVNlbGVjdGlvbihkYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpID8gdGhpcy52YWx1ZSA6IFtdO1xuICAgICAgICBjb25zdCBpbmRleCA9IGN1cnJlbnQuZmluZEluZGV4KGQgPT4gdGhpcy5pc1NhbWVEYXkoZCwgZGF0ZSkpO1xuICAgICAgICBsZXQgdXBkYXRlZDogRGF0ZVtdO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgdXBkYXRlZCA9IFsuLi5jdXJyZW50LnNsaWNlKDAsIGluZGV4KSwgLi4uY3VycmVudC5zbGljZShpbmRleCArIDEpXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVwZGF0ZWQgPSBbLi4uY3VycmVudCwgZGF0ZV07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWx1ZSA9IHVwZGF0ZWQ7XG4gICAgICAgIHRoaXMub25DaGFuZ2UodXBkYXRlZCk7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh1cGRhdGVkKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5lbWl0KHVwZGF0ZWQpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVRpbWVPblZhbHVlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5tb2RlID09PSAndGltZScpIHtcbiAgICAgICAgICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgZC5zZXRIb3Vycyh0aGlzLmhvdXJzKCksIHRoaXMubWludXRlcygpLCB0aGlzLnNlY29uZHMoKSwgMCk7XG4gICAgICAgICAgICB0aGlzLmNvbW1pdERhdGVWYWx1ZShkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy52YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWQgPSBuZXcgRGF0ZSh0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIHVwZGF0ZWQuc2V0SG91cnModGhpcy5ob3VycygpLCB0aGlzLm1pbnV0ZXMoKSwgdGhpcy5zZWNvbmRzKCkpO1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHVwZGF0ZWQ7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHVwZGF0ZWQpO1xuICAgICAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHVwZGF0ZWQpO1xuICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGlzRGF0ZVNlbGVjdGVkKGRhdGU6IERhdGUpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgdmFsID0gdGhpcy52YWx1ZTtcbiAgICAgICAgaWYgKCF2YWwpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ3JhbmdlJykge1xuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSB2YWwgYXMgRGF0ZVJhbmdlO1xuICAgICAgICAgICAgcmV0dXJuICghIXJhbmdlLnN0YXJ0ICYmIHRoaXMuaXNTYW1lRGF5KHJhbmdlLnN0YXJ0LCBkYXRlKSkgfHxcbiAgICAgICAgICAgICAgICAoISFyYW5nZS5lbmQgJiYgdGhpcy5pc1NhbWVEYXkocmFuZ2UuZW5kLCBkYXRlKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnbXVsdGlwbGUnICYmIEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5zb21lKGQgPT4gdGhpcy5pc1NhbWVEYXkoZCwgZGF0ZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzU2FtZURheSh2YWwsIGRhdGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzRGF0ZURpc2FibGVkKGRhdGU6IERhdGUpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMubWluICYmIGRhdGUgPCB0aGlzLm1pbikgeyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICBpZiAodGhpcy5tYXggJiYgZGF0ZSA+IHRoaXMubWF4KSB7IHJldHVybiB0cnVlOyB9XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkRGF5cy5pbmNsdWRlcyhkYXRlLmdldERheSgpKSkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZERhdGVzLnNvbWUoZCA9PiB0aGlzLmlzU2FtZURheShkLCBkYXRlKSkpIHsgcmV0dXJuIHRydWU7IH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNJblJhbmdlKGRhdGU6IERhdGUpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMubW9kZSAhPT0gJ3JhbmdlJykgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgY29uc3QgdmFsID0gdGhpcy52YWx1ZSBhcyBEYXRlUmFuZ2UgfCBudWxsO1xuICAgICAgICBpZiAoIXZhbD8uc3RhcnQgfHwgIXZhbD8uZW5kKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICByZXR1cm4gZGF0ZSA+IHZhbC5zdGFydCAmJiBkYXRlIDwgdmFsLmVuZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzUmFuZ2VTdGFydChkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLm1vZGUgIT09ICdyYW5nZScpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgIGNvbnN0IHZhbCA9IHRoaXMudmFsdWUgYXMgRGF0ZVJhbmdlIHwgbnVsbDtcbiAgICAgICAgcmV0dXJuICEhdmFsPy5zdGFydCAmJiB0aGlzLmlzU2FtZURheSh2YWwuc3RhcnQsIGRhdGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNSYW5nZUVuZChkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLm1vZGUgIT09ICdyYW5nZScpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgIGNvbnN0IHZhbCA9IHRoaXMudmFsdWUgYXMgRGF0ZVJhbmdlIHwgbnVsbDtcbiAgICAgICAgcmV0dXJuICEhdmFsPy5lbmQgJiYgdGhpcy5pc1NhbWVEYXkodmFsLmVuZCwgZGF0ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc01vbnRoU2VsZWN0ZWQobW9udGg6IG51bWJlciwgeWVhcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHZhbCA9IHRoaXMudmFsdWU7XG4gICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsLmdldE1vbnRoKCkgPT09IG1vbnRoICYmIHZhbC5nZXRGdWxsWWVhcigpID09PSB5ZWFyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzU2FtZURheShhOiBEYXRlLCBiOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBhLmdldEZ1bGxZZWFyKCkgPT09IGIuZ2V0RnVsbFllYXIoKSAmJlxuICAgICAgICAgICAgYS5nZXRNb250aCgpID09PSBiLmdldE1vbnRoKCkgJiZcbiAgICAgICAgICAgIGEuZ2V0RGF0ZSgpID09PSBiLmdldERhdGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZURheXNLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZvY3VzZWQgPSB0aGlzLmZvY3VzZWREYXRlKCkgPz8gdGhpcy52aWV3RGF0ZSgpO1xuICAgICAgICBsZXQgbmV3RGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICAgICAgICBjYXNlICdBcnJvd0xlZnQnOlxuICAgICAgICAgICAgICAgIG5ld0RhdGUgPSBuZXcgRGF0ZShmb2N1c2VkLmdldEZ1bGxZZWFyKCksIGZvY3VzZWQuZ2V0TW9udGgoKSwgZm9jdXNlZC5nZXREYXRlKCkgLSAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxuICAgICAgICAgICAgICAgIG5ld0RhdGUgPSBuZXcgRGF0ZShmb2N1c2VkLmdldEZ1bGxZZWFyKCksIGZvY3VzZWQuZ2V0TW9udGgoKSwgZm9jdXNlZC5nZXREYXRlKCkgKyAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgICAgIG5ld0RhdGUgPSBuZXcgRGF0ZShmb2N1c2VkLmdldEZ1bGxZZWFyKCksIGZvY3VzZWQuZ2V0TW9udGgoKSwgZm9jdXNlZC5nZXREYXRlKCkgLSBEQVlTX0lOX1dFRUspO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgICAgICBuZXdEYXRlID0gbmV3IERhdGUoZm9jdXNlZC5nZXRGdWxsWWVhcigpLCBmb2N1c2VkLmdldE1vbnRoKCksIGZvY3VzZWQuZ2V0RGF0ZSgpICsgREFZU19JTl9XRUVLKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgICAgIGNhc2UgJyAnOlxuICAgICAgICAgICAgICAgIGlmIChmb2N1c2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0RGF5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU6IGZvY3VzZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXk6IGZvY3VzZWQuZ2V0RGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE1vbnRoOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9kYXk6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IHRoaXMuaXNEYXRlRGlzYWJsZWQoZm9jdXNlZCksXG4gICAgICAgICAgICAgICAgICAgICAgICBpblJhbmdlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlU3RhcnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VFbmQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5ld0RhdGUpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWREYXRlLnNldChuZXdEYXRlKTtcbiAgICAgICAgICAgIC8vIE5hdmlnYXRlIG1vbnRoIGlmIG5lZWRlZFxuICAgICAgICAgICAgaWYgKG5ld0RhdGUuZ2V0TW9udGgoKSAhPT0gdGhpcy52aWV3RGF0ZSgpLmdldE1vbnRoKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZShuZXdEYXRlLmdldEZ1bGxZZWFyKCksIG5ld0RhdGUuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU3luY2hyb25vdXMgc28gdGhlIChwb3NzaWJseSBuZXcgbW9udGgncykgZGF5IGJ1dHRvbnMgZXhpc3QgYmVmb3JlIHdlIGZvY3VzIG9uZS5cbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNEYXlCdXR0b24obmV3RGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNb3ZlcyByZWFsIERPTSBmb2N1cyBvbnRvIHRoZSBkYXkgYnV0dG9uIG1hdGNoaW5nIGBkYXRlYCwga2VlcGluZyByb3ZpbmcgdGFiaW5kZXgvZm9jdXNcbiAgICAvLyBpbiBzeW5jIHdpdGggYGZvY3VzZWREYXRlYCDigJQgd2l0aG91dCB0aGlzLCBhcnJvdy1rZXkgbmF2aWdhdGlvbiBvbmx5IHVwZGF0ZWQgaW50ZXJuYWxcbiAgICAvLyBzdGF0ZSBhbmQgdGhlIHZpc2libGUgYnJvd3Nlci9zY3JlZW4tcmVhZGVyIGZvY3VzIG5ldmVyIGFjdHVhbGx5IG1vdmVkLlxuICAgIHByaXZhdGUgZm9jdXNEYXlCdXR0b24oZGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuY2FsZW5kYXJEYXlzKCkuZmluZEluZGV4KGRheSA9PiB0aGlzLmlzU2FtZURheShkYXkuZGF0ZSwgZGF0ZSkpO1xuICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXlCdXR0b25SZWZzPy50b0FycmF5KClbaW5kZXhdPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5lcyB3aGljaCBkYXkgaXMgdGhlIGNhbGVuZGFyIGdyaWQncyBzaW5nbGUgcm92aW5nIHRhYmluZGV4PTAgc3RvcDogdGhlIGxhc3RcbiAgICAvLyBrZXlib2FyZC1mb2N1c2VkIGRheSBpZiBhbnksIG90aGVyd2lzZSB0b2RheSAoaWYgdmlzaWJsZSBpbiB0aGUgY3VycmVudCBtb250aCksIG90aGVyd2lzZVxuICAgIC8vIHRoZSBmaXJzdCBkYXkgYmVsb25naW5nIHRvIHRoZSBjdXJyZW50IG1vbnRoIOKAlCBzbyB0aGUgZ3JpZCBhbHdheXMgaGFzIGV4YWN0bHkgb25lIHRhYiBzdG9wLlxuICAgIHB1YmxpYyBpc0RheVRhYlN0b3AoZGF5OiBDYWxlbmRhckRheSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBmb2N1c2VkID0gdGhpcy5mb2N1c2VkRGF0ZSgpO1xuICAgICAgICBpZiAoZm9jdXNlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNTYW1lRGF5KGRheS5kYXRlLCBmb2N1c2VkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRheXMgPSB0aGlzLmNhbGVuZGFyRGF5cygpO1xuICAgICAgICBpZiAoZGF5cy5zb21lKGQgPT4gZC50b2RheSkpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXkudG9kYXk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdEN1cnJlbnRNb250aERheSA9IGRheXMuZmluZChkID0+IGQuY3VycmVudE1vbnRoKSA/PyBkYXlzWzBdO1xuICAgICAgICByZXR1cm4gZmlyc3RDdXJyZW50TW9udGhEYXkgPyB0aGlzLmlzU2FtZURheShkYXkuZGF0ZSwgZmlyc3RDdXJyZW50TW9udGhEYXkuZGF0ZSkgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25JbnB1dFR5cGluZyhldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmFsbG93VHlwaW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy5hcHBseURhdGVNYXNrKGlucHV0LCBpbnB1dC52YWx1ZSk7XG4gICAgICAgIHRoaXMudHlwZWRUZXh0LnNldCh0ZXh0KTtcblxuICAgICAgICBjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlVHlwZWREYXRlKHRleHQpO1xuXG4gICAgICAgIC8vIFNvIGNvbWl0YSBkYXRhIGNvbXBsZXRhIGUgdmFsaWRhLiBDb20gbyB0ZXh0byBwZWxhIG1ldGFkZSAoXCIxOC8wXCIpIG5hbyBoYSBvXG4gICAgICAgIC8vIHF1ZSBjb21taXRhciwgZSB0YW1iZW0gbmFvIHNlIGFwYWdhIG8gcXVlIGphIGV4aXN0aWEgLSBsaW1wYXIgYSBjYWRhIHRlY2xhXG4gICAgICAgIC8vIGZhcmlhIG8gY2FsZW5kYXJpbyBwaXNjYXIgZHVyYW50ZSBhIGRpZ2l0YWNhby5cbiAgICAgICAgaWYgKHBhcnNlZCkge1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUocGFyc2VkLmdldEZ1bGxZZWFyKCksIHBhcnNlZC5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgICAgICB0aGlzLmNvbW1pdERhdGVWYWx1ZShwYXJzZWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5zZXJlIG9zIHNlcGFyYWRvcmVzIGVucXVhbnRvIG8gdXN1YXJpbyBkaWdpdGE6IDAxMTAyMDA2IHZpcmEgMDEvMTAvMjAwNiwgZVxuICAgIC8vIHl5eXktTU0tZGQgcHJvZHV6IDIwMDYtMTAtMDEgYSBwYXJ0aXIgZG9zIG1lc21vcyBkaWdpdG9zLiBRdWVtIGRpdGEgYSBmb3JtYSBlIG9cbiAgICAvLyBwcm9wcmlvIGRhdGVGb3JtYXQgLSBuYWRhIGRlIFwiL1wiIGVzY3JpdG8gYSBtYW8gYXF1aS5cbiAgICAvL1xuICAgIC8vIEVzY3JldmUgZGlyZXRvIG5vIGlucHV0LCBlIG5hbyBzbyBubyBzaWduYWw6IG8gdGV4dG8gcXVlIG8gdXN1YXJpbyBkaWdpdG91IGphXG4gICAgLy8gZXN0YSBubyBET00sIGUgc2VtIHJlZXNjcmV2ZXIgbyBjYW1wbyBmaWNhcmlhIGNvbSBvcyBkaWdpdG9zIGNydXMgYXRlIG8gcHJveGltb1xuICAgIC8vIGNpY2xvIGRlIGRldGVjY2FvLiBNZXhlciBubyBET00gdGFtYmVtIG9icmlnYSBhIHJlY29sb2NhciBvIGN1cnNvciwgc2VuYW8gZWxlXG4gICAgLy8gcHVsYSBwcm8gZmltIGEgY2FkYSB0ZWNsYSAtIHZlciBvIGNhbGN1bG8gYWJhaXhvLlxuICAgIHByaXZhdGUgYXBwbHlEYXRlTWFzayhpbnB1dDogSFRNTElucHV0RWxlbWVudCwgcmF3OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICAvLyBTbyBubyBtb2RvICdkYXRlJzogZGF0ZXRpbWUvdGltZS9yYW5nZS9tb250aCB0ZW0gb3V0cmFzIHBhcnRlcyBubyBmb3JtYXRvLCBlXG4gICAgICAgIC8vIG1hc2NhcmFyIHBvciBlc3RlIGNhbWluaG8gY29ydGFyaWEgYSBob3JhLlxuICAgICAgICBpZiAodGhpcy5tb2RlICE9PSAnZGF0ZScgfHwgIXRoaXMuZGF0ZUZvcm1hdE9yZGVyKCkpIHtcbiAgICAgICAgICAgIHJldHVybiByYXc7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjYXJldCA9IGlucHV0LnNlbGVjdGlvblN0YXJ0ID8/IHJhdy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGRpZ2l0c0JlZm9yZUNhcmV0ID0gcmF3LnNsaWNlKDAsIGNhcmV0KS5yZXBsYWNlKC9cXEQvZywgJycpLmxlbmd0aDtcbiAgICAgICAgY29uc3QgbWFza2VkID0gdGhpcy5tYXNrQnlEYXRlRm9ybWF0KHJhdyk7XG5cbiAgICAgICAgaWYgKG1hc2tlZCA9PT0gcmF3KSB7XG4gICAgICAgICAgICByZXR1cm4gcmF3O1xuICAgICAgICB9XG5cbiAgICAgICAgaW5wdXQudmFsdWUgPSBtYXNrZWQ7XG5cbiAgICAgICAgLy8gUmVjb2xvY2EgbyBjdXJzb3IgREVQT0lTIGRvIG1lc21vIGRpZ2l0byBlbSBxdWUgZWxlIGVzdGF2YSwgY29udGFuZG8gZGlnaXRvcyBlXG4gICAgICAgIC8vIG5hbyBwb3NpY29lcyAtIG9zIHNlcGFyYWRvcmVzIGVudHJhbSBlIHNhZW0gY29uZm9ybWUgbyB0ZXh0byBjcmVzY2UsIGVudGFvIGFcbiAgICAgICAgLy8gcG9zaWNhbyBjcnVhIG5hbyBzZSBtYW50ZW0gZW50cmUgdW0gZXN0YWRvIGUgb3V0cm8uXG4gICAgICAgIGxldCBwb3NpdGlvbiA9IDA7XG4gICAgICAgIGxldCBzZWVuID0gMDtcbiAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgbWFza2VkLmxlbmd0aCAmJiBzZWVuIDwgZGlnaXRzQmVmb3JlQ2FyZXQpIHtcbiAgICAgICAgICAgIGlmICgvXFxkLy50ZXN0KG1hc2tlZFtwb3NpdGlvbl0pKSB7XG4gICAgICAgICAgICAgICAgc2VlbisrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zaXRpb24rKztcbiAgICAgICAgfVxuICAgICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZShwb3NpdGlvbiwgcG9zaXRpb24pO1xuXG4gICAgICAgIHJldHVybiBtYXNrZWQ7XG4gICAgfVxuXG4gICAgLy8gUGVyY29ycmUgbyBkYXRlRm9ybWF0IGNvbG9jYW5kbyB1bSBkaWdpdG8gb25kZSBoYSBkL00veSBlIG8gbGl0ZXJhbCBvbmRlIGhhXG4gICAgLy8gc2VwYXJhZG9yLiBQYXJhIHF1YW5kbyBvcyBkaWdpdG9zIGFjYWJhbSwgZW50YW8gbyBzZXBhcmFkb3Igc28gYXBhcmVjZSBqdW50byBkb1xuICAgIC8vIGRpZ2l0byBzZWd1aW50ZSAtIGRpZ2l0YXIgXCIwMVwiIG1vc3RyYSBcIjAxXCIsIGUgbyBcIi9cIiBjaGVnYSBjb20gbyB0ZXJjZWlybyBudW1lcm8uXG4gICAgcHJpdmF0ZSBtYXNrQnlEYXRlRm9ybWF0KHJhdzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgZm9ybWF0ID0gdGhpcy5kYXRlRm9ybWF0O1xuICAgICAgICBjb25zdCBtYXhEaWdpdHMgPSAoZm9ybWF0Lm1hdGNoKC9bZE15XS9nKSA/PyBbXSkubGVuZ3RoO1xuICAgICAgICBjb25zdCBkaWdpdHMgPSByYXcucmVwbGFjZSgvXFxEL2csICcnKS5zbGljZSgwLCBtYXhEaWdpdHMpO1xuXG4gICAgICAgIGxldCBtYXNrZWQgPSAnJztcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcblxuICAgICAgICBmb3IgKGNvbnN0IGNoYXIgb2YgZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPj0gZGlnaXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtYXNrZWQgKz0gL1tkTXldLy50ZXN0KGNoYXIpID8gZGlnaXRzW2luZGV4KytdIDogY2hhcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtYXNrZWQ7XG4gICAgfVxuXG4gICAgLy8gQW8gc2FpciBkbyBjYW1wbyBvIHRleHRvIGVtIGRpZ2l0YWNhbyBkYSBsdWdhciBhbyB2YWxvciBmb3JtYXRhZG8uIFRleHRvIGludmFsaWRvXG4gICAgLy8gb3UgaW5jb21wbGV0byBzb21lOiBvIGNhbXBvIHZvbHRhIGFvIHVsdGltbyB2YWxvciB2YWxpZG8sIGVtIHZleiBkZSBkZWl4YXIgbmFcbiAgICAvLyB0ZWxhIGFsZ28gcXVlIG8gY29tcG9uZW50ZSBuYW8gcmVjb25oZWNlIGNvbW8gZGF0YS5cbiAgICBwdWJsaWMgb25JbnB1dEJsdXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudHlwZWRUZXh0LnNldChudWxsKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgLy8gTGUgYSBkYXRhIGNvbmZvcm1lIG8gZGF0ZUZvcm1hdCBjb25maWd1cmFkbyBlIHZhbGlkYSBvIERPTUlOSU8sIG5hbyBzbyBvIGZvcm1hdG86XG4gICAgLy8gMzIvMTMvMjAyNiBjYXNhIGNvbSBcImRkL01NL3l5eXlcIiBlIG5hbyBleGlzdGUuIE8gRGF0ZSBkbyBKUyBhY2VpdGEgb3ZlcmZsb3cgZW1cbiAgICAvLyBzaWxlbmNpbyAobmV3IERhdGUoMjAyNiwgMTIsIDMyKSB2aXJhIDAxLzAyLzIwMjcpLCBlbnRhbyBhIHZlcmlmaWNhY2FvIGUgZGUgaWRhIGVcbiAgICAvLyB2b2x0YTogc2UgbyBkaWEsIG8gbWVzIG91IG8gYW5vIG11ZGFyYW0sIGEgZW50cmFkYSBlcmEgaW52YWxpZGEuXG4gICAgcHJpdmF0ZSBwYXJzZVR5cGVkRGF0ZSh0ZXh0OiBzdHJpbmcpOiBEYXRlIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IG9yZGVyID0gdGhpcy5kYXRlRm9ybWF0T3JkZXIoKTtcbiAgICAgICAgY29uc3QgbnVtYmVycyA9IHRleHQubWF0Y2goL1xcZCsvZyk7XG5cbiAgICAgICAgaWYgKCFvcmRlciB8fCAhbnVtYmVycyB8fCBudW1iZXJzLmxlbmd0aCA8IDMpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQW5vIGRlIDIgZGlnaXRvcyBuYW8gZSBhY2VpdG86IFwiMTgvMDYvMjZcIiB0YW50byBwb2RlIHNlciAxOTI2IHF1YW50byAyMDI2LCBlXG4gICAgICAgIC8vIGFkaXZpbmhhciBwcm9kdXogZGF0YSBlcnJhZGEgc2VtIG8gdXN1YXJpbyBwZXJjZWJlci5cbiAgICAgICAgaWYgKG51bWJlcnNbb3JkZXIueWVhcl0ubGVuZ3RoICE9PSA0KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRheSA9IE51bWJlcihudW1iZXJzW29yZGVyLmRheV0pO1xuICAgICAgICBjb25zdCBtb250aCA9IE51bWJlcihudW1iZXJzW29yZGVyLm1vbnRoXSk7XG4gICAgICAgIGNvbnN0IHllYXIgPSBOdW1iZXIobnVtYmVyc1tvcmRlci55ZWFyXSk7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5KTtcblxuICAgICAgICBjb25zdCByb3VuZFRyaXBzQmFjayA9IHBhcnNlZC5nZXREYXRlKCkgPT09IGRheSAmJiBwYXJzZWQuZ2V0TW9udGgoKSA9PT0gbW9udGggLSAxICYmIHBhcnNlZC5nZXRGdWxsWWVhcigpID09PSB5ZWFyO1xuXG4gICAgICAgIHJldHVybiByb3VuZFRyaXBzQmFjayA/IHBhcnNlZCA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gRW0gcXVlIHBvc2ljYW8gZGlhLCBtZXMgZSBhbm8gYXBhcmVjZW0gbm8gZGF0ZUZvcm1hdCBjb25maWd1cmFkbyAtIG8gY2FtcG8gcG9kZVxuICAgIC8vIGVzdGFyIGNvbW8gZGQvTU0veXl5eSwgTU0vZGQveXl5eSBvdSB5eXl5LU1NLWRkIGNvbmZvcm1lIG8gbG9jYWxlLlxuICAgIHByaXZhdGUgZGF0ZUZvcm1hdE9yZGVyKCk6IHsgZGF5OiBudW1iZXI7IG1vbnRoOiBudW1iZXI7IHllYXI6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gW1xuICAgICAgICAgICAgeyBrZXk6ICdkYXknIGFzIGNvbnN0LCBwb3NpdGlvbjogdGhpcy5kYXRlRm9ybWF0LmluZGV4T2YoJ2RkJykgfSxcbiAgICAgICAgICAgIHsga2V5OiAnbW9udGgnIGFzIGNvbnN0LCBwb3NpdGlvbjogdGhpcy5kYXRlRm9ybWF0LmluZGV4T2YoJ01NJykgfSxcbiAgICAgICAgICAgIHsga2V5OiAneWVhcicgYXMgY29uc3QsIHBvc2l0aW9uOiB0aGlzLmRhdGVGb3JtYXQuaW5kZXhPZigneXl5eScpIH1cbiAgICAgICAgXTtcblxuICAgICAgICBpZiAocGFydHMuc29tZSgocGFydCkgPT4gcGFydC5wb3NpdGlvbiA8IDApKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5wYXJ0c10uc29ydCgoYSwgYikgPT4gYS5wb3NpdGlvbiAtIGIucG9zaXRpb24pO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXk6IHNvcnRlZC5maW5kSW5kZXgoKHBhcnQpID0+IHBhcnQua2V5ID09PSAnZGF5JyksXG4gICAgICAgICAgICBtb250aDogc29ydGVkLmZpbmRJbmRleCgocGFydCkgPT4gcGFydC5rZXkgPT09ICdtb250aCcpLFxuICAgICAgICAgICAgeWVhcjogc29ydGVkLmZpbmRJbmRleCgocGFydCkgPT4gcGFydC5rZXkgPT09ICd5ZWFyJylcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBPcyBub21lcyB2aW5oYW0gZml4b3MgZW0gaW5nbGVzIG5vIGNvZGlnby4gSW50bCByZXNvbHZlIHBlbG8gaWRpb21hIGF0aXZvIHNlbVxuICAgIC8vIHByZWNpc2FyIGRlIGNoYXZlIGRlIHRyYWR1Y2FvIHByYSBjYWRhIG1lcyBlIGNhZGEgZGlhIC0gZSBlIG8gbWVzbW8gY2FtaW5obyBxdWVcbiAgICAvLyBvIGNoYXQuY29tcG9uZW50LnRzIGphIHVzYSBuYSBsaWIuXG4gICAgLy9cbiAgICAvLyBPIGFubyBkZSByZWZlcmVuY2lhIGUgYXJiaXRyYXJpbzogc28gcHJlY2lzYSBkZSB1bSBkb21pbmdvIGNvbmhlY2lkbyAoMjAyMy0wMS0wMSlcbiAgICAvLyBlIGRlIHVtIGRpYSAxIGRlIGNhZGEgbWVzLlxuICAgIHByaXZhdGUgbG9jYWxpemVkV2Vla0RheU5hbWVzKGxhbmc6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgZm9ybWF0YWRvciA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxhbmcgfHwgJ3B0JywgeyB3ZWVrZGF5OiAnc2hvcnQnIH0pO1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogREFZU19JTl9XRUVLIH0sIChfLCBkYXkpID0+XG4gICAgICAgICAgICB0aGlzLnNlbVBvbnRvRmluYWwoZm9ybWF0YWRvci5mb3JtYXQobmV3IERhdGUoMjAyMywgMCwgMSArIGRheSkpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgbG9jYWxpemVkTW9udGhOYW1lcyhsYW5nOiBzdHJpbmcsIGVzdGlsbzogJ3Nob3J0JyB8ICdsb25nJyk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgZm9ybWF0YWRvciA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxhbmcgfHwgJ3B0JywgeyBtb250aDogZXN0aWxvIH0pO1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogTU9OVEhTX0lOX1lFQVIgfSwgKF8sIG1vbnRoKSA9PlxuICAgICAgICAgICAgdGhpcy5zZW1Qb250b0ZpbmFsKGZvcm1hdGFkb3IuZm9ybWF0KG5ldyBEYXRlKDIwMjMsIG1vbnRoLCAxKSkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gcHQgYWJyZXZpYSBjb20gcG9udG8gKFwiamFuLlwiLCBcImRvbS5cIik7IG5vIGNhYmVjYWxobyBkbyBjYWxlbmRhcmlvIG8gcG9udG8gc29cbiAgICAvLyBvY3VwYSBlc3BhY28gbnVtYSBjb2x1bmEgcXVlIGphIGUgZXN0cmVpdGEuXG4gICAgcHJpdmF0ZSBzZW1Qb250b0ZpbmFsKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0ZXh0LmVuZHNXaXRoKCcuJykgPyB0ZXh0LnNsaWNlKDAsIC0xKSA6IHRleHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb3JtYXREYXRlKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBkID0gZGF0ZS5nZXREYXRlKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgICBjb25zdCBtID0gKGRhdGUuZ2V0TW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgICAgY29uc3QgeSA9IGRhdGUuZ2V0RnVsbFllYXIoKS50b1N0cmluZygpO1xuICAgICAgICBjb25zdCBoaCA9IGRhdGUuZ2V0SG91cnMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICAgIGNvbnN0IG1tID0gZGF0ZS5nZXRNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgICBjb25zdCBzcyA9IGRhdGUuZ2V0U2Vjb25kcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcblxuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5kYXRlRm9ybWF0XG4gICAgICAgICAgICAucmVwbGFjZSgnZGQnLCBkKVxuICAgICAgICAgICAgLnJlcGxhY2UoJ01NJywgbSlcbiAgICAgICAgICAgIC5yZXBsYWNlKCd5eXl5JywgeSlcbiAgICAgICAgICAgIC5yZXBsYWNlKCd5eScsIHkuc2xpY2UoLVlFQVJfU0hPUlRfTEVOR1RIKSk7XG5cbiAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ2RhdGV0aW1lJykge1xuICAgICAgICAgICAgcmVzdWx0ICs9IGAgJHtoaH06JHttbX1gO1xuICAgICAgICAgICAgaWYgKHRoaXMuc2hvd1NlY29uZHMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gYDoke3NzfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5tb2RlID09PSAndGltZScpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGAke2hofToke21tfWA7XG4gICAgICAgICAgICBpZiAodGhpcy5zaG93U2Vjb25kcykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBgOiR7c3N9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHVibGljIHBhZFRpbWUobjogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIG4udG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJzZGMtZGF0ZXBpY2tlclwiPlxuICBAaWYgKGxhYmVsS2V5KCkpIHtcbiAgICA8ZGl2IGNsYXNzPVwic2RjLWRhdGVwaWNrZXJfX2xhYmVsLXJvd1wiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwic2RjLWRhdGVwaWNrZXJfX2xhYmVsXCIgW2F0dHIuZm9yXT1cImlucHV0SWRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9fbGFiZWwtdGV4dFwiPlxuICAgICAgICAgIHt7IGxhYmVsS2V5KCkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICBAaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkLWZpZWxkXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+Kjwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvbGFiZWw+XG4gICAgPC9kaXY+XG4gIH1cblxuICA8c2RjLXBvcG92ZXJcbiAgICBbb3Blbl09XCJwYW5lbE9wZW5cIlxuICAgIFt0b2dnbGVPblRyaWdnZXJDbGlja109XCJmYWxzZVwiXG4gICAgW2Nsb3NlT25PdXRzaWRlQ2xpY2tdPVwidHJ1ZVwiXG4gICAgW2Nsb3NlT25Fc2NhcGVdPVwidHJ1ZVwiXG4gICAgW21hdGNoVHJpZ2dlcldpZHRoXT1cImZhbHNlXCJcbiAgICBbcmVzdG9yZUZvY3VzT25DbG9zZV09XCJmYWxzZVwiXG4gICAgW3RyYXBGb2N1c109XCJ0cnVlXCJcbiAgICBbYXJpYUxhYmVsXT1cIidkYXRlcGlja2VyLmNhbGVuZGFyJ1wiXG4gICAgcGFuZWxDbGFzcz1cInNkYy1kYXRlcGlja2VyLXBvcG92ZXItcGFuZWxcIlxuICAgIChvcGVuQ2hhbmdlKT1cIm9uUG9wb3Zlck9wZW5DaGFuZ2UoJGV2ZW50KVwiXG4gID5cbiAgICA8ZGl2IHNkYy1wb3BvdmVyLXRyaWdnZXI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwic2RjLWRhdGVwaWNrZXJfX2NvbnRyb2xcIlxuICAgICAgICAjdHJpZ2dlclJlZlxuICAgICAgICBbY2xhc3Muc2RjLWRhdGVwaWNrZXJfX2NvbnRyb2wtLWludmFsaWRdPVwiaW52YWxpZFwiXG4gICAgICAgIFtjbGFzcy5zZGMtZGF0ZXBpY2tlcl9fY29udHJvbC0tZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICBbbmdTdHlsZV09XCJnZXRJbnB1dFN0eWxlKClcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLWRhdGVwaWNrZXJfX3ZhbHVlXCI+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAjaW5wdXRSZWZcbiAgICAgICAgICAgIFtpZF09XCJpbnB1dElkXCJcbiAgICAgICAgICAgIGNsYXNzPVwic2RjLWRhdGVwaWNrZXJfX2lucHV0XCJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICBbcmVhZE9ubHldPVwicmVhZG9ubHlJbnB1dCAmJiAhYWxsb3dUeXBpbmdcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyIHx8IGRhdGVGb3JtYXRcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImlucHV0VmFsdWUoKVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImxhYmVsS2V5KCkgPyAobGFiZWxLZXkoKSB8IHRyYW5zbGF0ZSkgOiBwbGFjZWhvbGRlclwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInBhbmVsT3BlblwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cIidkaWFsb2cnXCJcbiAgICAgICAgICAgIGFyaWEtYXV0b2NvbXBsZXRlPVwibm9uZVwiXG4gICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uSW5wdXRDbGljaygpXCJcbiAgICAgICAgICAgIChmb2N1cyk9XCJvbklucHV0Rm9jdXMoKVwiXG4gICAgICAgICAgICAoaW5wdXQpPVwib25JbnB1dFR5cGluZygkZXZlbnQpXCJcbiAgICAgICAgICAgIChibHVyKT1cIm9uSW5wdXRCbHVyKClcIlxuICAgICAgICAgICAgKGtleWRvd24pPVwib25LZXlkb3duKCRldmVudClcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9fYWN0aW9uc1wiPlxuICAgICAgICAgIEBpZiAoc2hvd0NsZWFyICYmIHZhbHVlKSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cInNkYy1kYXRlcGlja2VyX19pY29uLWJ1dHRvbiBzZGMtZGF0ZXBpY2tlcl9faWNvbi1idXR0b24tLWNsZWFyXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInZGF0ZXBpY2tlci5jbGVhcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJWYWx1ZSgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10aW1lc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKHNob3dJY29uKSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cInNkYy1kYXRlcGlja2VyX19pY29uLWJ1dHRvbiBzZGMtZGF0ZXBpY2tlcl9faWNvbi1idXR0b24tLXRvZ2dsZVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ2RhdGVwaWNrZXIuY2FsZW5kYXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJwYW5lbE9wZW5cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUGFuZWwoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGkgW2NsYXNzXT1cImljb25cIiBjbGFzcz1cInNkYy1kYXRlcGlja2VyX19pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBzZGMtcG9wb3Zlci1jb250ZW50PlxuICAgICAgPGRpdlxuICAgICAgI3BhbmVsQ29udGVudFJlZlxuICAgICAgY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9fcGFuZWxcIlxuICAgICAgKGtleWRvd24pPVwib25PdmVybGF5S2V5ZG93bigkZXZlbnQpXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ2RhdGVwaWNrZXIuY2FsZW5kYXInIHwgdHJhbnNsYXRlXCJcbiAgICA+XG4gICAgICA8IS0tIE5hdmlnYXRpb24gSGVhZGVyIC0tPlxuICAgICAgQGlmIChtb2RlICE9PSAndGltZScpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInNkYy1kYXRlcGlja2VyX19oZWFkZXJcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwic2RjLWRhdGVwaWNrZXJfX25hdi1idG5cIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInZGF0ZXBpY2tlci5wcmV2JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY3VycmVudFZpZXcoKSA9PT0gJ2RheXMnID8gcHJldk1vbnRoKCkgOiBjdXJyZW50VmlldygpID09PSAnbW9udGhzJyA/IHByZXZZZWFyKCkgOiBwcmV2WWVhclJhbmdlKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tbGVmdFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9fdGl0bGUtYnRuXCJcbiAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgY3VycmVudFZpZXcoKSA9PT0gJ2RheXMnXG4gICAgICAgICAgICAgICAgPyBzd2l0Y2hUb01vbnRoVmlldygpXG4gICAgICAgICAgICAgICAgOiBjdXJyZW50VmlldygpID09PSAnbW9udGhzJyA/IHN3aXRjaFRvWWVhclZpZXcoKSA6IG51bGxcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgdmlld01vbnRoWWVhckxhYmVsKCkgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9fbmF2LWJ0blwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidkYXRlcGlja2VyLm5leHQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjdXJyZW50VmlldygpID09PSAnZGF5cycgPyBuZXh0TW9udGgoKSA6IGN1cnJlbnRWaWV3KCkgPT09ICdtb250aHMnID8gbmV4dFllYXIoKSA6IG5leHRZZWFyUmFuZ2UoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1yaWdodFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIDwhLS0gRGF5cyBWaWV3IC0tPlxuICAgICAgQGlmIChjdXJyZW50VmlldygpID09PSAnZGF5cycgJiYgbW9kZSAhPT0gJ3RpbWUnKSB7XG4gICAgICAgIDx0YWJsZSBjbGFzcz1cInNkYy1kYXRlcGlja2VyX19jYWxlbmRhclwiPlxuICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgIDx0ciBjbGFzcz1cInNkYy1kYXRlcGlja2VyX193ZWVrZGF5c1wiPlxuICAgICAgICAgICAgICBAZm9yIChkYXlOYW1lIG9mIHdlZWtEYXlOYW1lcygpOyB0cmFjayBkYXlOYW1lKSB7XG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwic2RjLWRhdGVwaWNrZXJfX3dlZWtkYXlcIiBzY29wZT1cImNvbFwiPlxuICAgICAgICAgICAgICAgICAge3sgZGF5TmFtZSB9fVxuICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICA8dGJvZHkgY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9fZGF5c1wiIChrZXlkb3duKT1cIm9uRGF5c0dyaWRLZXlkb3duKCRldmVudClcIj5cbiAgICAgICAgICAgIEBmb3IgKHdlZWsgb2YgY2FsZW5kYXJXZWVrcygpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgIEBmb3IgKGRheSBvZiB3ZWVrOyB0cmFjayBkYXkuZGF0ZS5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICNkYXlCdG5cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1kYXRlcGlja2VyX19kYXlcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtZGF0ZXBpY2tlcl9fZGF5LS1vdGhlci1tb250aF09XCIhZGF5LmN1cnJlbnRNb250aFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy1kYXRlcGlja2VyX19kYXktLXRvZGF5XT1cImRheS50b2RheVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy1kYXRlcGlja2VyX19kYXktLXNlbGVjdGVkXT1cImRheS5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy1kYXRlcGlja2VyX19kYXktLWRpc2FibGVkXT1cImRheS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy1kYXRlcGlja2VyX19kYXktLWluLXJhbmdlXT1cImRheS5pblJhbmdlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLWRhdGVwaWNrZXJfX2RheS0tcmFuZ2Utc3RhcnRdPVwiZGF5LnJhbmdlU3RhcnRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtZGF0ZXBpY2tlcl9fZGF5LS1yYW5nZS1lbmRdPVwiZGF5LnJhbmdlRW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGF5LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImRheS5kYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImRheS5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJkYXkuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImlzRGF5VGFiU3RvcChkYXkpID8gMCA6IC0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RGF5KGRheSlcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAge3sgZGF5LmRheSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgIDwvdGFibGU+XG4gICAgICB9XG5cbiAgICAgIDwhLS0gTW9udGhzIFZpZXcgLS0+XG4gICAgICBAaWYgKGN1cnJlbnRWaWV3KCkgPT09ICdtb250aHMnKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9fbW9udGhzLWdyaWRcIj5cbiAgICAgICAgICBAZm9yIChtIG9mIGNhbGVuZGFyTW9udGhzKCk7IHRyYWNrIG0ubW9udGgpIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic2RjLWRhdGVwaWNrZXJfX21vbnRoLWNlbGxcIlxuICAgICAgICAgICAgICBbY2xhc3Muc2RjLWRhdGVwaWNrZXJfX21vbnRoLWNlbGwtLXNlbGVjdGVkXT1cIm0uc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0TW9udGgobS5tb250aClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBtLm5hbWUgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIDwhLS0gWWVhcnMgVmlldyAtLT5cbiAgICAgIEBpZiAoY3VycmVudFZpZXcoKSA9PT0gJ3llYXJzJykge1xuICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLWRhdGVwaWNrZXJfX3llYXJzLWdyaWRcIj5cbiAgICAgICAgICBAZm9yICh5ZWFyIG9mIHllYXJSYW5nZSgpOyB0cmFjayB5ZWFyKSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cInNkYy1kYXRlcGlja2VyX195ZWFyLWNlbGxcIlxuICAgICAgICAgICAgICBbY2xhc3Muc2RjLWRhdGVwaWNrZXJfX3llYXItY2VsbC0tc2VsZWN0ZWRdPVwieWVhciA9PT0gdmlld0RhdGUoKS5nZXRGdWxsWWVhcigpXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFllYXIoeWVhcilcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyB5ZWFyIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICA8IS0tIFRpbWUgUGlja2VyIC0tPlxuICAgICAgQGlmIChzaG93VGltZVBpY2tlcigpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9fdGltZVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9fdGltZS1ncm91cFwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9fdGltZS1idG5cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiaW5jcmVtZW50SG91cnMoKVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ2RhdGVwaWNrZXIuaW5jcmVtZW50SG91cicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXVwXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1kYXRlcGlja2VyX190aW1lLXZhbHVlXCI+e3sgcGFkVGltZShob3VycygpKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic2RjLWRhdGVwaWNrZXJfX3RpbWUtYnRuXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImRlY3JlbWVudEhvdXJzKClcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidkYXRlcGlja2VyLmRlY3JlbWVudEhvdXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1kb3duXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1kYXRlcGlja2VyX190aW1lLXNlcGFyYXRvclwiPjo8L3NwYW4+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLWRhdGVwaWNrZXJfX3RpbWUtZ3JvdXBcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic2RjLWRhdGVwaWNrZXJfX3RpbWUtYnRuXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImluY3JlbWVudE1pbnV0ZXMoKVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ2RhdGVwaWNrZXIuaW5jcmVtZW50TWludXRlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tdXBcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWRhdGVwaWNrZXJfX3RpbWUtdmFsdWVcIj57eyBwYWRUaW1lKG1pbnV0ZXMoKSkgfX08L3NwYW4+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cInNkYy1kYXRlcGlja2VyX190aW1lLWJ0blwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJkZWNyZW1lbnRNaW51dGVzKClcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidkYXRlcGlja2VyLmRlY3JlbWVudE1pbnV0ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWRvd25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIEBpZiAoc2hvd1NlY29uZHMpIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWRhdGVwaWNrZXJfX3RpbWUtc2VwYXJhdG9yXCI+Ojwvc3Bhbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9fdGltZS1ncm91cFwiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9fdGltZS1idG5cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJpbmNyZW1lbnRTZWNvbmRzKClcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ2RhdGVwaWNrZXIuaW5jcmVtZW50U2Vjb25kJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXVwXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9fdGltZS12YWx1ZVwiPnt7IHBhZFRpbWUoc2Vjb25kcygpKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLWRhdGVwaWNrZXJfX3RpbWUtYnRuXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVjcmVtZW50U2Vjb25kcygpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidkYXRlcGlja2VyLmRlY3JlbWVudFNlY29uZCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1kb3duXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgIH1cblxuICAgICAgPCEtLSBGb290ZXI6IFRvZGF5IG9uIHRoZSBsZWZ0LCBDbGVhciArIENvbmZpcm0gdG9nZXRoZXIgb24gdGhlIHJpZ2h0IC0tPlxuICAgICAgQGlmIChzaG93QnV0dG9uQmFyIHx8IG1vZGUgPT09ICdkYXRldGltZScgfHwgbW9kZSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9fYnV0dG9uLWJhclwiPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICBAaWYgKHNob3dCdXR0b25CYXIgJiYgbW9kZSAhPT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1kYXRlcGlja2VyX19iYXItYnRuXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VG9kYXkoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyAnZGF0ZXBpY2tlci50b2RheScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLWRhdGVwaWNrZXJfX2J1dHRvbi1iYXItZW5kXCI+XG4gICAgICAgICAgICBAaWYgKHNob3dCdXR0b25CYXIpIHtcbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLWRhdGVwaWNrZXJfX2Jhci1idG5cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhclZhbHVlKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgJ2RhdGVwaWNrZXIuY2xlYXInIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChtb2RlID09PSAnZGF0ZXRpbWUnIHx8IG1vZGUgPT09ICd0aW1lJykge1xuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtZGF0ZXBpY2tlcl9fY29uZmlybS1idG5cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjb25maXJtRGF0ZVRpbWUoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyAnZGF0ZXBpY2tlci5jb25maXJtJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvc2RjLXBvcG92ZXI+XG5cbiAgQGlmIChtZXNzYWdlS2V5KCkpIHtcbiAgICA8c21hbGxcbiAgICAgIFtuZ0NsYXNzXT1cImdldEludmFsaWRNZXNzYWdlQ2xhc3MoKVwiXG4gICAgICByb2xlPVwiYWxlcnRcIlxuICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICA+XG4gICAgICB7eyBtZXNzYWdlS2V5KCkgfCB0cmFuc2xhdGUgfX1cbiAgICA8L3NtYWxsPlxuICB9XG48L2Rpdj5cbiJdfQ==