@annalib/anna-core 23.0.2 → 23.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{esm2020 → esm2022}/annalib-anna-core.mjs +4 -4
- package/esm2022/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.mjs +15 -0
- package/esm2022/lib/anna-core-shared-lib/components/anna-deleted-order-icon-template/anna-deleted-order-icon-template.component.mjs +14 -0
- package/esm2022/lib/anna-core-shared-lib/components/anna-est-icon-template/anna-est-icon-template.component.mjs +11 -0
- package/esm2022/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.mjs +36 -0
- package/esm2022/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.mjs +15 -0
- package/esm2022/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.mjs +22 -0
- package/esm2022/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.mjs +14 -0
- package/esm2022/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.mjs +23 -0
- package/esm2022/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.mjs +15 -0
- package/esm2022/lib/anna-core-shared-lib/constants/shared.constant.mjs +43 -0
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.mjs +285 -284
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/directives/fixed-rows-popup-table/fixed-rows-popup-table.directive.mjs +44 -43
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.mjs +39 -38
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/models/anna-generic-data-type.model.mjs +1 -1
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.mjs +1 -1
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.mjs +10 -10
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/models/anna-sort.model.mjs +6 -6
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/models/anna-tooltip.model.mjs +29 -29
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/pipes/annaConvertArrayToCommaSeperatedValue.pipe.mjs +39 -38
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.mjs +27 -26
- package/esm2022/lib/anna-core-shared-lib/pipes/annaDateFormatter.pipe.mjs +23 -0
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.mjs +54 -53
- package/esm2022/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.mjs +26 -0
- package/esm2022/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.mjs +17 -0
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/services/anna-date-time-format.service.mjs +208 -208
- package/esm2022/lib/anna-core-shared-lib/services/anna-filter.service.mjs +1155 -0
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/services/anna-generic-table.service.mjs +151 -151
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/services/anna-global-config.service.mjs +132 -132
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/services/anna-number-format.service.mjs +53 -53
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/services/anna-persisting-filter.service.mjs +66 -66
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/services/anna-sort.service.mjs +176 -176
- package/esm2022/lib/anna-core.module.mjs +226 -0
- package/esm2022/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.mjs +159 -0
- package/esm2022/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +370 -0
- package/esm2022/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-checkbox-filter/anna-column-checkbox-filter.component.mjs +238 -0
- package/esm2022/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-date-range-filter/anna-column-date-range-filter.component.mjs +180 -0
- package/esm2022/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-slider-filter/anna-column-slider-filter.component.mjs +308 -0
- package/esm2022/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-time-filter/anna-column-time-filter.component.mjs +293 -0
- package/esm2022/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +791 -0
- package/esm2022/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.mjs +64 -0
- package/esm2022/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.mjs +357 -0
- package/esm2022/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.mjs +190 -0
- package/{esm2020 → esm2022}/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.mjs +1 -1
- package/esm2022/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.mjs +179 -0
- package/{esm2020 → esm2022}/lib/anna-generic-table-lib/directives/anna-virtual-table/index.mjs +1 -1
- package/{esm2020 → esm2022}/public-api.mjs +57 -57
- package/fesm2022/annalib-anna-core.mjs +5869 -0
- package/fesm2022/annalib-anna-core.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.d.ts +8 -8
- package/lib/anna-core-shared-lib/components/anna-deleted-order-icon-template/anna-deleted-order-icon-template.component.d.ts +8 -8
- package/lib/anna-core-shared-lib/components/anna-est-icon-template/anna-est-icon-template.component.d.ts +5 -5
- package/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.d.ts +17 -17
- package/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.d.ts +8 -8
- package/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.d.ts +11 -11
- package/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.d.ts +8 -8
- package/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.d.ts +12 -12
- package/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.d.ts +8 -8
- package/lib/anna-core-shared-lib/constants/shared.constant.d.ts +41 -41
- package/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.d.ts +34 -34
- package/lib/anna-core-shared-lib/directives/fixed-rows-popup-table/fixed-rows-popup-table.directive.d.ts +16 -16
- package/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.d.ts +10 -10
- package/lib/anna-core-shared-lib/models/anna-generic-data-type.model.d.ts +16 -16
- package/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.d.ts +97 -97
- package/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.d.ts +118 -118
- package/lib/anna-core-shared-lib/models/anna-sort.model.d.ts +11 -11
- package/lib/anna-core-shared-lib/models/anna-tooltip.model.d.ts +25 -25
- package/lib/anna-core-shared-lib/pipes/annaConvertArrayToCommaSeperatedValue.pipe.d.ts +9 -9
- package/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.d.ts +9 -9
- package/lib/anna-core-shared-lib/pipes/annaDateFormatter.pipe.d.ts +8 -8
- package/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.d.ts +9 -9
- package/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.d.ts +9 -9
- package/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.d.ts +7 -7
- package/lib/anna-core-shared-lib/services/anna-date-time-format.service.d.ts +28 -28
- package/lib/anna-core-shared-lib/services/anna-filter.service.d.ts +154 -154
- package/lib/anna-core-shared-lib/services/anna-generic-table.service.d.ts +27 -27
- package/lib/anna-core-shared-lib/services/anna-global-config.service.d.ts +21 -21
- package/lib/anna-core-shared-lib/services/anna-number-format.service.d.ts +8 -8
- package/lib/anna-core-shared-lib/services/anna-persisting-filter.service.d.ts +9 -9
- package/lib/anna-core-shared-lib/services/anna-sort.service.d.ts +18 -18
- package/lib/anna-core.module.d.ts +45 -45
- package/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.d.ts +45 -45
- package/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.d.ts +70 -70
- package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-checkbox-filter/anna-column-checkbox-filter.component.d.ts +60 -60
- package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-date-range-filter/anna-column-date-range-filter.component.d.ts +53 -53
- package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-slider-filter/anna-column-slider-filter.component.d.ts +65 -65
- package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-time-filter/anna-column-time-filter.component.d.ts +83 -83
- package/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.d.ts +174 -174
- package/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.d.ts +17 -17
- package/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.d.ts +141 -141
- package/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.d.ts +89 -89
- package/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.d.ts +1 -1
- package/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.d.ts +45 -45
- package/lib/anna-generic-table-lib/directives/anna-virtual-table/index.d.ts +1 -1
- package/package.json +13 -18
- package/public-api.d.ts +42 -42
- package/src/lib/anna-common-scss/third-party-lib/_angular-material-mat-radio.scss +5 -0
- package/esm2020/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.mjs +0 -15
- package/esm2020/lib/anna-core-shared-lib/components/anna-deleted-order-icon-template/anna-deleted-order-icon-template.component.mjs +0 -14
- package/esm2020/lib/anna-core-shared-lib/components/anna-est-icon-template/anna-est-icon-template.component.mjs +0 -11
- package/esm2020/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.mjs +0 -36
- package/esm2020/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.mjs +0 -15
- package/esm2020/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.mjs +0 -22
- package/esm2020/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.mjs +0 -14
- package/esm2020/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.mjs +0 -23
- package/esm2020/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.mjs +0 -15
- package/esm2020/lib/anna-core-shared-lib/constants/shared.constant.mjs +0 -43
- package/esm2020/lib/anna-core-shared-lib/pipes/annaDateFormatter.pipe.mjs +0 -22
- package/esm2020/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.mjs +0 -25
- package/esm2020/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.mjs +0 -16
- package/esm2020/lib/anna-core-shared-lib/services/anna-filter.service.mjs +0 -1155
- package/esm2020/lib/anna-core.module.mjs +0 -221
- package/esm2020/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.mjs +0 -151
- package/esm2020/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +0 -364
- package/esm2020/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-checkbox-filter/anna-column-checkbox-filter.component.mjs +0 -237
- package/esm2020/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-date-range-filter/anna-column-date-range-filter.component.mjs +0 -180
- package/esm2020/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-slider-filter/anna-column-slider-filter.component.mjs +0 -306
- package/esm2020/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-time-filter/anna-column-time-filter.component.mjs +0 -291
- package/esm2020/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +0 -787
- package/esm2020/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.mjs +0 -64
- package/esm2020/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.mjs +0 -357
- package/esm2020/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.mjs +0 -189
- package/esm2020/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.mjs +0 -178
- package/fesm2015/annalib-anna-core.mjs +0 -5851
- package/fesm2015/annalib-anna-core.mjs.map +0 -1
- package/fesm2020/annalib-anna-core.mjs +0 -5842
- package/fesm2020/annalib-anna-core.mjs.map +0 -1
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
// Angular import statements
|
|
2
|
+
import { DatePipe, NgIf, NgClass } from "@angular/common";
|
|
3
|
+
import { Component, EventEmitter, Input, Output } from "@angular/core";
|
|
4
|
+
// Third party import statements
|
|
5
|
+
import { NgbCalendar, NgbDate, NgbDatepickerConfig, NgbInputDatepicker, NgbDatepicker } from "@ng-bootstrap/ng-bootstrap";
|
|
6
|
+
import dayjs from "dayjs";
|
|
7
|
+
import { AnnaDateTimeFormatService } from '../../../anna-core-shared-lib/services/anna-date-time-format.service';
|
|
8
|
+
import { AnnaGlobalConfigService } from '../../../anna-core-shared-lib/services/anna-global-config.service';
|
|
9
|
+
import { FormsModule } from "@angular/forms";
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "@ng-bootstrap/ng-bootstrap";
|
|
12
|
+
import * as i2 from "../../../anna-core-shared-lib/services/anna-date-time-format.service";
|
|
13
|
+
import * as i3 from "../../../anna-core-shared-lib/services/anna-global-config.service";
|
|
14
|
+
import * as i4 from "@angular/forms";
|
|
15
|
+
// User defined import statements
|
|
16
|
+
export class AnnaWeekCalendarComponent {
|
|
17
|
+
ngOnChanges(changes) {
|
|
18
|
+
//if some values are not sent, setting the default values
|
|
19
|
+
this._defaultValues = this.globalConfigService.defaultWeekCalendarConfig;
|
|
20
|
+
this.config = { ...this._defaultValues, ...this.config };
|
|
21
|
+
if (this.config.selectCurrentWeek) {
|
|
22
|
+
this.initializeWeekData();
|
|
23
|
+
this.fromDate && this.selectWeek(this.fromDate);
|
|
24
|
+
}
|
|
25
|
+
this.formatter = this.formattedDates();
|
|
26
|
+
if (this.selectedFromDate && this.selectedEndDate && this.config) {
|
|
27
|
+
// this.selectWeek(this.fromDate);
|
|
28
|
+
this.fromDate = NgbDate.from(this.selectedFromDate);
|
|
29
|
+
this.toDate = NgbDate.from(this.selectedEndDate);
|
|
30
|
+
this.weekNumberGenerator();
|
|
31
|
+
this.displayToUI();
|
|
32
|
+
this.setCalendarMap();
|
|
33
|
+
}
|
|
34
|
+
if (this.disabledDates.length > 0) {
|
|
35
|
+
this.disabledFunc = (date, current) => {
|
|
36
|
+
return this.checkIfDateIsDisabled(date);
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
constructor(calendar, datePickerConfig, annaDateTimeFormatService, globalConfigService) {
|
|
41
|
+
this.calendar = calendar;
|
|
42
|
+
this.datePickerConfig = datePickerConfig;
|
|
43
|
+
this.annaDateTimeFormatService = annaDateTimeFormatService;
|
|
44
|
+
this.globalConfigService = globalConfigService;
|
|
45
|
+
this.hoveredDate = null;
|
|
46
|
+
this.toDate = null;
|
|
47
|
+
this.weekNumbers = [];
|
|
48
|
+
this.dateToDisplay = "";
|
|
49
|
+
this.multiSelectDropdownOpen = false;
|
|
50
|
+
this.calendarMap = new Map();
|
|
51
|
+
this.disabledDates = [];
|
|
52
|
+
this.applyWeekCalendarChanges = new EventEmitter();
|
|
53
|
+
this.calendarToggled = new EventEmitter();
|
|
54
|
+
}
|
|
55
|
+
getWeekNumber(week, firstDayOfWeek) {
|
|
56
|
+
const weekStartDate = dayjs(convertNgbDateToMoment(week[0]), "MM/DD/YYYY");
|
|
57
|
+
const weekYear = weekStartDate.year();
|
|
58
|
+
const yearStartDate = dayjs(`01/01/${weekYear}`, "MM/DD/YYYY");
|
|
59
|
+
const weekDay = yearStartDate.day();
|
|
60
|
+
const noOfDays = weekStartDate.diff(yearStartDate, "d") + 1;
|
|
61
|
+
function convertNgbDateToMoment(ngbDate) {
|
|
62
|
+
let formatType = "MM/DD/YYYY";
|
|
63
|
+
let converted = null;
|
|
64
|
+
if (ngbDate && ngbDate.month && ngbDate.day && ngbDate.year) {
|
|
65
|
+
converted = ngbDate.month + "/" + ngbDate.day + "/" + ngbDate.year;
|
|
66
|
+
converted = dayjs(converted).format(formatType);
|
|
67
|
+
}
|
|
68
|
+
return converted;
|
|
69
|
+
}
|
|
70
|
+
function checkIfYearIsBroadcastLeapYear() {
|
|
71
|
+
let isLeapYear = (weekYear % 4 == 0 && weekYear % 100 != 0) || weekYear % 400 == 0;
|
|
72
|
+
return (isLeapYear && (weekDay == 0 || weekDay == 6)) || (!isLeapYear && weekDay == 0);
|
|
73
|
+
}
|
|
74
|
+
const isLeapYear = checkIfYearIsBroadcastLeapYear();
|
|
75
|
+
const divider = isLeapYear ? 53 : 52;
|
|
76
|
+
const adder = isLeapYear ? 2 : 1;
|
|
77
|
+
let broadcastNumberOfDays = weekDay + noOfDays;
|
|
78
|
+
let broadcastWeekNumber = broadcastNumberOfDays % 7 > 0 ? broadcastNumberOfDays / 7 + adder : broadcastNumberOfDays / 7;
|
|
79
|
+
if (Math.floor(broadcastWeekNumber % divider) === 0) {
|
|
80
|
+
return divider;
|
|
81
|
+
}
|
|
82
|
+
return Math.floor(broadcastWeekNumber % divider);
|
|
83
|
+
}
|
|
84
|
+
ngAfterViewInit() {
|
|
85
|
+
// CHANGES@ANNALIB Changed this.
|
|
86
|
+
// this.calendar["__proto__"].getWeekNumber = this.getWeekNumber;
|
|
87
|
+
Object.setPrototypeOf(this.calendar, { getWeekNumber: this.getWeekNumber });
|
|
88
|
+
}
|
|
89
|
+
ngOnInit() {
|
|
90
|
+
// this.selectWeek(this.fromDate);
|
|
91
|
+
this.setCalendarMap();
|
|
92
|
+
}
|
|
93
|
+
initializeWeekData() {
|
|
94
|
+
this.weekObjects = [];
|
|
95
|
+
this.fromDate = this.calendar.getToday();
|
|
96
|
+
this.today = this.calendar.getToday();
|
|
97
|
+
let backDatedPeriod = JSON.parse(localStorage.getItem("userDetails") || '{}').locking_period_days;
|
|
98
|
+
if (backDatedPeriod < 0) {
|
|
99
|
+
let date = this.calendar.getPrev(this.calendar.getToday(), "d", Math.abs(backDatedPeriod));
|
|
100
|
+
this.today = NgbDate.from(date);
|
|
101
|
+
this.fromDate = NgbDate.from(date);
|
|
102
|
+
}
|
|
103
|
+
// Disable months before numberOfMonthsToEnable
|
|
104
|
+
this.datePickerConfig.markDisabled = (date) => {
|
|
105
|
+
let previousMonth = this.calendar.getPrev(this.today, "m", this.config.numberOfMonthsToEnableInPast);
|
|
106
|
+
let previousDay = this.calendar.getPrev(previousMonth, "d", 1);
|
|
107
|
+
return !NgbDate.from(previousDay).before(date);
|
|
108
|
+
};
|
|
109
|
+
this.formatter = this.formattedDates();
|
|
110
|
+
this.flag1 = false;
|
|
111
|
+
this.flag2 = false;
|
|
112
|
+
}
|
|
113
|
+
selectWeek(date) {
|
|
114
|
+
const dateObject = new Date(date.year, date.month - 1, date.day);
|
|
115
|
+
let constructDate = this.buildDate(dateObject);
|
|
116
|
+
if (!this.config.selectMultipleWeeks) {
|
|
117
|
+
//Single week selection
|
|
118
|
+
this.fromDate = this.constructStartDate(dateObject)(constructDate);
|
|
119
|
+
this.toDate = this.constructEndDate(dateObject)(constructDate);
|
|
120
|
+
this.weekNumberGenerator();
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
if (date.before(this.fromDate)) {
|
|
124
|
+
this.fromDate = this.constructStartDate(dateObject)(constructDate);
|
|
125
|
+
if (this.flag1) {
|
|
126
|
+
this.toDate = this.constructEndDate(dateObject)(constructDate);
|
|
127
|
+
}
|
|
128
|
+
this.flag1 = !this.flag1;
|
|
129
|
+
}
|
|
130
|
+
else if (date.after(this.toDate)) {
|
|
131
|
+
if (this.flag2) {
|
|
132
|
+
this.fromDate = this.constructStartDate(dateObject)(constructDate);
|
|
133
|
+
//this.toDate = this.constructEndDate(dateObject)(constructDate);
|
|
134
|
+
}
|
|
135
|
+
this.flag2 = !this.flag2;
|
|
136
|
+
this.toDate = this.constructEndDate(dateObject)(constructDate);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
this.fromDate = this.constructStartDate(dateObject)(constructDate);
|
|
140
|
+
this.toDate = this.constructEndDate(dateObject)(constructDate);
|
|
141
|
+
}
|
|
142
|
+
if (this.disabledDates.length > 0) {
|
|
143
|
+
let dayjsStartDate = dayjs(this.annaDateTimeFormatService.convertNgbDateToMoment(this.fromDate), "MM/DD/YYYY");
|
|
144
|
+
let dayjsEndDate = dayjs(this.annaDateTimeFormatService.convertNgbDateToMoment(this.toDate), "MM/DD/YYYY");
|
|
145
|
+
let ngbDate;
|
|
146
|
+
while (!dayjsStartDate.isSame(dayjsEndDate)) {
|
|
147
|
+
ngbDate = this.annaDateTimeFormatService.convertToNgbDate(dayjsStartDate, "MM/DD/YYYY");
|
|
148
|
+
if (this.checkIfDateIsDisabled(ngbDate)) {
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
dayjsStartDate.add(1, "d");
|
|
152
|
+
}
|
|
153
|
+
let newDateObject = new Date(ngbDate.year, ngbDate.month - 1, ngbDate.day - 1);
|
|
154
|
+
let constructDate = this.buildDate(newDateObject);
|
|
155
|
+
this.toDate = this.constructEndDate(newDateObject)(constructDate);
|
|
156
|
+
}
|
|
157
|
+
this.weekNumberGenerator();
|
|
158
|
+
}
|
|
159
|
+
if (!this.config.showAsDropdown) {
|
|
160
|
+
this.applyChanges();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
weekNumberGenerator() {
|
|
164
|
+
let dates = [];
|
|
165
|
+
let week = [];
|
|
166
|
+
let startDate = NgbDate.from(this.fromDate);
|
|
167
|
+
let endDate = NgbDate.from(this.toDate);
|
|
168
|
+
week.push(startDate);
|
|
169
|
+
while (endDate != null && !startDate.equals(endDate)) {
|
|
170
|
+
let date = this.calendar.getNext(startDate, "d", 1);
|
|
171
|
+
startDate = date;
|
|
172
|
+
week.push(date);
|
|
173
|
+
// Collect all days in week to calculate the week number
|
|
174
|
+
if (week.length == 7) {
|
|
175
|
+
dates.push(week);
|
|
176
|
+
week = [];
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (((this.config.maxWeeksToSelect ?? 0) > 0 && dates.length > (this.config.maxWeeksToSelect ?? 0))) {
|
|
180
|
+
dates.splice((this.config.maxWeeksToSelect ?? 0), dates.length - (this.config.maxWeeksToSelect ?? 0));
|
|
181
|
+
}
|
|
182
|
+
this.selectedDates(dates);
|
|
183
|
+
this.weekNumbers = [];
|
|
184
|
+
this.weekObjects = [];
|
|
185
|
+
if (dates.length > 0) {
|
|
186
|
+
for (let date of dates) {
|
|
187
|
+
this.weekNumbers.push(" Week " + this.calendar.getWeekNumber(date, this.config.firstDayOfWeek));
|
|
188
|
+
let dates = this.formatter(date[0], date[6]);
|
|
189
|
+
let dateObjects = { startDate: dates.formattedStartDate, endDate: dates.formattedEndDate };
|
|
190
|
+
this.weekObjects.push(dateObjects);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
this.displayToUI();
|
|
194
|
+
}
|
|
195
|
+
selectedDates(dates) {
|
|
196
|
+
this.fromDate = dates[0][0];
|
|
197
|
+
this.toDate = dates[dates.length - 1][6];
|
|
198
|
+
}
|
|
199
|
+
formattedDates() {
|
|
200
|
+
let pipe = new DatePipe("en-US");
|
|
201
|
+
let thisObj = this;
|
|
202
|
+
return function (fromDate, toDate) {
|
|
203
|
+
let fromDateObject = new Date(fromDate.year, fromDate.month - 1, fromDate.day);
|
|
204
|
+
let toDateObject = new Date(toDate.year, toDate.month - 1, toDate.day);
|
|
205
|
+
thisObj.formattedStartDate = pipe.transform(fromDateObject, thisObj.config.dateFormatForRequest);
|
|
206
|
+
thisObj.formattedEndDate = pipe.transform(toDateObject, thisObj.config.dateFormatForRequest);
|
|
207
|
+
thisObj.dateToDisplay =
|
|
208
|
+
pipe.transform(fromDateObject, thisObj.config.dateFormatToDisplay) +
|
|
209
|
+
" to " +
|
|
210
|
+
pipe.transform(toDateObject, thisObj.config.dateFormatToDisplay);
|
|
211
|
+
return thisObj;
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
displayToUI() {
|
|
215
|
+
if (!this.config.selectMultipleWeeks && this.fromDate && this.toDate) {
|
|
216
|
+
// Display for only Single Week
|
|
217
|
+
this.formatter(this.fromDate, this.toDate);
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
// Display for Multiple Weeks
|
|
221
|
+
if (this.weekNumbers.length > (this.config.maxWeeksToShowWithRemainingCount ?? 0)) {
|
|
222
|
+
let weekDisplay = [];
|
|
223
|
+
for (let i = 0; i < (this.config.maxWeeksToShowWithRemainingCount ?? 0); i++) {
|
|
224
|
+
weekDisplay.push(this.weekNumbers.shift());
|
|
225
|
+
}
|
|
226
|
+
let remainingWeeks = this.weekNumbers.length;
|
|
227
|
+
this.weekNumbers = [];
|
|
228
|
+
this.weekNumbers.push(weekDisplay + " +" + remainingWeeks);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
constructStartDate(date) {
|
|
233
|
+
let firstDayOfWeek = this.config.firstDayOfWeek;
|
|
234
|
+
return function (constructDate) {
|
|
235
|
+
let startDay = date.getDay() != 0 ? (firstDayOfWeek ?? 0) - date.getDay() : -6;
|
|
236
|
+
return constructDate(startDay);
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
constructEndDate(date) {
|
|
240
|
+
let firstDayOfWeek = this.config.firstDayOfWeek;
|
|
241
|
+
return function (constructDate) {
|
|
242
|
+
let endDay = date.getDay() != 0 ? (firstDayOfWeek ?? 0) + 6 - date.getDay() : 0;
|
|
243
|
+
return constructDate(endDay);
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
buildDate(date) {
|
|
247
|
+
return function (number) {
|
|
248
|
+
let day = date.getDate() + number;
|
|
249
|
+
const dateObject = new Date(date.getFullYear(), date.getMonth(), day);
|
|
250
|
+
let ngbDateObject = {};
|
|
251
|
+
ngbDateObject.day = day;
|
|
252
|
+
if (ngbDateObject.day > 31 || ngbDateObject.day < 1) {
|
|
253
|
+
ngbDateObject.day = dateObject.getDate();
|
|
254
|
+
}
|
|
255
|
+
ngbDateObject.month = dateObject.getMonth() + 1;
|
|
256
|
+
ngbDateObject.year = dateObject.getFullYear();
|
|
257
|
+
return NgbDate.from(ngbDateObject);
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
isHovered(date) {
|
|
261
|
+
return this.fromDate && !this.toDate && this.hoveredDate && date.after(this.fromDate) && date.before(this.hoveredDate);
|
|
262
|
+
}
|
|
263
|
+
isInside(date) {
|
|
264
|
+
return this.toDate && date.after(this.fromDate) && date.before(this.toDate);
|
|
265
|
+
}
|
|
266
|
+
isRange(date) {
|
|
267
|
+
return (date.equals(this.fromDate) || (this.toDate && date.equals(this.toDate)) || this.isInside(date) || this.isHovered(date));
|
|
268
|
+
}
|
|
269
|
+
previousWeek() {
|
|
270
|
+
if (this.fromDate) {
|
|
271
|
+
this.toDate = this.calendar.getPrev(this.fromDate, "d", 1);
|
|
272
|
+
this.fromDate = this.calendar.getPrev(this.fromDate, "d", this.calendar.getDaysPerWeek());
|
|
273
|
+
}
|
|
274
|
+
this.weekNumberGenerator();
|
|
275
|
+
this.applyChanges();
|
|
276
|
+
}
|
|
277
|
+
nextWeek() {
|
|
278
|
+
if (this.fromDate) {
|
|
279
|
+
this.fromDate = this.calendar.getNext(this.fromDate, "d", this.calendar.getDaysPerWeek());
|
|
280
|
+
this.toDate = this.calendar.getNext(this.fromDate, "d", this.calendar.getDaysPerWeek() - 1);
|
|
281
|
+
}
|
|
282
|
+
this.weekNumberGenerator();
|
|
283
|
+
this.applyChanges();
|
|
284
|
+
}
|
|
285
|
+
setCalendarMap() {
|
|
286
|
+
let dateObj = { fromDate: this.fromDate, toDate: this.toDate };
|
|
287
|
+
this.calendarMap.set("oldDates", dateObj);
|
|
288
|
+
}
|
|
289
|
+
applyChanges() {
|
|
290
|
+
this.multiSelectDropdownOpen = false;
|
|
291
|
+
if (!this.config.emitMultipleWeekObjects) {
|
|
292
|
+
let dates = {};
|
|
293
|
+
let formattedDates = this.formatter(this.fromDate, this.toDate);
|
|
294
|
+
dates.startDate = formattedDates.formattedStartDate;
|
|
295
|
+
dates.endDate = formattedDates.formattedEndDate;
|
|
296
|
+
this.applyWeekCalendarChanges.emit(dates);
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
this.applyWeekCalendarChanges.emit(this.weekObjects);
|
|
300
|
+
}
|
|
301
|
+
this.setCalendarMap();
|
|
302
|
+
}
|
|
303
|
+
isFocused(value) {
|
|
304
|
+
this.calendarToggled.emit(value);
|
|
305
|
+
}
|
|
306
|
+
isDropdownOpenedForCalendar(datepicker) {
|
|
307
|
+
this.datepicker = datepicker;
|
|
308
|
+
if (this.datepicker.isOpen()) {
|
|
309
|
+
this.revertDates();
|
|
310
|
+
this.datepicker.close();
|
|
311
|
+
this.multiSelectDropdownOpen = false;
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
this.datepicker.open();
|
|
315
|
+
this.multiSelectDropdownOpen = true;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
revertDates() {
|
|
319
|
+
this.multiSelectDropdownOpen = false;
|
|
320
|
+
if (this.calendarMap.get("oldDates")) {
|
|
321
|
+
let dateObj = this.calendarMap.get("oldDates");
|
|
322
|
+
this.fromDate = dateObj.fromDate;
|
|
323
|
+
this.toDate = dateObj.toDate;
|
|
324
|
+
this.weekNumberGenerator();
|
|
325
|
+
this.displayToUI();
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
checkIfDateIsDisabled(date) {
|
|
329
|
+
const validatorFunc = (ngbDate) => ngbDate.year === date.year && ngbDate.month === date.month && ngbDate.day === date.day;
|
|
330
|
+
return this.disabledDates.some(validatorFunc);
|
|
331
|
+
}
|
|
332
|
+
closeDatepicker(datepickerRef) {
|
|
333
|
+
datepickerRef.close();
|
|
334
|
+
}
|
|
335
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AnnaWeekCalendarComponent, deps: [{ token: i1.NgbCalendar }, { token: i1.NgbDatepickerConfig }, { token: i2.AnnaDateTimeFormatService }, { token: i3.AnnaGlobalConfigService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
336
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AnnaWeekCalendarComponent, isStandalone: true, selector: "anna-core-week-calendar-filter-lib", inputs: { selectedFromDate: ["from-date", "selectedFromDate"], selectedEndDate: ["to-date", "selectedEndDate"], disabledDates: ["disabled-dates", "disabledDates"], maxDate: "maxDate", minDate: "minDate", config: ["week-calendar-config", "config"] }, outputs: { applyWeekCalendarChanges: "apply", calendarToggled: "toggle-calendar" }, usesOnChanges: true, ngImport: i0, template: "<form class=\"form-inline\" *ngIf=\"config.showAsDropdown\">\r\n <div class=\"form-group hidden\">\r\n <div class=\"input-group\">\r\n <input\r\n name=\"datepicker\"\r\n class=\"form-control\"\r\n ngbDatepicker\r\n #datepicker=\"ngbDatepicker\"\r\n [autoClose]=\"false\"\r\n (dateSelect)=\"selectWeek($event)\"\r\n (closed)=\"isFocused(false)\"\r\n [displayMonths]=\"1\"\r\n [dayTemplate]=\"t\"\r\n [startDate]=\"fromDate!\"\r\n [firstDayOfWeek]=\"config.firstDayOfWeek\"\r\n [showWeekNumbers]=\"config.showWeekNumbers\"\r\n tabindex=\"-1\"\r\n style=\"display: none\"\r\n [footerTemplate]=\"footerTemplate\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!--Single week select-->\r\n <div *ngIf=\"!config.selectMultipleWeeks\">\r\n <span style=\"position: relative; left: 30px; font-size: 12px\"> {{ weekNumbers }} </span>\r\n <div class=\"form-group\">\r\n <div class=\"input-group\">\r\n <div class=\"single-week\">\r\n <div class=\"left\">\r\n <span class=\"material-icons next-round-btn\" (click)=\"previousWeek()\"> navigate_next </span>\r\n </div>\r\n <input\r\n #dpFromDate\r\n class=\"form-control\"\r\n placeholder=\"Select Weeks\"\r\n [ngClass]=\"[config.customClass == '' ? '' : config.customClass]\"\r\n name=\"dpFromDate\"\r\n [value]=\"dateToDisplay\"\r\n [readonly]=\"true\"\r\n (click)=\"isFocused(true); isDropdownOpenedForCalendar(datepicker)\"\r\n />\r\n <i class=\"mdi mdi-menu-down\" *ngIf='!datepicker.isOpen()' (click)=\"datepicker.open()\"></i>\r\n <i class='mdi mdi-menu-up' *ngIf=\"datepicker.isOpen()\" (click)=\"isDropdownOpenedForCalendar(datepicker)\"></i>\r\n <div class=\"right\">\r\n <span class=\"material-icons round-btn\" (click)=\"nextWeek()\"> navigate_next </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!--Multiple week select-->\r\n <div class=\"form-group\" *ngIf=\"config.selectMultipleWeeks\">\r\n <div class=\"input-group\">\r\n <div class=\"multiple-weeks\">\r\n <input\r\n #dpFromDate\r\n class=\"form-control\"\r\n placeholder=\"Select Weeks\"\r\n [ngClass]=\"[config.customClass == '' ? '' : config.customClass]\"\r\n name=\"dpFromDate\"\r\n [readonly]=\"true\"\r\n [value]=\"weekNumbers\"\r\n (click)=\"isFocused(true); isDropdownOpenedForCalendar(datepicker)\"\r\n />\r\n <i *ngIf=\"!multiSelectDropdownOpen\" class=\"mdi mdi-menu-down multiselect-input-arrow\"></i>\r\n <i *ngIf=\"multiSelectDropdownOpen\" class=\"mdi mdi-menu-up multiselect-input-arrow\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n</form>\r\n\r\n<ngb-datepicker\r\n #weekPicker\r\n *ngIf=\"!config.showAsDropdown\"\r\n [displayMonths]=\"1\"\r\n [startDate]=\"fromDate!\"\r\n [firstDayOfWeek]=\"config.firstDayOfWeek\"\r\n [showWeekNumbers]=\"config.showWeekNumbers\"\r\n [dayTemplate]=\"t\"\r\n [maxDate]=\"maxDate\"\r\n [minDate]=\"minDate\"\r\n (dateSelect)=\"selectWeek($event)\"\r\n [markDisabled]=\"disabledFunc\"\r\n>\r\n</ngb-datepicker>\r\n\r\n<ng-template #footerTemplate>\r\n <hr class=\"my-0\" />\r\n <button\r\n class=\"btn btn-primary btn-sm m-2 float-right\"\r\n (click)=\"applyChanges(); closeDatepicker(datepicker)\"\r\n style=\"background-color: #268bff; color: #ffffff\"\r\n >\r\n Apply\r\n </button>\r\n <button\r\n class=\"btn btn-primary btn-sm m-2 float-right\"\r\n (click)=\"revertDates(); closeDatepicker(datepicker)\"\r\n style=\"background-color: rgba(38, 139, 255, 0.12); color: #268bff\"\r\n >\r\n Cancel\r\n </button>\r\n</ng-template>\r\n\r\n<ng-template #t let-date let-focused=\"focused\" let-disabled=\"disabled\">\r\n <span\r\n class=\"custom-day\"\r\n [class.focused]=\"focused\"\r\n [class.range]=\"isRange(date)\"\r\n [class.faded]=\"isHovered(date) || isInside(date)\"\r\n [class.disabled]=\"disabled\"\r\n (mouseenter)=\"hoveredDate = date\"\r\n (mouseleave)=\"hoveredDate = null\"\r\n >\r\n {{ date.day }}\r\n </span>\r\n</ng-template>\r\n\r\n<!--\r\n\r\n<hr>\r\n\r\n<pre>From: {{ fromDate | json }} </pre>\r\n<pre>To: {{ toDate | json }} </pre>\r\n<pre>weekNumbers: {{ weekNumbers | json }} </pre>\r\n\r\n-->\r\n", styles: [":host ::ng-deep .ngb-dp-arrow button:disabled{color:#4a4a4a;background-color:#fff;opacity:.25;cursor:not-allowed}:host ::ng-deep .ngb-dp-arrow button:disabled .ngb-dp-navigation-chevron{color:#4a4a4a}:host ::ng-deep .ngb-dp-arrow button .ngb-dp-navigation-chevron{color:#000}:host::ng-deep .right{width:unset!important;background-color:#fff!important}:host::ng-deep .ngb-dp-day,:host::ng-deep .ngb-dp-weekday{width:3rem!important;font-style:unset!important;color:#8bac2a;outline:none}:host::ng-deep .ngb-dp-day:first-child{border:1px solid black}:host::ng-deep .ngb-dp-day.disabled{color:#d4d4d4;cursor:not-allowed}:host::ng-deep .ngb-dp-showweek:before{content:\"Weeks\";margin-right:5px}:host::ng-deep .ngb-dp-week-number{font-style:unset!important;width:4rem!important;margin-right:5px;font-weight:700;color:#000!important;border-right:1px solid rgba(0,0,0,.125)}:host::ng-deep .ngb-dp-week-number:before{font-style:unset!important;content:\"Week \"}:host::ng-deep .ngb-dp-weekday.ngb-dp-showweek{margin-right:5px;width:4rem!important;border-right:1px solid rgba(0,0,0,.125)}:host::ng-deep .dropdown-menu{box-shadow:none}:host::ng-deep .dropdown-menu.show{top:15px!important}:host::ng-deep .bg-light{background-color:#fff!important}:host::ng-deep .ngb-dp-weekdays{border-top:1px solid rgba(0,0,0,.125)}:host::ng-deep .ngb-dp-arrow-btn:focus{box-shadow:none}.custom-day{text-align:center;padding:.185rem .25rem;display:inline-block;height:1.75rem;font-weight:700;color:#222b45;width:3rem!important}.custom-day.focused{background-color:#fff}.custom-day.faded{background-color:#0275d880!important}.custom-day.faded:focus{outline:none!important}.custom-day:hover{background-color:#268bff1f!important;color:#4a4a4a!important}.custom-day:focus{outline:none!important}.custom-day.range{background-color:#268bff1f!important;color:#4a4a4a!important}.custom-day.range:focus{outline:none!important}.custom-day.disabled{color:#d3d3d3}.input-group>.single-week,.input-group .multiple-weeks{display:inline-flex!important}.input-group>.single-week>.form-control,.input-group .multiple-weeks>.form-control{width:212px;border-radius:2px;border:solid 1px #b3b3b3;height:1.875rem;cursor:pointer}.input-group>.form-control{width:212px;border-radius:2px;border:solid 1px #b3b3b3;height:1.875rem;cursor:pointer}.form-control[readonly]{background-color:#fff!important}.next-round-btn{transform:rotate(180deg);margin-left:.125rem;line-height:1.3;border-radius:50%;cursor:pointer}.round-btn{line-height:1.3;border-radius:50%;cursor:pointer;margin-left:.25rem}:host::ng-deep select.custom-select{background:none;appearance:auto}.left,.right{width:1.875rem!important;height:1.875rem;background:#d8d8d8!important;border-radius:50%}.left{margin-right:.3125rem}.right{margin-left:.3125rem}:host::ng-deep .right .ngb-dp-navigation-chevron,:host::ng-deep .ngb-dp-navigation-chevron{color:#268bff}:host::ng-deep .ngb-dp-arrow-btn:focus{outline-width:0px}.custom-day.faded{background-color:#268bff33!important;color:#000!important;font-weight:600}.custom-day{text-align:center;padding:.185rem .25rem;color:#000;display:inline-block;line-height:1.9;height:2rem;width:2rem}.custom-day.focused{background-color:#e6e6e6}.custom-day.range{background-color:#268bff!important;color:#fff!important;font-weight:600}.custom-day:hover{background-color:#d9e1e6;border-radius:.25rem;color:#bdbdbd}:host::ng-deep div.ngb-dp-weekday{color:#8bac2a;font-family:Roboto;font-size:.8125rem;font-weight:700;font-stretch:normal;font-style:normal;line-height:2.6;letter-spacing:normal}.mdi-menu-up,.mdi-menu-down{position:absolute;right:2.438rem;top:1px;font-size:1.375rem;cursor:pointer}.multiselect-input-arrow{position:absolute;right:.75rem;top:3px;font-size:1.25rem;cursor:pointer;pointer-events:none}button:focus{outline:none;box-shadow:none;border-color:transparent}::ng-deep .ngb-dp-header,::ng-deep .ngb-dp-week{background:#fff!important}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "contentTemplate", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "popperOptions", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: NgbDatepicker, selector: "ngb-datepicker", inputs: ["contentTemplate", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "maxDate", "minDate", "navigation", "outsideDays", "showWeekNumbers", "startDate", "weekdays"], outputs: ["navigate", "dateSelect"], exportAs: ["ngbDatepicker"] }] }); }
|
|
337
|
+
}
|
|
338
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AnnaWeekCalendarComponent, decorators: [{
|
|
339
|
+
type: Component,
|
|
340
|
+
args: [{ selector: "anna-core-week-calendar-filter-lib", standalone: true, imports: [
|
|
341
|
+
NgIf,
|
|
342
|
+
FormsModule,
|
|
343
|
+
NgbInputDatepicker,
|
|
344
|
+
NgClass,
|
|
345
|
+
NgbDatepicker,
|
|
346
|
+
], template: "<form class=\"form-inline\" *ngIf=\"config.showAsDropdown\">\r\n <div class=\"form-group hidden\">\r\n <div class=\"input-group\">\r\n <input\r\n name=\"datepicker\"\r\n class=\"form-control\"\r\n ngbDatepicker\r\n #datepicker=\"ngbDatepicker\"\r\n [autoClose]=\"false\"\r\n (dateSelect)=\"selectWeek($event)\"\r\n (closed)=\"isFocused(false)\"\r\n [displayMonths]=\"1\"\r\n [dayTemplate]=\"t\"\r\n [startDate]=\"fromDate!\"\r\n [firstDayOfWeek]=\"config.firstDayOfWeek\"\r\n [showWeekNumbers]=\"config.showWeekNumbers\"\r\n tabindex=\"-1\"\r\n style=\"display: none\"\r\n [footerTemplate]=\"footerTemplate\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!--Single week select-->\r\n <div *ngIf=\"!config.selectMultipleWeeks\">\r\n <span style=\"position: relative; left: 30px; font-size: 12px\"> {{ weekNumbers }} </span>\r\n <div class=\"form-group\">\r\n <div class=\"input-group\">\r\n <div class=\"single-week\">\r\n <div class=\"left\">\r\n <span class=\"material-icons next-round-btn\" (click)=\"previousWeek()\"> navigate_next </span>\r\n </div>\r\n <input\r\n #dpFromDate\r\n class=\"form-control\"\r\n placeholder=\"Select Weeks\"\r\n [ngClass]=\"[config.customClass == '' ? '' : config.customClass]\"\r\n name=\"dpFromDate\"\r\n [value]=\"dateToDisplay\"\r\n [readonly]=\"true\"\r\n (click)=\"isFocused(true); isDropdownOpenedForCalendar(datepicker)\"\r\n />\r\n <i class=\"mdi mdi-menu-down\" *ngIf='!datepicker.isOpen()' (click)=\"datepicker.open()\"></i>\r\n <i class='mdi mdi-menu-up' *ngIf=\"datepicker.isOpen()\" (click)=\"isDropdownOpenedForCalendar(datepicker)\"></i>\r\n <div class=\"right\">\r\n <span class=\"material-icons round-btn\" (click)=\"nextWeek()\"> navigate_next </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!--Multiple week select-->\r\n <div class=\"form-group\" *ngIf=\"config.selectMultipleWeeks\">\r\n <div class=\"input-group\">\r\n <div class=\"multiple-weeks\">\r\n <input\r\n #dpFromDate\r\n class=\"form-control\"\r\n placeholder=\"Select Weeks\"\r\n [ngClass]=\"[config.customClass == '' ? '' : config.customClass]\"\r\n name=\"dpFromDate\"\r\n [readonly]=\"true\"\r\n [value]=\"weekNumbers\"\r\n (click)=\"isFocused(true); isDropdownOpenedForCalendar(datepicker)\"\r\n />\r\n <i *ngIf=\"!multiSelectDropdownOpen\" class=\"mdi mdi-menu-down multiselect-input-arrow\"></i>\r\n <i *ngIf=\"multiSelectDropdownOpen\" class=\"mdi mdi-menu-up multiselect-input-arrow\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n</form>\r\n\r\n<ngb-datepicker\r\n #weekPicker\r\n *ngIf=\"!config.showAsDropdown\"\r\n [displayMonths]=\"1\"\r\n [startDate]=\"fromDate!\"\r\n [firstDayOfWeek]=\"config.firstDayOfWeek\"\r\n [showWeekNumbers]=\"config.showWeekNumbers\"\r\n [dayTemplate]=\"t\"\r\n [maxDate]=\"maxDate\"\r\n [minDate]=\"minDate\"\r\n (dateSelect)=\"selectWeek($event)\"\r\n [markDisabled]=\"disabledFunc\"\r\n>\r\n</ngb-datepicker>\r\n\r\n<ng-template #footerTemplate>\r\n <hr class=\"my-0\" />\r\n <button\r\n class=\"btn btn-primary btn-sm m-2 float-right\"\r\n (click)=\"applyChanges(); closeDatepicker(datepicker)\"\r\n style=\"background-color: #268bff; color: #ffffff\"\r\n >\r\n Apply\r\n </button>\r\n <button\r\n class=\"btn btn-primary btn-sm m-2 float-right\"\r\n (click)=\"revertDates(); closeDatepicker(datepicker)\"\r\n style=\"background-color: rgba(38, 139, 255, 0.12); color: #268bff\"\r\n >\r\n Cancel\r\n </button>\r\n</ng-template>\r\n\r\n<ng-template #t let-date let-focused=\"focused\" let-disabled=\"disabled\">\r\n <span\r\n class=\"custom-day\"\r\n [class.focused]=\"focused\"\r\n [class.range]=\"isRange(date)\"\r\n [class.faded]=\"isHovered(date) || isInside(date)\"\r\n [class.disabled]=\"disabled\"\r\n (mouseenter)=\"hoveredDate = date\"\r\n (mouseleave)=\"hoveredDate = null\"\r\n >\r\n {{ date.day }}\r\n </span>\r\n</ng-template>\r\n\r\n<!--\r\n\r\n<hr>\r\n\r\n<pre>From: {{ fromDate | json }} </pre>\r\n<pre>To: {{ toDate | json }} </pre>\r\n<pre>weekNumbers: {{ weekNumbers | json }} </pre>\r\n\r\n-->\r\n", styles: [":host ::ng-deep .ngb-dp-arrow button:disabled{color:#4a4a4a;background-color:#fff;opacity:.25;cursor:not-allowed}:host ::ng-deep .ngb-dp-arrow button:disabled .ngb-dp-navigation-chevron{color:#4a4a4a}:host ::ng-deep .ngb-dp-arrow button .ngb-dp-navigation-chevron{color:#000}:host::ng-deep .right{width:unset!important;background-color:#fff!important}:host::ng-deep .ngb-dp-day,:host::ng-deep .ngb-dp-weekday{width:3rem!important;font-style:unset!important;color:#8bac2a;outline:none}:host::ng-deep .ngb-dp-day:first-child{border:1px solid black}:host::ng-deep .ngb-dp-day.disabled{color:#d4d4d4;cursor:not-allowed}:host::ng-deep .ngb-dp-showweek:before{content:\"Weeks\";margin-right:5px}:host::ng-deep .ngb-dp-week-number{font-style:unset!important;width:4rem!important;margin-right:5px;font-weight:700;color:#000!important;border-right:1px solid rgba(0,0,0,.125)}:host::ng-deep .ngb-dp-week-number:before{font-style:unset!important;content:\"Week \"}:host::ng-deep .ngb-dp-weekday.ngb-dp-showweek{margin-right:5px;width:4rem!important;border-right:1px solid rgba(0,0,0,.125)}:host::ng-deep .dropdown-menu{box-shadow:none}:host::ng-deep .dropdown-menu.show{top:15px!important}:host::ng-deep .bg-light{background-color:#fff!important}:host::ng-deep .ngb-dp-weekdays{border-top:1px solid rgba(0,0,0,.125)}:host::ng-deep .ngb-dp-arrow-btn:focus{box-shadow:none}.custom-day{text-align:center;padding:.185rem .25rem;display:inline-block;height:1.75rem;font-weight:700;color:#222b45;width:3rem!important}.custom-day.focused{background-color:#fff}.custom-day.faded{background-color:#0275d880!important}.custom-day.faded:focus{outline:none!important}.custom-day:hover{background-color:#268bff1f!important;color:#4a4a4a!important}.custom-day:focus{outline:none!important}.custom-day.range{background-color:#268bff1f!important;color:#4a4a4a!important}.custom-day.range:focus{outline:none!important}.custom-day.disabled{color:#d3d3d3}.input-group>.single-week,.input-group .multiple-weeks{display:inline-flex!important}.input-group>.single-week>.form-control,.input-group .multiple-weeks>.form-control{width:212px;border-radius:2px;border:solid 1px #b3b3b3;height:1.875rem;cursor:pointer}.input-group>.form-control{width:212px;border-radius:2px;border:solid 1px #b3b3b3;height:1.875rem;cursor:pointer}.form-control[readonly]{background-color:#fff!important}.next-round-btn{transform:rotate(180deg);margin-left:.125rem;line-height:1.3;border-radius:50%;cursor:pointer}.round-btn{line-height:1.3;border-radius:50%;cursor:pointer;margin-left:.25rem}:host::ng-deep select.custom-select{background:none;appearance:auto}.left,.right{width:1.875rem!important;height:1.875rem;background:#d8d8d8!important;border-radius:50%}.left{margin-right:.3125rem}.right{margin-left:.3125rem}:host::ng-deep .right .ngb-dp-navigation-chevron,:host::ng-deep .ngb-dp-navigation-chevron{color:#268bff}:host::ng-deep .ngb-dp-arrow-btn:focus{outline-width:0px}.custom-day.faded{background-color:#268bff33!important;color:#000!important;font-weight:600}.custom-day{text-align:center;padding:.185rem .25rem;color:#000;display:inline-block;line-height:1.9;height:2rem;width:2rem}.custom-day.focused{background-color:#e6e6e6}.custom-day.range{background-color:#268bff!important;color:#fff!important;font-weight:600}.custom-day:hover{background-color:#d9e1e6;border-radius:.25rem;color:#bdbdbd}:host::ng-deep div.ngb-dp-weekday{color:#8bac2a;font-family:Roboto;font-size:.8125rem;font-weight:700;font-stretch:normal;font-style:normal;line-height:2.6;letter-spacing:normal}.mdi-menu-up,.mdi-menu-down{position:absolute;right:2.438rem;top:1px;font-size:1.375rem;cursor:pointer}.multiselect-input-arrow{position:absolute;right:.75rem;top:3px;font-size:1.25rem;cursor:pointer;pointer-events:none}button:focus{outline:none;box-shadow:none;border-color:transparent}::ng-deep .ngb-dp-header,::ng-deep .ngb-dp-week{background:#fff!important}\n"] }]
|
|
347
|
+
}], ctorParameters: function () { return [{ type: i1.NgbCalendar }, { type: i1.NgbDatepickerConfig }, { type: i2.AnnaDateTimeFormatService }, { type: i3.AnnaGlobalConfigService }]; }, propDecorators: { selectedFromDate: [{
|
|
348
|
+
type: Input,
|
|
349
|
+
args: ["from-date"]
|
|
350
|
+
}], selectedEndDate: [{
|
|
351
|
+
type: Input,
|
|
352
|
+
args: ["to-date"]
|
|
353
|
+
}], disabledDates: [{
|
|
354
|
+
type: Input,
|
|
355
|
+
args: ["disabled-dates"]
|
|
356
|
+
}], maxDate: [{
|
|
357
|
+
type: Input
|
|
358
|
+
}], minDate: [{
|
|
359
|
+
type: Input
|
|
360
|
+
}], config: [{
|
|
361
|
+
type: Input,
|
|
362
|
+
args: ["week-calendar-config"]
|
|
363
|
+
}], applyWeekCalendarChanges: [{
|
|
364
|
+
type: Output,
|
|
365
|
+
args: ["apply"]
|
|
366
|
+
}], calendarToggled: [{
|
|
367
|
+
type: Output,
|
|
368
|
+
args: ["toggle-calendar"]
|
|
369
|
+
}] } });
|
|
370
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5uYS13ZWVrLWNhbGVuZGFyLWZpbHRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbm5hLWNvcmUvc3JjL2xpYi9hbm5hLWRyb3Bkb3duLWxpYi9jb21wb25lbnRzL2FubmEtd2Vlay1jYWxlbmRhci1maWx0ZXIvYW5uYS13ZWVrLWNhbGVuZGFyLWZpbHRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbm5hLWNvcmUvc3JjL2xpYi9hbm5hLWRyb3Bkb3duLWxpYi9jb21wb25lbnRzL2FubmEtd2Vlay1jYWxlbmRhci1maWx0ZXIvYW5uYS13ZWVrLWNhbGVuZGFyLWZpbHRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0QkFBNEI7QUFDNUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUQsT0FBTyxFQUFpQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUV4SCxnQ0FBZ0M7QUFDaEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQWlCLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pJLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUcxQixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxzRUFBc0UsQ0FBQztBQUNqSCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxtRUFBbUUsQ0FBQztBQUM1RyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7OztBQUU3QyxpQ0FBaUM7QUFpQmpDLE1BQU0sT0FBTyx5QkFBeUI7SUFvQ3BDLFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyx5REFBeUQ7UUFDekQs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QUFLLElBQUksT0FBTyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ25JLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELGVBQWUsQ0FBQyxhQUFrQjtRQUNoQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDeEIsQ0FBQzsrR0F2WVUseUJBQXlCO21HQUF6Qix5QkFBeUIsaWNDOUJ0Qyx3aUtBaUlBLGczSEQxR1EsSUFBSSw0RkFDSixXQUFXLHdkQUNYLGtCQUFrQix5ZUFDbEIsT0FBTyxvRkFDUCxhQUFhOzs0RkFHUix5QkFBeUI7a0JBYnJDLFNBQVM7K0JBQ0ksb0NBQW9DLGNBR2xDLElBQUksV0FDUDt3QkFDTCxJQUFJO3dCQUNKLFdBQVc7d0JBQ1gsa0JBQWtCO3dCQUNsQixPQUFPO3dCQUNQLGFBQWE7cUJBQ2hCO2tOQXNCaUIsZ0JBQWdCO3NCQUFuQyxLQUFLO3VCQUFDLFdBQVc7Z0JBQ0EsZUFBZTtzQkFBaEMsS0FBSzt1QkFBQyxTQUFTO2dCQUNTLGFBQWE7c0JBQXJDLEtBQUs7dUJBQUMsZ0JBQWdCO2dCQUNkLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBUXlCLE1BQU07c0JBQXBDLEtBQUs7dUJBQUMsc0JBQXNCO2dCQUNaLHdCQUF3QjtzQkFBeEMsTUFBTTt1QkFBQyxPQUFPO2dCQUNZLGVBQWU7c0JBQXpDLE1BQU07dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhciBpbXBvcnQgc3RhdGVtZW50c1xyXG5pbXBvcnQgeyBEYXRlUGlwZSwgTmdJZiwgTmdDbGFzcyB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8vIFRoaXJkIHBhcnR5IGltcG9ydCBzdGF0ZW1lbnRzXHJcbmltcG9ydCB7IE5nYkNhbGVuZGFyLCBOZ2JEYXRlLCBOZ2JEYXRlcGlja2VyQ29uZmlnLCBOZ2JEYXRlU3RydWN0LCBOZ2JJbnB1dERhdGVwaWNrZXIsIE5nYkRhdGVwaWNrZXIgfSBmcm9tIFwiQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcIjtcclxuaW1wb3J0IGRheWpzIGZyb20gXCJkYXlqc1wiO1xyXG5pbXBvcnQgeyBXZWVrT2JqZWN0IH0gZnJvbSAnLi4vLi4vLi4vYW5uYS1jb3JlLXNoYXJlZC1saWIvbW9kZWxzL2FubmEtZ2VuZXJpYy1kYXRhLXR5cGUubW9kZWwnO1xyXG5pbXBvcnQgeyBJV2Vla0NhbGVuZGFyIH0gZnJvbSAnLi4vLi4vLi4vYW5uYS1jb3JlLXNoYXJlZC1saWIvbW9kZWxzL2FubmEtZ2xvYmFsLWRyb3Bkb3duLWNvbmZpZy5tb2RlbCc7XHJcbmltcG9ydCB7IEFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9hbm5hLWNvcmUtc2hhcmVkLWxpYi9zZXJ2aWNlcy9hbm5hLWRhdGUtdGltZS1mb3JtYXQuc2VydmljZSc7XHJcbmltcG9ydCB7IEFubmFHbG9iYWxDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vYW5uYS1jb3JlLXNoYXJlZC1saWIvc2VydmljZXMvYW5uYS1nbG9iYWwtY29uZmlnLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5cclxuLy8gVXNlciBkZWZpbmVkIGltcG9ydCBzdGF0ZW1lbnRzXHJcblxyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6IFwiYW5uYS1jb3JlLXdlZWstY2FsZW5kYXItZmlsdGVyLWxpYlwiLFxyXG4gICAgdGVtcGxhdGVVcmw6IFwiLi9hbm5hLXdlZWstY2FsZW5kYXItZmlsdGVyLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgICBzdHlsZVVybHM6IFtcIi4vYW5uYS13ZWVrLWNhbGVuZGFyLWZpbHRlci5jb21wb25lbnQuc2Nzc1wiXSxcclxuICAgIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgICBpbXBvcnRzOiBbXHJcbiAgICAgICAgTmdJZixcclxuICAgICAgICBGb3Jtc01vZHVsZSxcclxuICAgICAgICBOZ2JJbnB1dERhdGVwaWNrZXIsXHJcbiAgICAgICAgTmdDbGFzcyxcclxuICAgICAgICBOZ2JEYXRlcGlja2VyLFxyXG4gICAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEFubmFXZWVrQ2FsZW5kYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgZnJvbURhdGU6IE5nYkRhdGUgfCBudWxsO1xyXG4gIGhvdmVyZWREYXRlOiBOZ2JEYXRlIHwgbnVsbCA9IG51bGw7XHJcbiAgdG9EYXRlOiBOZ2JEYXRlIHwgbnVsbCA9IG51bGw7XHJcbiAgdG9kYXk6IE5nYkRhdGU7XHJcblxyXG4gIG1vZGVsOiBOZ2JEYXRlU3RydWN0O1xyXG5cclxuICB3ZWVrTnVtYmVyczogc3RyaW5nW10gPSBbXTtcclxuICBwaXBlOiBEYXRlUGlwZTtcclxuICBkYXRlVG9EaXNwbGF5OiBzdHJpbmcgPSBcIlwiO1xyXG4gIHdlZWtPYmplY3RzOiBXZWVrT2JqZWN0W107XHJcbiAgbXVsdGlTZWxlY3REcm9wZG93bk9wZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuICBkYXRlcGlja2VyOiBOZ2JJbnB1dERhdGVwaWNrZXI7XHJcbiAgcHJpdmF0ZSBmb3JtYXR0ZXI6IGFueTtcclxuICBwdWJsaWMgZm9ybWF0dGVkU3RhcnREYXRlOiBzdHJpbmc7XHJcbiAgcHVibGljIGZvcm1hdHRlZEVuZERhdGU6IHN0cmluZztcclxuICBwcml2YXRlIGNhbGVuZGFyTWFwID0gbmV3IE1hcCgpO1xyXG4gIHByaXZhdGUgZmxhZzE6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBmbGFnMjogYm9vbGVhbjtcclxuICBASW5wdXQoXCJmcm9tLWRhdGVcIikgc2VsZWN0ZWRGcm9tRGF0ZTogTmdiRGF0ZVN0cnVjdDtcclxuICBASW5wdXQoXCJ0by1kYXRlXCIpIHNlbGVjdGVkRW5kRGF0ZTogTmdiRGF0ZVN0cnVjdDtcclxuICBASW5wdXQoXCJkaXNhYmxlZC1kYXRlc1wiKSBkaXNhYmxlZERhdGVzOiBOZ2JEYXRlW10gPSBbXTtcclxuICBASW5wdXQoKSBtYXhEYXRlOiBhbnk7XHJcbiAgQElucHV0KCkgbWluRGF0ZTogYW55O1xyXG5cclxuICBkaXNhYmxlZEZ1bmM6IGFueTtcclxuICBzdGF0ZTogYW55O1xyXG5cclxuICAvL1NldHRpbmcgdGhlIGRlZmF1bHQgdmFsdWVzO1xyXG4gIHByaXZhdGUgX2RlZmF1bHRWYWx1ZXM6IElXZWVrQ2FsZW5kYXI7XHJcblxyXG4gIEBJbnB1dChcIndlZWstY2FsZW5kYXItY29uZmlnXCIpIGNvbmZpZzogSVdlZWtDYWxlbmRhcjtcclxuICBAT3V0cHV0KFwiYXBwbHlcIikgYXBwbHlXZWVrQ2FsZW5kYXJDaGFuZ2VzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoXCJ0b2dnbGUtY2FsZW5kYXJcIikgY2FsZW5kYXJUb2dnbGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICAvL2lmIHNvbWUgdmFsdWVzIGFyZSBub3Qgc2VudCwgc2V0dGluZyB0aGUgZGVmYXVsdCB2YWx1ZXNcclxuICAgIHRoaXMuX2RlZmF1bHRWYWx1ZXMgPSB0aGlzLmdsb2JhbENvbmZpZ1NlcnZpY2UuZGVmYXVsdFdlZWtDYWxlbmRhckNvbmZpZztcclxuICAgIHRoaXMuY29uZmlnID0geyAuLi50aGlzLl9kZWZhdWx0VmFsdWVzLCAuLi50aGlzLmNvbmZpZyB9O1xyXG5cclxuICAgIGlmICh0aGlzLmNvbmZpZy5zZWxlY3RDdXJyZW50V2Vlaykge1xyXG4gICAgICB0aGlzLmluaXRpYWxpemVXZWVrRGF0YSgpO1xyXG4gICAgICB0aGlzLmZyb21EYXRlICYmIHRoaXMuc2VsZWN0V2Vlayh0aGlzLmZyb21EYXRlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZvcm1hdHRlciA9IHRoaXMuZm9ybWF0dGVkRGF0ZXMoKTtcclxuXHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZyb21EYXRlICYmIHRoaXMuc2VsZWN0ZWRFbmREYXRlICYmIHRoaXMuY29uZmlnKSB7XHJcbiAgICAgIC8vIHRoaXMuc2VsZWN0V2Vlayh0aGlzLmZyb21EYXRlKTtcclxuICAgICAgdGhpcy5mcm9tRGF0ZSA9IE5nYkRhdGUuZnJvbSh0aGlzLnNlbGVjdGVkRnJvbURhdGUpO1xyXG4gICAgICB0aGlzLnRvRGF0ZSA9IE5nYkRhdGUuZnJvbSh0aGlzLnNlbGVjdGVkRW5kRGF0ZSk7XHJcbiAgICAgIHRoaXMud2Vla051bWJlckdlbmVyYXRvcigpO1xyXG4gICAgICB0aGlzLmRpc3BsYXlUb1VJKCk7XHJcbiAgICAgIHRoaXMuc2V0Q2FsZW5kYXJNYXAoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZERhdGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5kaXNhYmxlZEZ1bmMgPSAoZGF0ZTogTmdiRGF0ZSwgY3VycmVudDogeyBtb250aDogbnVtYmVyIH0pID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jaGVja0lmRGF0ZUlzRGlzYWJsZWQoZGF0ZSk7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgY2FsZW5kYXI6IE5nYkNhbGVuZGFyLFxyXG4gICAgcHJpdmF0ZSBkYXRlUGlja2VyQ29uZmlnOiBOZ2JEYXRlcGlja2VyQ29uZmlnLFxyXG4gICAgcHJpdmF0ZSBhbm5hRGF0ZVRpbWVGb3JtYXRTZXJ2aWNlOiBBbm5hRGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBnbG9iYWxDb25maWdTZXJ2aWNlOiBBbm5hR2xvYmFsQ29uZmlnU2VydmljZVxyXG4gICkgeyB9XHJcblxyXG5cclxuICBnZXRXZWVrTnVtYmVyKHdlZWs6IGFueSwgZmlyc3REYXlPZldlZWs6IGFueSkge1xyXG4gICAgY29uc3Qgd2Vla1N0YXJ0RGF0ZSA9IGRheWpzKGNvbnZlcnROZ2JEYXRlVG9Nb21lbnQod2Vla1swXSksIFwiTU0vREQvWVlZWVwiKTtcclxuICAgIGNvbnN0IHdlZWtZZWFyID0gd2Vla1N0YXJ0RGF0ZS55ZWFyKCk7XHJcbiAgICBjb25zdCB5ZWFyU3RhcnREYXRlID0gZGF5anMoYDAxLzAxLyR7d2Vla1llYXJ9YCwgXCJNTS9ERC9ZWVlZXCIpO1xyXG4gICAgY29uc3Qgd2Vla0RheSA9IHllYXJTdGFydERhdGUuZGF5KCk7XHJcblxyXG4gICAgY29uc3Qgbm9PZkRheXMgPSB3ZWVrU3RhcnREYXRlLmRpZmYoeWVhclN0YXJ0RGF0ZSwgXCJkXCIpICsgMTtcclxuXHJcbiAgICBmdW5jdGlvbiBjb252ZXJ0TmdiRGF0ZVRvTW9tZW50KG5nYkRhdGU6IE5nYkRhdGUpOiBzdHJpbmcge1xyXG4gICAgICBsZXQgZm9ybWF0VHlwZSA9IFwiTU0vREQvWVlZWVwiO1xyXG4gICAgICBsZXQgY29udmVydGVkID0gbnVsbDtcclxuICAgICAgaWYobmdiRGF0ZSAmJiBuZ2JEYXRlLm1vbnRoICYmIG5nYkRhdGUuZGF5ICYmIG5nYkRhdGUueWVhcil7XHJcbiAgICAgICAgY29udmVydGVkID0gbmdiRGF0ZS5tb250aCsgXCIvXCIgKyAgbmdiRGF0ZS5kYXkgKyBcIi9cIiArIG5nYkRhdGUueWVhcjtcclxuICAgICAgICBjb252ZXJ0ZWQgPSBkYXlqcyhjb252ZXJ0ZWQpLmZvcm1hdChmb3JtYXRUeXBlKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gY29udmVydGVkO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNoZWNrSWZZZWFySXNCcm9hZGNhc3RMZWFwWWVhcigpIHtcclxuICAgICAgbGV0IGlzTGVhcFllYXIgPSAod2Vla1llYXIgJSA0ID09IDAgJiYgd2Vla1llYXIgJSAxMDAgIT0gMCkgfHwgd2Vla1llYXIgJSA0MDAgPT0gMDtcclxuICAgICAgcmV0dXJuIChpc0xlYXBZZWFyICYmICh3ZWVrRGF5ID09IDAgfHwgd2Vla0RheSA9PSA2KSkgfHwgKCFpc0xlYXBZZWFyICYmIHdlZWtEYXkgPT0gMCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaXNMZWFwWWVhciA9IGNoZWNrSWZZZWFySXNCcm9hZGNhc3RMZWFwWWVhcigpO1xyXG4gICAgY29uc3QgZGl2aWRlciA9IGlzTGVhcFllYXIgPyA1MyA6IDUyO1xyXG4gICAgY29uc3QgYWRkZXIgPSBpc0xlYXBZZWFyID8gMiA6IDE7XHJcblxyXG4gICAgbGV0IGJyb2FkY2FzdE51bWJlck9mRGF5cyA9IHdlZWtEYXkgKyBub09mRGF5cztcclxuICAgIGxldCBicm9hZGNhc3RXZWVrTnVtYmVyID0gYnJvYWRjYXN0TnVtYmVyT2ZEYXlzICUgNyA+IDAgPyBicm9hZGNhc3ROdW1iZXJPZkRheXMgLyA3ICsgYWRkZXIgOiBicm9hZGNhc3ROdW1iZXJPZkRheXMgLyA3O1xyXG5cclxuICAgIGlmIChNYXRoLmZsb29yKGJyb2FkY2FzdFdlZWtOdW1iZXIgJSBkaXZpZGVyKSA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gZGl2aWRlcjtcclxuICAgIH1cclxuICAgIHJldHVybiBNYXRoLmZsb29yKGJyb2FkY2FzdFdlZWtOdW1iZXIgJSBkaXZpZGVyKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIENIQU5HRVNAQU5OQUxJQiBDaGFuZ2VkIHRoaXMuXHJcbiAgICAvLyB0aGlzLmNhbGVuZGFyW1wiX19wcm90b19fXCJdLmdldFdlZWtOdW1iZXIgPSB0aGlzLmdldFdlZWtOdW1iZXI7XHJcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcy5jYWxlbmRhciwge2dldFdlZWtOdW1iZXI6IHRoaXMuZ2V0V2Vla051bWJlcn0pXHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIHRoaXMuc2VsZWN0V2Vlayh0aGlzLmZyb21EYXRlKTtcclxuICAgIHRoaXMuc2V0Q2FsZW5kYXJNYXAoKTtcclxuICB9XHJcblxyXG4gIGluaXRpYWxpemVXZWVrRGF0YSgpIHtcclxuICAgIHRoaXMud2Vla09iamVjdHMgPSBbXTtcclxuXHJcbiAgICB0aGlzLmZyb21EYXRlID0gdGhpcy5jYWxlbmRhci5nZXRUb2RheSgpO1xyXG4gICAgdGhpcy50b2RheSA9IHRoaXMuY2FsZW5kYXIuZ2V0VG9kYXkoKTtcclxuXHJcbiAgICBsZXQgYmFja0RhdGVkUGVyaW9kID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInVzZXJEZXRhaWxzXCIpIHx8ICd7fScpLmxvY2tpbmdfcGVyaW9kX2RheXM7XHJcbiAgICBpZiAoYmFja0RhdGVkUGVyaW9kIDwgMCkge1xyXG4gICAgICBsZXQgZGF0ZTogTmdiRGF0ZSA9IHRoaXMuY2FsZW5kYXIuZ2V0UHJldih0aGlzLmNhbGVuZGFyLmdldFRvZGF5KCksIFwiZFwiLCBNYXRoLmFicyhiYWNrRGF0ZWRQZXJpb2QpKTtcclxuICAgICAgdGhpcy50b2RheSA9IE5nYkRhdGUuZnJvbShkYXRlKTtcclxuICAgICAgdGhpcy5mcm9tRGF0ZSA9IE5nYkRhdGUuZnJvbShkYXRlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBEaXNhYmxlIG1vbnRocyBiZWZvcmUgbnVtYmVyT2ZNb250aHNUb0VuYWJsZVxyXG4gICAgdGhpcy5kYXRlUGlja2VyQ29uZmlnLm1hcmtEaXNhYmxlZCA9IChkYXRlOiBOZ2JEYXRlU3RydWN0KSA9PiB7XHJcbiAgICAgIGxldCBwcmV2aW91c01vbnRoID0gdGhpcy5jYWxlbmRhci5nZXRQcmV2KHRoaXMudG9kYXksIFwibVwiLCB0aGlzLmNvbmZpZy5udW1iZXJPZk1vbnRoc1RvRW5hYmxlSW5QYXN0KTtcclxuICAgICAgbGV0IHByZXZpb3VzRGF5ID0gdGhpcy5jYWxlbmRhci5nZXRQcmV2KHByZXZpb3VzTW9udGgsIFwiZFwiLCAxKTtcclxuICAgICAgcmV0dXJuICFOZ2JEYXRlLmZyb20ocHJldmlvdXNEYXkpLmJlZm9yZShkYXRlKTtcclxuICAgIH07XHJcbiAgICB0aGlzLmZvcm1hdHRlciA9IHRoaXMuZm9ybWF0dGVkRGF0ZXMoKTtcclxuICAgIHRoaXMuZmxhZzEgPSBmYWxzZTtcclxuICAgIHRoaXMuZmxhZzIgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHNlbGVjdFdlZWsoZGF0ZTogTmdiRGF0ZSk6IHZvaWQge1xyXG4gICAgY29uc3QgZGF0ZU9iamVjdCA9IG5ldyBEYXRlKGRhdGUueWVhciwgZGF0ZS5tb250aCAtIDEsIGRhdGUuZGF5KTtcclxuICAgIGxldCBjb25zdHJ1Y3REYXRlID0gdGhpcy5idWlsZERhdGUoZGF0ZU9iamVjdCk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5zZWxlY3RNdWx0aXBsZVdlZWtzKSB7XHJcbiAgICAgIC8vU2luZ2xlIHdlZWsgc2VsZWN0aW9uXHJcbiAgICAgIHRoaXMuZnJvbURhdGUgPSB0aGlzLmNvbnN0cnVjdFN0YXJ0RGF0ZShkYXRlT2JqZWN0KShjb25zdHJ1Y3REYXRlKTtcclxuICAgICAgdGhpcy50b0RhdGUgPSB0aGlzLmNvbnN0cnVjdEVuZERhdGUoZGF0ZU9iamVjdCkoY29uc3RydWN0RGF0ZSk7XHJcbiAgICAgIHRoaXMud2Vla051bWJlckdlbmVyYXRvcigpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGRhdGUuYmVmb3JlKHRoaXMuZnJvbURhdGUpKSB7XHJcbiAgICAgICAgdGhpcy5mcm9tRGF0ZSA9IHRoaXMuY29uc3RydWN0U3RhcnREYXRlKGRhdGVPYmplY3QpKGNvbnN0cnVjdERhdGUpO1xyXG4gICAgICAgIGlmICh0aGlzLmZsYWcxKSB7XHJcbiAgICAgICAgICB0aGlzLnRvRGF0ZSA9IHRoaXMuY29uc3RydWN0RW5kRGF0ZShkYXRlT2JqZWN0KShjb25zdHJ1Y3REYXRlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5mbGFnMSA9ICF0aGlzLmZsYWcxO1xyXG4gICAgICB9IGVsc2UgaWYgKGRhdGUuYWZ0ZXIodGhpcy50b0RhdGUpKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZmxhZzIpIHtcclxuICAgICAgICAgIHRoaXMuZnJvbURhdGUgPSB0aGlzLmNvbnN0cnVjdFN0YXJ0RGF0ZShkYXRlT2JqZWN0KShjb25zdHJ1Y3REYXRlKTtcclxuICAgICAgICAgIC8vdGhpcy50b0RhdGUgPSB0aGlzLmNvbnN0cnVjdEVuZERhdGUoZGF0ZU9iamVjdCkoY29uc3RydWN0RGF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZmxhZzIgPSAhdGhpcy5mbGFnMjtcclxuICAgICAgICB0aGlzLnRvRGF0ZSA9IHRoaXMuY29uc3RydWN0RW5kRGF0ZShkYXRlT2JqZWN0KShjb25zdHJ1Y3REYXRlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmZyb21EYXRlID0gdGhpcy5jb25zdHJ1Y3RTdGFydERhdGUoZGF0ZU9iamVjdCkoY29uc3RydWN0RGF0ZSk7XHJcbiAgICAgICAgdGhpcy50b0RhdGUgPSB0aGlzLmNvbnN0cnVjdEVuZERhdGUoZGF0ZU9iamVjdCkoY29uc3RydWN0RGF0ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkRGF0ZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGxldCBkYXlqc1N0YXJ0RGF0ZSA9IGRheWpzKHRoaXMuYW5uYURhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0TmdiRGF0ZVRvTW9tZW50KHRoaXMuZnJvbURhdGUpLCBcIk1NL0REL1lZWVlcIik7XHJcbiAgICAgICAgbGV0IGRheWpzRW5kRGF0ZSA9IGRheWpzKHRoaXMuYW5uYURhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0TmdiRGF0ZVRvTW9tZW50KHRoaXMudG9EYXRlKSwgXCJNTS9ERC9ZWVlZXCIpO1xyXG4gICAgICAgIGxldCBuZ2JEYXRlO1xyXG4gICAgICAgIHdoaWxlICghZGF5anNTdGFydERhdGUuaXNTYW1lKGRheWpzRW5kRGF0ZSkpIHtcclxuICAgICAgICAgIG5nYkRhdGUgPSB0aGlzLmFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvTmdiRGF0ZShkYXlqc1N0YXJ0RGF0ZSwgXCJNTS9ERC9ZWVlZXCIpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuY2hlY2tJZkRhdGVJc0Rpc2FibGVkKG5nYkRhdGUpKSB7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZGF5anNTdGFydERhdGUuYWRkKDEsIFwiZFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IG5ld0RhdGVPYmplY3QgPSBuZXcgRGF0ZShuZ2JEYXRlLnllYXIsIG5nYkRhdGUubW9udGggLSAxLCBuZ2JEYXRlLmRheSAtIDEpO1xyXG4gICAgICAgIGxldCBjb25zdHJ1Y3REYXRlID0gdGhpcy5idWlsZERhdGUobmV3RGF0ZU9iamVjdCk7XHJcbiAgICAgICAgdGhpcy50b0RhdGUgPSB0aGlzLmNvbnN0cnVjdEVuZERhdGUobmV3RGF0ZU9iamVjdCkoY29uc3RydWN0RGF0ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMud2Vla051bWJlckdlbmVyYXRvcigpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5jb25maWcuc2hvd0FzRHJvcGRvd24pIHtcclxuICAgICAgdGhpcy5hcHBseUNoYW5nZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHdlZWtOdW1iZXJHZW5lcmF0b3IoKTogdm9pZCB7XHJcbiAgICBsZXQgZGF0ZXMgPSBbXTtcclxuICAgIGxldCB3ZWVrID0gW107XHJcblxyXG4gICAgbGV0IHN0YXJ0RGF0ZSA9IE5nYkRhdGUuZnJvbSh0aGlzLmZyb21EYXRlKTtcclxuICAgIGxldCBlbmREYXRlID0gTmdiRGF0ZS5mcm9tKHRoaXMudG9EYXRlKTtcclxuXHJcbiAgICB3ZWVrLnB1c2goc3RhcnREYXRlKTtcclxuICAgIHdoaWxlIChlbmREYXRlICE9IG51bGwgJiYgIXN0YXJ0RGF0ZS5lcXVhbHMoZW5kRGF0ZSkpIHtcclxuICAgICAgbGV0IGRhdGUgPSB0aGlzLmNhbGVuZGFyLmdldE5leHQoc3RhcnREYXRlLCBcImRcIiwgMSk7XHJcbiAgICAgIHN0YXJ0RGF0ZSA9IGRhdGU7XHJcbiAgICAgIHdlZWsucHVzaChkYXRlKTtcclxuXHJcbiAgICAgIC8vIENvbGxlY3QgYWxsIGRheXMgaW4gd2VlayB0byBjYWxjdWxhdGUgdGhlIHdlZWsgbnVtYmVyXHJcbiAgICAgIGlmICh3ZWVrLmxlbmd0aCA9PSA3KSB7XHJcbiAgICAgICAgZGF0ZXMucHVzaCh3ZWVrKTtcclxuICAgICAgICB3ZWVrID0gW107XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICgoKHRoaXMuY29uZmlnLm1heFdlZWtzVG9TZWxlY3QgPz8gMCkgPiAwICYmIGRhdGVzLmxlbmd0aCA+ICh0aGlzLmNvbmZpZy5tYXhXZWVrc1RvU2VsZWN0ID8/IDApKSkge1xyXG4gICAgICBkYXRlcy5zcGxpY2UoKHRoaXMuY29uZmlnLm1heFdlZWtzVG9TZWxlY3QgPz8gMCksIGRhdGVzLmxlbmd0aCAtICh0aGlzLmNvbmZpZy5tYXhXZWVrc1RvU2VsZWN0ID8/IDApKTtcclxuICAgIH1cclxuICAgIHRoaXMuc2VsZWN0ZWREYXRlcyhkYXRlcyk7XHJcblxyXG4gICAgdGhpcy53ZWVrTnVtYmVycyA9IFtdO1xyXG4gICAgdGhpcy53ZWVrT2JqZWN0cyA9IFtdO1xyXG4gICAgaWYgKGRhdGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgZm9yIChsZXQgZGF0ZSBvZiBkYXRlcykge1xyXG4gICAgICAgIHRoaXMud2Vla051bWJlcnMucHVzaChcIiBXZWVrIFwiICsgdGhpcy5jYWxlbmRhci5nZXRXZWVrTnVtYmVyKGRhdGUsIHRoaXMuY29uZmlnLmZpcnN0RGF5T2ZXZWVrKSk7XHJcbiAgICAgICAgbGV0IGRhdGVzID0gdGhpcy5mb3JtYXR0ZXIoZGF0ZVswXSwgZGF0ZVs2XSk7XHJcbiAgICAgICAgbGV0IGRhdGVPYmplY3RzID0geyBzdGFydERhdGU6IGRhdGVzLmZvcm1hdHRlZFN0YXJ0RGF0ZSwgZW5kRGF0ZTogZGF0ZXMuZm9ybWF0dGVkRW5kRGF0ZSB9O1xyXG4gICAgICAgIHRoaXMud2Vla09iamVjdHMucHVzaChkYXRlT2JqZWN0cyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuZGlzcGxheVRvVUkoKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdGVkRGF0ZXMoZGF0ZXM6IGFueSkge1xyXG4gICAgdGhpcy5mcm9tRGF0ZSA9IGRhdGVzWzBdWzBdO1xyXG4gICAgdGhpcy50b0RhdGUgPSBkYXRlc1tkYXRlcy5sZW5ndGggLSAxXVs2XTtcclxuICB9XHJcblxyXG4gIGZvcm1hdHRlZERhdGVzKCkge1xyXG4gICAgbGV0IHBpcGUgPSBuZXcgRGF0ZVBpcGUoXCJlbi1VU1wiKTtcclxuICAgIGxldCB0aGlzT2JqID0gdGhpcztcclxuICAgIHJldHVybiBmdW5jdGlvbiAoZnJvbURhdGU6IE5nYkRhdGUsIHRvRGF0ZTogTmdiRGF0ZSkge1xyXG4gICAgICBsZXQgZnJvbURhdGVPYmplY3QgPSBuZXcgRGF0ZShmcm9tRGF0ZS55ZWFyLCBmcm9tRGF0ZS5tb250aCAtIDEsIGZyb21EYXRlLmRheSk7XHJcbiAgICAgIGxldCB0b0RhdGVPYmplY3QgPSBuZXcgRGF0ZSh0b0RhdGUueWVhciwgdG9EYXRlLm1vbnRoIC0gMSwgdG9EYXRlLmRheSk7XHJcbiAgICAgIHRoaXNPYmouZm9ybWF0dGVkU3RhcnREYXRlID0gcGlwZS50cmFuc2Zvcm0oZnJvbURhdGVPYmplY3QsIHRoaXNPYmouY29uZmlnLmRhdGVGb3JtYXRGb3JSZXF1ZXN0KTtcclxuICAgICAgdGhpc09iai5mb3JtYXR0ZWRFbmREYXRlID0gcGlwZS50cmFuc2Zvcm0odG9EYXRlT2JqZWN0LCB0aGlzT2JqLmNvbmZpZy5kYXRlRm9ybWF0Rm9yUmVxdWVzdCk7XHJcblxyXG4gICAgICB0aGlzT2JqLmRhdGVUb0Rpc3BsYXkgPVxyXG4gICAgICAgIHBpcGUudHJhbnNmb3JtKGZyb21EYXRlT2JqZWN0LCB0aGlzT2JqLmNvbmZpZy5kYXRlRm9ybWF0VG9EaXNwbGF5KSArXHJcbiAgICAgICAgXCIgdG8gXCIgK1xyXG4gICAgICAgIHBpcGUudHJhbnNmb3JtKHRvRGF0ZU9iamVjdCwgdGhpc09iai5jb25maWcuZGF0ZUZvcm1hdFRvRGlzcGxheSk7XHJcbiAgICAgIHJldHVybiB0aGlzT2JqO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGRpc3BsYXlUb1VJKCkge1xyXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5zZWxlY3RNdWx0aXBsZVdlZWtzICYmIHRoaXMuZnJvbURhdGUgJiYgdGhpcy50b0RhdGUpIHtcclxuICAgICAgLy8gRGlzcGxheSBmb3Igb25seSBTaW5nbGUgV2Vla1xyXG4gICAgICB0aGlzLmZvcm1hdHRlcih0aGlzLmZyb21EYXRlLCB0aGlzLnRvRGF0ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBEaXNwbGF5IGZvciBNdWx0aXBsZSBXZWVrc1xyXG4gICAgICBpZiAodGhpcy53ZWVrTnVtYmVycy5sZW5ndGggPiAodGhpcy5jb25maWcubWF4V2Vla3NUb1Nob3dXaXRoUmVtYWluaW5nQ291bnQgPz8gMCkpIHtcclxuICAgICAgICBsZXQgd2Vla0Rpc3BsYXkgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8ICh0aGlzLmNvbmZpZy5tYXhXZWVrc1RvU2hvd1dpdGhSZW1haW5pbmdDb3VudCA/PyAwKTsgaSsrKSB7XHJcbiAgICAgICAgICB3ZWVrRGlzcGxheS5wdXNoKHRoaXMud2Vla051bWJlcnMuc2hpZnQoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCByZW1haW5pbmdXZWVrcyA9IHRoaXMud2Vla051bWJlcnMubGVuZ3RoO1xyXG4gICAgICAgIHRoaXMud2Vla051bWJlcnMgPSBbXTtcclxuICAgICAgICB0aGlzLndlZWtOdW1iZXJzLnB1c2god2Vla0Rpc3BsYXkgKyBcIiArXCIgKyByZW1haW5pbmdXZWVrcyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdFN0YXJ0RGF0ZShkYXRlOiBEYXRlKSB7XHJcbiAgICBsZXQgZmlyc3REYXlPZldlZWsgPSB0aGlzLmNvbmZpZy5maXJzdERheU9mV2VlaztcclxuICAgIHJldHVybiBmdW5jdGlvbiAoY29uc3RydWN0RGF0ZTogYW55KSB7XHJcbiAgICAgIGxldCBzdGFydERheSA9IGRhdGUuZ2V0RGF5KCkgIT0gMCA/IChmaXJzdERheU9mV2VlayA/PyAwKSAtIGRhdGUuZ2V0RGF5KCkgOiAtNjtcclxuICAgICAgcmV0dXJuIGNvbnN0cnVjdERhdGUoc3RhcnREYXkpO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdEVuZERhdGUoZGF0ZTogRGF0ZSkge1xyXG4gICAgbGV0IGZpcnN0RGF5T2ZXZWVrID0gdGhpcy5jb25maWcuZmlyc3REYXlPZldlZWs7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGNvbnN0cnVjdERhdGU6IGFueSkge1xyXG4gICAgICBsZXQgZW5kRGF5ID0gZGF0ZS5nZXREYXkoKSAhPSAwID8gKGZpcnN0RGF5T2ZXZWVrID8/IDApICsgNiAtIGRhdGUuZ2V0RGF5KCkgOiAwO1xyXG4gICAgICByZXR1cm4gY29uc3RydWN0RGF0ZShlbmREYXkpO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGJ1aWxkRGF0ZShkYXRlOiBEYXRlKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKG51bWJlcjogbnVtYmVyKTogTmdiRGF0ZSB8IG51bGwge1xyXG4gICAgICBsZXQgZGF5ID0gZGF0ZS5nZXREYXRlKCkgKyBudW1iZXI7XHJcbiAgICAgIGNvbnN0IGRhdGVPYmplY3QgPSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF5KTtcclxuXHJcbiAgICAgIGxldCBuZ2JEYXRlT2JqZWN0ID0ge30gYXMgTmdiRGF0ZTtcclxuICAgICAgbmdiRGF0ZU9iamVjdC5kYXkgPSBkYXk7XHJcblxyXG4gICAgICBpZiAobmdiRGF0ZU9iamVjdC5kYXkgPiAzMSB8fCBuZ2JEYXRlT2JqZWN0LmRheSA8IDEpIHtcclxuICAgICAgICBuZ2JEYXRlT2JqZWN0LmRheSA9IGRhdGVPYmplY3QuZ2V0RGF0ZSgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBuZ2JEYXRlT2JqZWN0Lm1vbnRoID0gZGF0ZU9iamVjdC5nZXRNb250aCgpICsgMTtcclxuICAgICAgbmdiRGF0ZU9iamVjdC55ZWFyID0gZGF0ZU9iamVjdC5nZXRGdWxsWWVhcigpO1xyXG4gICAgICByZXR1cm4gTmdiRGF0ZS5mcm9tKG5nYkRhdGVPYmplY3QpO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGlzSG92ZXJlZChkYXRlOiBOZ2JEYXRlKTogYm9vbGVhbiB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuZnJvbURhdGUgJiYgIXRoaXMudG9EYXRlICYmIHRoaXMuaG92ZXJlZERhdGUgJiYgZGF0ZS5hZnRlcih0aGlzLmZyb21EYXRlKSAmJiBkYXRlLmJlZm9yZSh0aGlzLmhvdmVyZWREYXRlKTtcclxuICB9XHJcblxyXG4gIGlzSW5zaWRlKGRhdGU6IE5nYkRhdGUpOiBib29sZWFuIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy50b0RhdGUgJiYgZGF0ZS5hZnRlcih0aGlzLmZyb21EYXRlKSAmJiBkYXRlLmJlZm9yZSh0aGlzLnRvRGF0ZSk7XHJcbiAgfVxyXG5cclxuICBpc1JhbmdlKGRhdGU6IE5nYkRhdGUpOiBib29sZWFuIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBkYXRlLmVxdWFscyh0aGlzLmZyb21EYXRlKSB8fCAodGhpcy50b0RhdGUgJiYgZGF0ZS5lcXVhbHModGhpcy50b0RhdGUpKSB8fCB0aGlzLmlzSW5zaWRlKGRhdGUpIHx8IHRoaXMuaXNIb3ZlcmVkKGRhdGUpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJldmlvdXNXZWVrKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZnJvbURhdGUpIHtcclxuICAgICAgdGhpcy50b0RhdGUgPSB0aGlzLmNhbGVuZGFyLmdldFByZXYodGhpcy5mcm9tRGF0ZSwgXCJkXCIsIDEpO1xyXG4gICAgICB0aGlzLmZyb21EYXRlID0gdGhpcy5jYWxlbmRhci5nZXRQcmV2KHRoaXMuZnJvbURhdGUsIFwiZFwiLCB0aGlzLmNhbGVuZGFyLmdldERheXNQZXJXZWVrKCkpO1xyXG4gICAgfVxyXG4gICAgdGhpcy53ZWVrTnVtYmVyR2VuZXJhdG9yKCk7XHJcbiAgICB0aGlzLmFwcGx5Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgbmV4dFdlZWsoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5mcm9tRGF0ZSkge1xyXG4gICAgICB0aGlzLmZyb21EYXRlID0gdGhpcy5jYWxlbmRhci5nZXROZXh0KHRoaXMuZnJvbURhdGUsIFwiZFwiLCB0aGlzLmNhbGVuZGFyLmdldERheXNQZXJXZWVrKCkpO1xyXG4gICAgICB0aGlzLnRvRGF0ZSA9IHRoaXMuY2FsZW5kYXIuZ2V0TmV4dCh0aGlzLmZyb21EYXRlLCBcImRcIiwgdGhpcy5jYWxlbmRhci5nZXREYXlzUGVyV2VlaygpIC0gMSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLndlZWtOdW1iZXJHZW5lcmF0b3IoKTtcclxuICAgIHRoaXMuYXBwbHlDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBzZXRDYWxlbmRhck1hcCgpIHtcclxuICAgIGxldCBkYXRlT2JqID0geyBmcm9tRGF0ZTogdGhpcy5mcm9tRGF0ZSwgdG9EYXRlOiB0aGlzLnRvRGF0ZSB9O1xyXG4gICAgdGhpcy5jYWxlbmRhck1hcC5zZXQoXCJvbGREYXRlc1wiLCBkYXRlT2JqKTtcclxuICB9XHJcblxyXG4gIGFwcGx5Q2hhbmdlcygpIHtcclxuICAgIHRoaXMubXVsdGlTZWxlY3REcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIGlmICghdGhpcy5jb25maWcuZW1pdE11bHRpcGxlV2Vla09iamVjdHMpIHtcclxuICAgICAgbGV0IGRhdGVzID0ge30gYXMgV2Vla09iamVjdDtcclxuICAgICAgbGV0IGZvcm1hdHRlZERhdGVzID0gdGhpcy5mb3JtYXR0ZXIodGhpcy5mcm9tRGF0ZSwgdGhpcy50b0RhdGUpO1xyXG4gICAgICBkYXRlcy5zdGFydERhdGUgPSBmb3JtYXR0ZWREYXRlcy5mb3JtYXR0ZWRTdGFydERhdGU7XHJcbiAgICAgIGRhdGVzLmVuZERhdGUgPSBmb3JtYXR0ZWREYXRlcy5mb3JtYXR0ZWRFbmREYXRlO1xyXG4gICAgICB0aGlzLmFwcGx5V2Vla0NhbGVuZGFyQ2hhbmdlcy5lbWl0KGRhdGVzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYXBwbHlXZWVrQ2FsZW5kYXJDaGFuZ2VzLmVtaXQodGhpcy53ZWVrT2JqZWN0cyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldENhbGVuZGFyTWFwKCk7XHJcbiAgfVxyXG5cclxuICBpc0ZvY3VzZWQodmFsdWU6IGFueSkge1xyXG4gICAgdGhpcy5jYWxlbmRhclRvZ2dsZWQuZW1pdCh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBpc0Ryb3Bkb3duT3BlbmVkRm9yQ2FsZW5kYXIoZGF0ZXBpY2tlcjogTmdiSW5wdXREYXRlcGlja2VyKSB7XHJcbiAgICB0aGlzLmRhdGVwaWNrZXIgPSBkYXRlcGlja2VyO1xyXG4gICAgaWYgKHRoaXMuZGF0ZXBpY2tlci5pc09wZW4oKSkge1xyXG4gICAgICB0aGlzLnJldmVydERhdGVzKCk7XHJcbiAgICAgIHRoaXMuZGF0ZXBpY2tlci5jbG9zZSgpO1xyXG4gICAgICB0aGlzLm11bHRpU2VsZWN0RHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRhdGVwaWNrZXIub3BlbigpO1xyXG4gICAgICB0aGlzLm11bHRpU2VsZWN0RHJvcGRvd25PcGVuID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldmVydERhdGVzKCkge1xyXG4gICAgdGhpcy5tdWx0aVNlbGVjdERyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuY2FsZW5kYXJNYXAuZ2V0KFwib2xkRGF0ZXNcIikpIHtcclxuICAgICAgbGV0IGRhdGVPYmogPSB0aGlzLmNhbGVuZGFyTWFwLmdldChcIm9sZERhdGVzXCIpO1xyXG4gICAgICB0aGlzLmZyb21EYXRlID0gZGF0ZU9iai5mcm9tRGF0ZTtcclxuICAgICAgdGhpcy50b0RhdGUgPSBkYXRlT2JqLnRvRGF0ZTtcclxuICAgICAgdGhpcy53ZWVrTnVtYmVyR2VuZXJhdG9yKCk7XHJcbiAgICAgIHRoaXMuZGlzcGxheVRvVUkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNoZWNrSWZEYXRlSXNEaXNhYmxlZChkYXRlOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHZhbGlkYXRvckZ1bmMgPSAobmdiRGF0ZTogTmdiRGF0ZSkgPT4gbmdiRGF0ZS55ZWFyID09PSBkYXRlLnllYXIgJiYgbmdiRGF0ZS5tb250aCA9PT0gZGF0ZS5tb250aCAmJiBuZ2JEYXRlLmRheSA9PT0gZGF0ZS5kYXk7XHJcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlZERhdGVzLnNvbWUodmFsaWRhdG9yRnVuYyk7XHJcbiAgfVxyXG5cclxuICBjbG9zZURhdGVwaWNrZXIoZGF0ZXBpY2tlclJlZjogYW55KSB7XHJcbiAgICBkYXRlcGlja2VyUmVmLmNsb3NlKCk7XHJcbiAgfVxyXG59XHJcbiIsIjxmb3JtIGNsYXNzPVwiZm9ybS1pbmxpbmVcIiAqbmdJZj1cImNvbmZpZy5zaG93QXNEcm9wZG93blwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgaGlkZGVuXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgbmFtZT1cImRhdGVwaWNrZXJcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgbmdiRGF0ZXBpY2tlclxyXG4gICAgICAgICAgICAgICAgI2RhdGVwaWNrZXI9XCJuZ2JEYXRlcGlja2VyXCJcclxuICAgICAgICAgICAgICAgIFthdXRvQ2xvc2VdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgKGRhdGVTZWxlY3QpPVwic2VsZWN0V2VlaygkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChjbG9zZWQpPVwiaXNGb2N1c2VkKGZhbHNlKVwiXHJcbiAgICAgICAgICAgICAgICBbZGlzcGxheU1vbnRoc109XCIxXCJcclxuICAgICAgICAgICAgICAgIFtkYXlUZW1wbGF0ZV09XCJ0XCJcclxuICAgICAgICAgICAgICAgIFtzdGFydERhdGVdPVwiZnJvbURhdGUhXCJcclxuICAgICAgICAgICAgICAgIFtmaXJzdERheU9mV2Vla109XCJjb25maWcuZmlyc3REYXlPZldlZWtcIlxyXG4gICAgICAgICAgICAgICAgW3Nob3dXZWVrTnVtYmVyc109XCJjb25maWcuc2hvd1dlZWtOdW1iZXJzXCJcclxuICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxyXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJkaXNwbGF5OiBub25lXCJcclxuICAgICAgICAgICAgICAgIFtmb290ZXJUZW1wbGF0ZV09XCJmb290ZXJUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tU2luZ2xlIHdlZWsgc2VsZWN0LS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiIWNvbmZpZy5zZWxlY3RNdWx0aXBsZVdlZWtzXCI+XHJcbiAgICAgICAgPHNwYW4gc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7IGxlZnQ6IDMwcHg7IGZvbnQtc2l6ZTogMTJweFwiPiAmbmJzcDt7eyB3ZWVrTnVtYmVycyB9fSA8L3NwYW4+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlLXdlZWtcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zIG5leHQtcm91bmQtYnRuXCIgKGNsaWNrKT1cInByZXZpb3VzV2VlaygpXCI+IG5hdmlnYXRlX25leHQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAjZHBGcm9tRGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IFdlZWtzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiW2NvbmZpZy5jdXN0b21DbGFzcyA9PSAnJyA/ICcnIDogY29uZmlnLmN1c3RvbUNsYXNzXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJkcEZyb21EYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImRhdGVUb0Rpc3BsYXlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJpc0ZvY3VzZWQodHJ1ZSk7IGlzRHJvcGRvd25PcGVuZWRGb3JDYWxlbmRhcihkYXRlcGlja2VyKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktbWVudS1kb3duXCIgKm5nSWY9JyFkYXRlcGlja2VyLmlzT3BlbigpJyAoY2xpY2spPVwiZGF0ZXBpY2tlci5vcGVuKClcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9J21kaSBtZGktbWVudS11cCcgKm5nSWY9XCJkYXRlcGlja2VyLmlzT3BlbigpXCIgKGNsaWNrKT1cImlzRHJvcGRvd25PcGVuZWRGb3JDYWxlbmRhcihkYXRlcGlja2VyKVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29ucyByb3VuZC1idG5cIiAoY2xpY2spPVwibmV4dFdlZWsoKVwiPiBuYXZpZ2F0ZV9uZXh0IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS1NdWx0aXBsZSB3ZWVrIHNlbGVjdC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiAqbmdJZj1cImNvbmZpZy5zZWxlY3RNdWx0aXBsZVdlZWtzXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdWx0aXBsZS13ZWVrc1wiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgI2RwRnJvbURhdGVcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgV2Vla3NcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIltjb25maWcuY3VzdG9tQ2xhc3MgPT0gJycgPyAnJyA6IGNvbmZpZy5jdXN0b21DbGFzc11cIlxyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJkcEZyb21EYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIndlZWtOdW1iZXJzXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaXNGb2N1c2VkKHRydWUpOyBpc0Ryb3Bkb3duT3BlbmVkRm9yQ2FsZW5kYXIoZGF0ZXBpY2tlcilcIlxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiIW11bHRpU2VsZWN0RHJvcGRvd25PcGVuXCIgY2xhc3M9XCJtZGkgbWRpLW1lbnUtZG93biBtdWx0aXNlbGVjdC1pbnB1dC1hcnJvd1wiPjwvaT5cclxuICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwibXVsdGlTZWxlY3REcm9wZG93bk9wZW5cIiBjbGFzcz1cIm1kaSBtZGktbWVudS11cCBtdWx0aXNlbGVjdC1pbnB1dC1hcnJvd1wiPjwvaT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9mb3JtPlxyXG5cclxuPG5nYi1kYXRlcGlja2VyXHJcbiAgICAjd2Vla1BpY2tlclxyXG4gICAgKm5nSWY9XCIhY29uZmlnLnNob3dBc0Ryb3Bkb3duXCJcclxuICAgIFtkaXNwbGF5TW9udGhzXT1cIjFcIlxyXG4gICAgW3N0YXJ0RGF0ZV09XCJmcm9tRGF0ZSFcIlxyXG4gICAgW2ZpcnN0RGF5T2ZXZWVrXT1cImNvbmZpZy5maXJzdERheU9mV2Vla1wiXHJcbiAgICBbc2hvd1dlZWtOdW1iZXJzXT1cImNvbmZpZy5zaG93V2Vla051bWJlcnNcIlxyXG4gICAgW2RheVRlbXBsYXRlXT1cInRcIlxyXG4gICAgW21heERhdGVdPVwibWF4RGF0ZVwiXHJcbiAgICBbbWluRGF0ZV09XCJtaW5EYXRlXCJcclxuICAgIChkYXRlU2VsZWN0KT1cInNlbGVjdFdlZWsoJGV2ZW50KVwiXHJcbiAgICBbbWFya0Rpc2FibGVkXT1cImRpc2FibGVkRnVuY1wiXHJcbj5cclxuPC9uZ2ItZGF0ZXBpY2tlcj5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjZm9vdGVyVGVtcGxhdGU+XHJcbiAgICA8aHIgY2xhc3M9XCJteS0wXCIgLz5cclxuICAgIDxidXR0b25cclxuICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc20gbS0yIGZsb2F0LXJpZ2h0XCJcclxuICAgICAgICAoY2xpY2spPVwiYXBwbHlDaGFuZ2VzKCk7IGNsb3NlRGF0ZXBpY2tlcihkYXRlcGlja2VyKVwiXHJcbiAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjMjY4YmZmOyBjb2xvcjogI2ZmZmZmZlwiXHJcbiAgICA+XHJcbiAgICAgICAgQXBwbHlcclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbSBtLTIgZmxvYXQtcmlnaHRcIlxyXG4gICAgICAgIChjbGljayk9XCJyZXZlcnREYXRlcygpOyBjbG9zZURhdGVwaWNrZXIoZGF0ZXBpY2tlcilcIlxyXG4gICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogcmdiYSgzOCwgMTM5LCAyNTUsIDAuMTIpOyBjb2xvcjogIzI2OGJmZlwiXHJcbiAgICA+XHJcbiAgICAgICAgQ2FuY2VsXHJcbiAgICA8L2J1dHRvbj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjdCBsZXQtZGF0ZSBsZXQtZm9jdXNlZD1cImZvY3VzZWRcIiBsZXQtZGlzYWJsZWQ9XCJkaXNhYmxlZFwiPlxyXG4gICAgPHNwYW5cclxuICAgICAgICBjbGFzcz1cImN1c3RvbS1kYXlcIlxyXG4gICAgICAgIFtjbGFzcy5mb2N1c2VkXT1cImZvY3VzZWRcIlxyXG4gICAgICAgIFtjbGFzcy5yYW5nZV09XCJpc1JhbmdlKGRhdGUpXCJcclxuICAgICAgICBbY2xhc3MuZmFkZWRdPVwiaXNIb3ZlcmVkKGRhdGUpIHx8IGlzSW5zaWRlKGRhdGUpXCJcclxuICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgIChtb3VzZWVudGVyKT1cImhvdmVyZWREYXRlID0gZGF0ZVwiXHJcbiAgICAgICAgKG1vdXNlbGVhdmUpPVwiaG92ZXJlZERhdGUgPSBudWxsXCJcclxuICAgID5cclxuICAgICAgICB7eyBkYXRlLmRheSB9fVxyXG4gICAgPC9zcGFuPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPCEtLVxyXG5cclxuPGhyPlxyXG5cclxuPHByZT5Gcm9tOiB7eyBmcm9tRGF0ZSB8IGpzb24gfX0gPC9wcmU+XHJcbjxwcmU+VG86IHt7IHRvRGF0ZSB8IGpzb24gfX0gPC9wcmU+XHJcbjxwcmU+d2Vla051bWJlcnM6IHt7IHdlZWtOdW1iZXJzIHwganNvbiB9fSA8L3ByZT5cclxuXHJcbi0tPlxyXG4iXX0=
|