@updevs/components 1.0.0-alpha.48 → 1.0.0-alpha.49

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 (90) hide show
  1. package/README.md +1 -13
  2. package/calendar/calendar.component.d.ts +58 -122
  3. package/calendar/models/calendar-date.model.d.ts +10 -0
  4. package/calendar/models/calendar-month.model.d.ts +7 -0
  5. package/calendar/models/calendar-selected.model.d.ts +5 -0
  6. package/calendar/models/calendar-year.model.d.ts +6 -0
  7. package/calendar/models/date-range.model.d.ts +0 -4
  8. package/calendar/models/enums/calendar-view.enum.d.ts +5 -0
  9. package/calendar/models/public-api.d.ts +5 -0
  10. package/calendar/upd-calendar.module.d.ts +6 -11
  11. package/card/public-api.d.ts +1 -0
  12. package/card/types/public-api.d.ts +5 -0
  13. package/dropdown/dropdown.component.d.ts +3 -0
  14. package/esm2022/calendar/calendar.component.mjs +288 -217
  15. package/esm2022/calendar/models/calendar-date.model.mjs +2 -0
  16. package/esm2022/calendar/models/calendar-month.model.mjs +2 -0
  17. package/esm2022/calendar/models/calendar-selected.model.mjs +2 -0
  18. package/esm2022/calendar/models/calendar-year.model.mjs +2 -0
  19. package/esm2022/calendar/models/date-range.model.mjs +1 -1
  20. package/esm2022/calendar/models/enums/calendar-view.enum.mjs +7 -0
  21. package/esm2022/calendar/models/public-api.mjs +6 -1
  22. package/esm2022/calendar/upd-calendar.module.mjs +2 -20
  23. package/esm2022/card/public-api.mjs +2 -1
  24. package/esm2022/card/types/public-api.mjs +6 -0
  25. package/esm2022/dropdown/dropdown.component.mjs +23 -7
  26. package/esm2022/form-controls/date-picker/date-picker.component.mjs +45 -60
  27. package/esm2022/form-controls/input/input.component.mjs +3 -3
  28. package/esm2022/popover/popover.directive.mjs +10 -26
  29. package/esm2022/pricing-cards/index.mjs +2 -0
  30. package/esm2022/pricing-cards/models/price-item-feature.model.mjs +2 -0
  31. package/esm2022/pricing-cards/models/price-item-features-group.model.mjs +2 -0
  32. package/esm2022/pricing-cards/models/price-item.model.mjs +2 -0
  33. package/esm2022/pricing-cards/models/public-api.mjs +4 -0
  34. package/esm2022/pricing-cards/pricing-cards.component.mjs +24 -0
  35. package/esm2022/pricing-cards/public-api.mjs +4 -0
  36. package/esm2022/pricing-cards/upd-pricing-cards.module.mjs +36 -0
  37. package/esm2022/pricing-cards/updevs-components-pricing-cards.mjs +5 -0
  38. package/esm2022/table/abstractions/base.column.mjs +30 -44
  39. package/esm2022/table/table.component.mjs +9 -12
  40. package/fesm2022/updevs-components-calendar.mjs +319 -1449
  41. package/fesm2022/updevs-components-calendar.mjs.map +1 -1
  42. package/fesm2022/updevs-components-dropdown.mjs +22 -6
  43. package/fesm2022/updevs-components-dropdown.mjs.map +1 -1
  44. package/fesm2022/updevs-components-form-controls-date-picker.mjs +44 -59
  45. package/fesm2022/updevs-components-form-controls-date-picker.mjs.map +1 -1
  46. package/fesm2022/updevs-components-form-controls-input.mjs +2 -2
  47. package/fesm2022/updevs-components-form-controls-input.mjs.map +1 -1
  48. package/fesm2022/updevs-components-popover.mjs +9 -25
  49. package/fesm2022/updevs-components-popover.mjs.map +1 -1
  50. package/fesm2022/updevs-components-pricing-cards.mjs +64 -0
  51. package/fesm2022/updevs-components-pricing-cards.mjs.map +1 -0
  52. package/fesm2022/updevs-components-table.mjs +38 -55
  53. package/fesm2022/updevs-components-table.mjs.map +1 -1
  54. package/form-controls/date-picker/date-picker.component.d.ts +10 -31
  55. package/package.json +37 -31
  56. package/pricing-cards/index.d.ts +1 -0
  57. package/pricing-cards/models/price-item-feature.model.d.ts +5 -0
  58. package/pricing-cards/models/price-item-features-group.model.d.ts +5 -0
  59. package/pricing-cards/models/price-item.model.d.ts +19 -0
  60. package/pricing-cards/models/public-api.d.ts +3 -0
  61. package/pricing-cards/pricing-cards.component.d.ts +11 -0
  62. package/pricing-cards/public-api.d.ts +3 -0
  63. package/pricing-cards/upd-pricing-cards.module.d.ts +11 -0
  64. package/table/abstractions/base.column.d.ts +4 -0
  65. package/calendar/components/calendar-body/calendar-body.component.d.ts +0 -263
  66. package/calendar/components/calendar-header/calendar-header.component.d.ts +0 -57
  67. package/calendar/components/calendar-month-view/calendar-month-view.component.d.ts +0 -151
  68. package/calendar/components/calendar-multi-year-view/calendar-multi-year-view.component.d.ts +0 -10
  69. package/calendar/components/calendar-year-view/calendar-year-view.component.d.ts +0 -9
  70. package/calendar/models/calendar-cell.model.d.ts +0 -16
  71. package/calendar/services/calendar.service.d.ts +0 -15
  72. package/calendar/tools/events-options.d.ts +0 -12
  73. package/calendar/tools/keyboard-tools.d.ts +0 -9
  74. package/calendar/tools/passive-listeners.d.ts +0 -16
  75. package/calendar/types/calendar-cell-class-function.type.d.ts +0 -3
  76. package/calendar/types/calendar-cell-css-classes.type.d.ts +0 -3
  77. package/calendar/types/modifier-key.type.d.ts +0 -1
  78. package/esm2022/calendar/components/calendar-body/calendar-body.component.mjs +0 -515
  79. package/esm2022/calendar/components/calendar-header/calendar-header.component.mjs +0 -144
  80. package/esm2022/calendar/components/calendar-month-view/calendar-month-view.component.mjs +0 -423
  81. package/esm2022/calendar/components/calendar-multi-year-view/calendar-multi-year-view.component.mjs +0 -18
  82. package/esm2022/calendar/components/calendar-year-view/calendar-year-view.component.mjs +0 -17
  83. package/esm2022/calendar/models/calendar-cell.model.mjs +0 -18
  84. package/esm2022/calendar/services/calendar.service.mjs +0 -40
  85. package/esm2022/calendar/tools/events-options.mjs +0 -14
  86. package/esm2022/calendar/tools/keyboard-tools.mjs +0 -14
  87. package/esm2022/calendar/tools/passive-listeners.mjs +0 -29
  88. package/esm2022/calendar/types/calendar-cell-class-function.type.mjs +0 -2
  89. package/esm2022/calendar/types/calendar-cell-css-classes.type.mjs +0 -2
  90. package/esm2022/calendar/types/modifier-key.type.mjs +0 -2
@@ -1,144 +0,0 @@
1
- import { Component, inject } from '@angular/core';
2
- import { DateService } from '@updevs/sdk/core';
3
- import { CalendarService } from '../../services/calendar.service';
4
- import { CalendarSignalsService } from '../../services/calendar-signals.service';
5
- import { yearsPerPage } from '../calendar-multi-year-view/calendar-multi-year-view.component';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "@updevs/components/button";
8
- import * as i2 from "@jsverse/transloco";
9
- import * as i3 from "@updevs/icons";
10
- let calendarHeaderId = 1;
11
- export class CalendarHeaderComponent {
12
- constructor() {
13
- this.id = `upd-calendar-header-${calendarHeaderId++}`;
14
- this.calendarService = inject(CalendarService);
15
- this.calendarSignalsService = inject(CalendarSignalsService);
16
- this.dateService = inject(DateService);
17
- }
18
- /**
19
- * The `aria-label` for changing the calendar view.
20
- */
21
- get periodButtonLabel() {
22
- return this.calendarSignalsService.currentView() === 'month' ? 'SwitchToMultiYearView' : 'SwitchToMonthView';
23
- }
24
- /**
25
- * The label for the previous button.
26
- */
27
- get prevButtonLabel() {
28
- return {
29
- 'month': 'PreviousMonth',
30
- 'year': 'PreviousYear',
31
- 'multi-year': 'PreviousMultiYear'
32
- }[this.calendarSignalsService.currentView()];
33
- }
34
- /**
35
- * The label for the next button.
36
- */
37
- get nextButtonLabel() {
38
- return {
39
- 'month': 'NextMonth',
40
- 'year': 'NextYear',
41
- 'multi-year': 'NextMultiYear'
42
- }[this.calendarSignalsService.currentView()];
43
- }
44
- /**
45
- * Whether the selected view is not a month.
46
- */
47
- get isNotMonth() {
48
- return this.calendarSignalsService.currentView() !== 'month';
49
- }
50
- /**
51
- * ID of the label of the period button.
52
- */
53
- get periodButtonLabelId() {
54
- return `${this.id}-period-label`;
55
- }
56
- get minYearOfPageLabel() {
57
- return this.dateService.getYearName(this.dateService.create(this.minYearOfPage, 0, 1));
58
- }
59
- get maxYearOfPageLabel() {
60
- const maxYearOfPage = this.minYearOfPage + yearsPerPage - 1;
61
- return this.dateService.getYearName(this.dateService.create(maxYearOfPage, 0, 1));
62
- }
63
- get periodText() {
64
- if (this.calendarSignalsService.currentView() === 'month') {
65
- return this.dateService
66
- .format(this.calendarSignalsService.activeDate(), { year: 'numeric', month: 'short' })
67
- .toLocaleUpperCase();
68
- }
69
- if (this.calendarSignalsService.currentView() === 'year') {
70
- return this.dateService.getYearName(this.calendarSignalsService.activeDate());
71
- }
72
- return '';
73
- }
74
- get minYearOfPage() {
75
- // The offset from the active year to the "slot" for the starting year is the
76
- // *actual* first rendered year in the multi-year view, and the last year is
77
- // just yearsPerPage - 1 away.
78
- const activeDate = this.calendarSignalsService.activeDate();
79
- const activeYear = activeDate.getFullYear();
80
- const offset = this.calendarService.getMultiYearActiveOffset(activeDate, this.calendarSignalsService.minDate(), this.calendarSignalsService.maxDate());
81
- return activeYear - offset;
82
- }
83
- /**
84
- * Handles user clicks on the period label.
85
- */
86
- currentPeriodClicked() {
87
- this.calendarSignalsService.currentView = this.calendarSignalsService.currentView() === 'month' ? 'multi-year' : 'month';
88
- }
89
- /**
90
- * Handles user clicks on the previous button.
91
- */
92
- previousClicked() {
93
- this.calendarSignalsService.activeDate =
94
- this.calendarSignalsService.currentView() === 'month'
95
- ? this.dateService.addMonths(this.calendarSignalsService.activeDate(), -1)
96
- : this.dateService.addYears(this.calendarSignalsService.activeDate(), this.calendarSignalsService.currentView() === 'year' ? -1 : -yearsPerPage);
97
- }
98
- /**
99
- * Handles user clicks on the next button.
100
- */
101
- nextClicked() {
102
- this.calendarSignalsService.activeDate =
103
- this.calendarSignalsService.currentView() === 'month'
104
- ? this.dateService.addMonths(this.calendarSignalsService.activeDate(), 1)
105
- : this.dateService.addYears(this.calendarSignalsService.activeDate(), this.calendarSignalsService.currentView() === 'year' ? 1 : yearsPerPage);
106
- }
107
- /**
108
- * Whether the previous period button is enabled.
109
- */
110
- previousEnabled() {
111
- if (!this.calendarSignalsService.minDate()) {
112
- return true;
113
- }
114
- return !this.calendarSignalsService.minDate()
115
- || !this.isSameView(this.calendarSignalsService.activeDate(), this.calendarSignalsService.minDate());
116
- }
117
- /**
118
- * Whether the next period button is enabled.
119
- */
120
- nextEnabled() {
121
- return !this.calendarSignalsService.maxDate()
122
- || !this.isSameView(this.calendarSignalsService.activeDate(), this.calendarSignalsService.maxDate());
123
- }
124
- /**
125
- * Whether the two dates represent the same view in the current view mode (month or year).
126
- */
127
- isSameView(date1, date2) {
128
- if (this.calendarSignalsService.currentView() === 'month') {
129
- return date1.getFullYear() === date2.getFullYear() && date1.getMonth() === date2.getMonth();
130
- }
131
- if (this.calendarSignalsService.currentView() === 'year') {
132
- return date1.getFullYear() === date2.getFullYear();
133
- }
134
- // Otherwise we are in 'multi-year' view.
135
- return this.calendarService.isSameMultiYearView(date1, date2, this.calendarSignalsService.minDate(), this.calendarSignalsService.maxDate());
136
- }
137
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CalendarHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
138
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.0", type: CalendarHeaderComponent, selector: "upd-calendar-header", ngImport: i0, template: "<ng-container *transloco=\"let t; prefix: 'UpDevs.Calendar'\">\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col d-flex\">\n <label [id]=\"periodButtonLabelId\" class=\"visually-hidden\" aria-live=\"polite\">\n {{ periodText || t('YearRangeLabel', { start: minYearOfPageLabel, end: maxYearOfPageLabel }) }}\n </label>\n\n <upd-button [isIcon]=\"true\" [iconModel]=\"{tablerIcon:'chevron-left'}\" [isDisabled]=\"!previousEnabled()\"\n (clicked)=\"previousClicked()\" [attr.aria-label]=\"t(prevButtonLabel)\">\n </upd-button>\n\n <upd-button (click)=\"currentPeriodClicked()\" [attr.aria-label]=\"t(periodButtonLabel)\"\n [attr.aria-describedby]=\"periodButtonLabelId\" customClasses=\"mx-1 flex-grow-1\">\n <span aria-hidden=\"true\">\n {{ periodText || t('YearRange', { start: minYearOfPageLabel, end: maxYearOfPageLabel }) }}\n </span>\n <upd-icon [tablerIcon]=\"!isNotMonth ? 'chevron-down' : 'chevron-up'\"></upd-icon>\n </upd-button>\n\n <upd-button [isIcon]=\"true\" [iconModel]=\"{tablerIcon:'chevron-right'}\" [isDisabled]=\"!nextEnabled()\"\n (clicked)=\"nextClicked()\" [attr.aria-label]=\"t(nextButtonLabel)\">\n </upd-button>\n </div>\n </div>\n </div>\n</ng-container>\n", styles: [""], dependencies: [{ kind: "component", type: i1.ButtonComponent, selector: "upd-button", inputs: ["model", "text", "brandColorStyle", "customClasses", "isOutline", "isGhost", "isSquare", "isPill", "isIcon", "isLoading", "isList", "isFloating", "isAction", "isNavigationLink", "isLink", "shouldIgnoreBtnClass", "iconModel", "iconPosition", "isDisabled", "isActive", "badgeConfig", "colorStyle", "size", "title"], outputs: ["clicked"] }, { kind: "directive", type: i2.TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "component", type: i3.IconComponent, selector: "upd-icon", inputs: ["model", "wrapperClasses", "color", "colorClass", "removeDefaultClasses", "customClasses", "tablerIcon", "tablerIconWeight", "tablerIconType", "tablerIconSize", "heroIcon", "heroIconSize", "heroIconType"] }] }); }
139
- }
140
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CalendarHeaderComponent, decorators: [{
141
- type: Component,
142
- args: [{ selector: 'upd-calendar-header', template: "<ng-container *transloco=\"let t; prefix: 'UpDevs.Calendar'\">\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col d-flex\">\n <label [id]=\"periodButtonLabelId\" class=\"visually-hidden\" aria-live=\"polite\">\n {{ periodText || t('YearRangeLabel', { start: minYearOfPageLabel, end: maxYearOfPageLabel }) }}\n </label>\n\n <upd-button [isIcon]=\"true\" [iconModel]=\"{tablerIcon:'chevron-left'}\" [isDisabled]=\"!previousEnabled()\"\n (clicked)=\"previousClicked()\" [attr.aria-label]=\"t(prevButtonLabel)\">\n </upd-button>\n\n <upd-button (click)=\"currentPeriodClicked()\" [attr.aria-label]=\"t(periodButtonLabel)\"\n [attr.aria-describedby]=\"periodButtonLabelId\" customClasses=\"mx-1 flex-grow-1\">\n <span aria-hidden=\"true\">\n {{ periodText || t('YearRange', { start: minYearOfPageLabel, end: maxYearOfPageLabel }) }}\n </span>\n <upd-icon [tablerIcon]=\"!isNotMonth ? 'chevron-down' : 'chevron-up'\"></upd-icon>\n </upd-button>\n\n <upd-button [isIcon]=\"true\" [iconModel]=\"{tablerIcon:'chevron-right'}\" [isDisabled]=\"!nextEnabled()\"\n (clicked)=\"nextClicked()\" [attr.aria-label]=\"t(nextButtonLabel)\">\n </upd-button>\n </div>\n </div>\n </div>\n</ng-container>\n" }]
143
- }] });
144
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9jYWxlbmRhci9zcmMvY29tcG9uZW50cy9jYWxlbmRhci1oZWFkZXIvY2FsZW5kYXItaGVhZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9jYWxlbmRhci9zcmMvY29tcG9uZW50cy9jYWxlbmRhci1oZWFkZXIvY2FsZW5kYXItaGVhZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdFQUFnRSxDQUFDOzs7OztBQUU5RixJQUFJLGdCQUFnQixHQUFHLENBQUMsQ0FBQztBQU96QixNQUFNLE9BQU8sdUJBQXVCO0lBTHBDO1FBdUZZLE9BQUUsR0FBRyx1QkFBdUIsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDO1FBQ3hDLG9CQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzFDLDJCQUFzQixHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3hELGdCQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0tBMkV0RDtJQS9KRzs7T0FFRztJQUNILElBQUksaUJBQWlCO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMs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QXVCO2tHQUF2Qix1QkFBdUIsMkRDZHBDLGkvQ0EyQkE7OzJGRGJhLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDSSxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGF0ZVNlcnZpY2UgfSBmcm9tICdAdXBkZXZzL3Nkay9jb3JlJztcblxuaW1wb3J0IHsgQ2FsZW5kYXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY2FsZW5kYXIuc2VydmljZSc7XG5pbXBvcnQgeyBDYWxlbmRhclNpZ25hbHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY2FsZW5kYXItc2lnbmFscy5zZXJ2aWNlJztcbmltcG9ydCB7IHllYXJzUGVyUGFnZSB9IGZyb20gJy4uL2NhbGVuZGFyLW11bHRpLXllYXItdmlldy9jYWxlbmRhci1tdWx0aS15ZWFyLXZpZXcuY29tcG9uZW50JztcblxubGV0IGNhbGVuZGFySGVhZGVySWQgPSAxO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3VwZC1jYWxlbmRhci1oZWFkZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYWxlbmRhci1oZWFkZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsOiAnLi9jYWxlbmRhci1oZWFkZXIuY29tcG9uZW50LnNjc3MnXG59KVxuZXhwb3J0IGNsYXNzIENhbGVuZGFySGVhZGVyQ29tcG9uZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgYGFyaWEtbGFiZWxgIGZvciBjaGFuZ2luZyB0aGUgY2FsZW5kYXIgdmlldy5cbiAgICAgKi9cbiAgICBnZXQgcGVyaW9kQnV0dG9uTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5jdXJyZW50VmlldygpID09PSAnbW9udGgnID8gJ1N3aXRjaFRvTXVsdGlZZWFyVmlldycgOiAnU3dpdGNoVG9Nb250aFZpZXcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBsYWJlbCBmb3IgdGhlIHByZXZpb3VzIGJ1dHRvbi5cbiAgICAgKi9cbiAgICBnZXQgcHJldkJ1dHRvbkxhYmVsKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnbW9udGgnOiAnUHJldmlvdXNNb250aCcsXG4gICAgICAgICAgICAneWVhcic6ICdQcmV2aW91c1llYXInLFxuICAgICAgICAgICAgJ211bHRpLXllYXInOiAnUHJldmlvdXNNdWx0aVllYXInXG4gICAgICAgIH1bdGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLmN1cnJlbnRWaWV3KCldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBsYWJlbCBmb3IgdGhlIG5leHQgYnV0dG9uLlxuICAgICAqL1xuICAgIGdldCBuZXh0QnV0dG9uTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdtb250aCc6ICdOZXh0TW9udGgnLFxuICAgICAgICAgICAgJ3llYXInOiAnTmV4dFllYXInLFxuICAgICAgICAgICAgJ211bHRpLXllYXInOiAnTmV4dE11bHRpWWVhcidcbiAgICAgICAgfVt0aGlzLmNhbGVuZGFyU2lnbmFsc1NlcnZpY2UuY3VycmVudFZpZXcoKV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgc2VsZWN0ZWQgdmlldyBpcyBub3QgYSBtb250aC5cbiAgICAgKi9cbiAgICBnZXQgaXNOb3RNb250aCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5jdXJyZW50VmlldygpICE9PSAnbW9udGgnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBsYWJlbCBvZiB0aGUgcGVyaW9kIGJ1dHRvbi5cbiAgICAgKi9cbiAgICBnZXQgcGVyaW9kQnV0dG9uTGFiZWxJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5pZH0tcGVyaW9kLWxhYmVsYDtcbiAgICB9XG5cbiAgICBnZXQgbWluWWVhck9mUGFnZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVTZXJ2aWNlLmdldFllYXJOYW1lKHRoaXMuZGF0ZVNlcnZpY2UuY3JlYXRlKHRoaXMubWluWWVhck9mUGFnZSwgMCwgMSkpO1xuICAgIH1cblxuICAgIGdldCBtYXhZZWFyT2ZQYWdlTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgbWF4WWVhck9mUGFnZSA9IHRoaXMubWluWWVhck9mUGFnZSArIHllYXJzUGVyUGFnZSAtIDE7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVTZXJ2aWNlLmdldFllYXJOYW1lKHRoaXMuZGF0ZVNlcnZpY2UuY3JlYXRlKG1heFllYXJPZlBhZ2UsIDAsIDEpKTtcbiAgICB9XG5cbiAgICBnZXQgcGVyaW9kVGV4dCgpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLmN1cnJlbnRWaWV3KCkgPT09ICdtb250aCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGVTZXJ2aWNlXG4gICAgICAgICAgICAgICAgLmZvcm1hdCh0aGlzLmNhbGVuZGFyU2lnbmFsc1NlcnZpY2UuYWN0aXZlRGF0ZSgpLCB7IHllYXI6ICdudW1lcmljJywgbW9udGg6ICdzaG9ydCcgfSlcbiAgICAgICAgICAgICAgICAudG9Mb2NhbGVVcHBlckNhc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNhbGVuZGFyU2lnbmFsc1NlcnZpY2UuY3VycmVudFZpZXcoKSA9PT0gJ3llYXInKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlU2VydmljZS5nZXRZZWFyTmFtZSh0aGlzLmNhbGVuZGFyU2lnbmFsc1NlcnZpY2UuYWN0aXZlRGF0ZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBtaW5ZZWFyT2ZQYWdlKCk6IG51bWJlciB7XG4gICAgICAgIC8vIFRoZSBvZmZzZXQgZnJvbSB0aGUgYWN0aXZlIHllYXIgdG8gdGhlIFwic2xvdFwiIGZvciB0aGUgc3RhcnRpbmcgeWVhciBpcyB0aGVcbiAgICAgICAgLy8gKmFjdHVhbCogZmlyc3QgcmVuZGVyZWQgeWVhciBpbiB0aGUgbXVsdGkteWVhciB2aWV3LCBhbmQgdGhlIGxhc3QgeWVhciBpc1xuICAgICAgICAvLyBqdXN0IHllYXJzUGVyUGFnZSAtIDEgYXdheS5cbiAgICAgICAgY29uc3QgYWN0aXZlRGF0ZSA9IHRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5hY3RpdmVEYXRlKCk7XG4gICAgICAgIGNvbnN0IGFjdGl2ZVllYXIgPSBhY3RpdmVEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuY2FsZW5kYXJTZXJ2aWNlLmdldE11bHRpWWVhckFjdGl2ZU9mZnNldChcbiAgICAgICAgICAgIGFjdGl2ZURhdGUsXG4gICAgICAgICAgICB0aGlzLmNhbGVuZGFyU2lnbmFsc1NlcnZpY2UubWluRGF0ZSgpLFxuICAgICAgICAgICAgdGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLm1heERhdGUoKVxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBhY3RpdmVZZWFyIC0gb2Zmc2V0O1xuICAgIH1cblxuICAgIHByaXZhdGUgaWQgPSBgdXBkLWNhbGVuZGFyLWhlYWRlci0ke2NhbGVuZGFySGVhZGVySWQrK31gO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FsZW5kYXJTZXJ2aWNlID0gaW5qZWN0KENhbGVuZGFyU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjYWxlbmRhclNpZ25hbHNTZXJ2aWNlID0gaW5qZWN0KENhbGVuZGFyU2lnbmFsc1NlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGF0ZVNlcnZpY2UgPSBpbmplY3QoRGF0ZVNlcnZpY2UpO1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB1c2VyIGNsaWNrcyBvbiB0aGUgcGVyaW9kIGxhYmVsLlxuICAgICAqL1xuICAgIGN1cnJlbnRQZXJpb2RDbGlja2VkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNhbGVuZGFyU2lnbmFsc1NlcnZpY2UuY3VycmVudFZpZXcgPSB0aGlzLmNhbGVuZGFyU2lnbmFsc1NlcnZpY2UuY3VycmVudFZpZXcoKSA9PT0gJ21vbnRoJyA/ICdtdWx0aS15ZWFyJyA6ICdtb250aCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB1c2VyIGNsaWNrcyBvbiB0aGUgcHJldmlvdXMgYnV0dG9uLlxuICAgICAqL1xuICAgIHByZXZpb3VzQ2xpY2tlZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLmFjdGl2ZURhdGUgPVxuICAgICAgICAgICAgdGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLmN1cnJlbnRWaWV3KCkgPT09ICdtb250aCdcbiAgICAgICAgICAgICAgICA/IHRoaXMuZGF0ZVNlcnZpY2UuYWRkTW9udGhzKHRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5hY3RpdmVEYXRlKCksIC0xKVxuICAgICAgICAgICAgICAgIDogdGhpcy5kYXRlU2VydmljZS5hZGRZZWFycyhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLmFjdGl2ZURhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLmN1cnJlbnRWaWV3KCkgPT09ICd5ZWFyJyA/IC0xIDogLXllYXJzUGVyUGFnZVxuICAgICAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB1c2VyIGNsaWNrcyBvbiB0aGUgbmV4dCBidXR0b24uXG4gICAgICovXG4gICAgbmV4dENsaWNrZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5hY3RpdmVEYXRlID1cbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5jdXJyZW50VmlldygpID09PSAnbW9udGgnXG4gICAgICAgICAgICAgICAgPyB0aGlzLmRhdGVTZXJ2aWNlLmFkZE1vbnRocyh0aGlzLmNhbGVuZGFyU2lnbmFsc1NlcnZpY2UuYWN0aXZlRGF0ZSgpLCAxKVxuICAgICAgICAgICAgICAgIDogdGhpcy5kYXRlU2VydmljZS5hZGRZZWFycyhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLmFjdGl2ZURhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLmN1cnJlbnRWaWV3KCkgPT09ICd5ZWFyJyA/IDEgOiB5ZWFyc1BlclBhZ2VcbiAgICAgICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIHByZXZpb3VzIHBlcmlvZCBidXR0b24gaXMgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBwcmV2aW91c0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLm1pbkRhdGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gIXRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5taW5EYXRlKClcbiAgICAgICAgICAgIHx8ICF0aGlzLmlzU2FtZVZpZXcodGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLmFjdGl2ZURhdGUoKSwgdGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLm1pbkRhdGUoKSEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIG5leHQgcGVyaW9kIGJ1dHRvbiBpcyBlbmFibGVkLlxuICAgICAqL1xuICAgIG5leHRFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5tYXhEYXRlKClcbiAgICAgICAgICAgIHx8ICF0aGlzLmlzU2FtZVZpZXcodGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLmFjdGl2ZURhdGUoKSwgdGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLm1heERhdGUoKSEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIHR3byBkYXRlcyByZXByZXNlbnQgdGhlIHNhbWUgdmlldyBpbiB0aGUgY3VycmVudCB2aWV3IG1vZGUgKG1vbnRoIG9yIHllYXIpLlxuICAgICAqL1xuICAgIHByaXZhdGUgaXNTYW1lVmlldyhkYXRlMTogRGF0ZSwgZGF0ZTI6IERhdGUpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5jdXJyZW50VmlldygpID09PSAnbW9udGgnKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0ZTEuZ2V0RnVsbFllYXIoKSA9PT0gZGF0ZTIuZ2V0RnVsbFllYXIoKSAmJiBkYXRlMS5nZXRNb250aCgpID09PSBkYXRlMi5nZXRNb250aCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5jdXJyZW50VmlldygpID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRlMS5nZXRGdWxsWWVhcigpID09PSBkYXRlMi5nZXRGdWxsWWVhcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3RoZXJ3aXNlIHdlIGFyZSBpbiAnbXVsdGkteWVhcicgdmlldy5cbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLmlzU2FtZU11bHRpWWVhclZpZXcoXG4gICAgICAgICAgICBkYXRlMSxcbiAgICAgICAgICAgIGRhdGUyLFxuICAgICAgICAgICAgdGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLm1pbkRhdGUoKSxcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5tYXhEYXRlKClcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLCI8bmctY29udGFpbmVyICp0cmFuc2xvY289XCJsZXQgdDsgcHJlZml4OiAnVXBEZXZzLkNhbGVuZGFyJ1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBkLWZsZXhcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgW2lkXT1cInBlcmlvZEJ1dHRvbkxhYmVsSWRcIiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBwZXJpb2RUZXh0IHx8IHQoJ1llYXJSYW5nZUxhYmVsJywgeyBzdGFydDogbWluWWVhck9mUGFnZUxhYmVsLCBlbmQ6IG1heFllYXJPZlBhZ2VMYWJlbCB9KSB9fVxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICAgICAgICA8dXBkLWJ1dHRvbiBbaXNJY29uXT1cInRydWVcIiBbaWNvbk1vZGVsXT1cInt0YWJsZXJJY29uOidjaGV2cm9uLWxlZnQnfVwiIFtpc0Rpc2FibGVkXT1cIiFwcmV2aW91c0VuYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGlja2VkKT1cInByZXZpb3VzQ2xpY2tlZCgpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJ0KHByZXZCdXR0b25MYWJlbClcIj5cbiAgICAgICAgICAgICAgICA8L3VwZC1idXR0b24+XG5cbiAgICAgICAgICAgICAgICA8dXBkLWJ1dHRvbiAoY2xpY2spPVwiY3VycmVudFBlcmlvZENsaWNrZWQoKVwiIFthdHRyLmFyaWEtbGFiZWxdPVwidChwZXJpb2RCdXR0b25MYWJlbClcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cInBlcmlvZEJ1dHRvbkxhYmVsSWRcIiBjdXN0b21DbGFzc2VzPVwibXgtMSBmbGV4LWdyb3ctMVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHBlcmlvZFRleHQgfHwgdCgnWWVhclJhbmdlJywgeyBzdGFydDogbWluWWVhck9mUGFnZUxhYmVsLCBlbmQ6IG1heFllYXJPZlBhZ2VMYWJlbCB9KSB9fVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDx1cGQtaWNvbiBbdGFibGVySWNvbl09XCIhaXNOb3RNb250aCA/ICdjaGV2cm9uLWRvd24nIDogJ2NoZXZyb24tdXAnXCI+PC91cGQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L3VwZC1idXR0b24+XG5cbiAgICAgICAgICAgICAgICA8dXBkLWJ1dHRvbiBbaXNJY29uXT1cInRydWVcIiBbaWNvbk1vZGVsXT1cInt0YWJsZXJJY29uOidjaGV2cm9uLXJpZ2h0J31cIiBbaXNEaXNhYmxlZF09XCIhbmV4dEVuYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGlja2VkKT1cIm5leHRDbGlja2VkKClcIiBbYXR0ci5hcmlhLWxhYmVsXT1cInQobmV4dEJ1dHRvbkxhYmVsKVwiPlxuICAgICAgICAgICAgICAgIDwvdXBkLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuIl19