@scania-nl/tegel-angular-extensions 0.0.7 → 0.0.9

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.
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Parses an ISO date segment (`YYYY-MM-DD`) into local date parts.
3
+ * @param datePart ISO date segment to parse.
4
+ * @returns Parsed date parts or `null` when invalid.
5
+ */
6
+ export function parseDatePartsFromIso(datePart) {
7
+ if (!datePart)
8
+ return null;
9
+ // Split on the ISO separator and validate expected parts.
10
+ const parts = datePart.split('-');
11
+ if (parts.length !== 3)
12
+ return null;
13
+ // Convert to numbers and normalize month to 0-based.
14
+ const year = parseInt(parts[0], 10);
15
+ const month = parseInt(parts[1], 10) - 1;
16
+ const day = parseInt(parts[2], 10);
17
+ // Reject invalid dates early.
18
+ if (!isValidDateParts(year, month, day))
19
+ return null;
20
+ return { year, month, day };
21
+ }
22
+ /**
23
+ * Validates date parts (0-based month) against calendar limits.
24
+ * @param year Full year value.
25
+ * @param month Zero-based month.
26
+ * @param day Day of month (1-based).
27
+ * @returns `true` when the date exists in the calendar.
28
+ */
29
+ export function isValidDateParts(year, month, day) {
30
+ if (!Number.isFinite(year) ||
31
+ !Number.isFinite(month) ||
32
+ !Number.isFinite(day)) {
33
+ return false;
34
+ }
35
+ // Basic range checks for month/day.
36
+ if (month < 0 || month > 11 || day < 1)
37
+ return false;
38
+ // Ensure the day exists in the target month/year.
39
+ const lastDay = new Date(year, month + 1, 0).getDate();
40
+ return day <= lastDay;
41
+ }
42
+ /**
43
+ * Formats an ISO date/datetime value into `dd-MM-YYYY` display format.
44
+ * @param value ISO date or datetime string.
45
+ * @param mode Formatting mode (`date` or `datetime`).
46
+ * @returns Display-friendly string.
47
+ */
48
+ export function formatDisplayDateTime(value, mode) {
49
+ if (!value) {
50
+ return '';
51
+ }
52
+ if (mode === 'time') {
53
+ return value;
54
+ }
55
+ if (mode === 'datetime') {
56
+ const [datePart, timePart] = value.split('T');
57
+ if (!datePart)
58
+ return value;
59
+ // Expect ISO `YYYY-MM-DD` for the date portion.
60
+ const dateParts = datePart.split('-');
61
+ if (dateParts.length !== 3)
62
+ return value;
63
+ const [year, month, day] = dateParts;
64
+ const formattedDate = `${day}-${month}-${year}`;
65
+ // Preserve time if present.
66
+ if (timePart) {
67
+ return `${formattedDate} ${timePart}`;
68
+ }
69
+ return formattedDate;
70
+ }
71
+ // Date-only mode expects ISO `YYYY-MM-DD`.
72
+ const parts = value.split('-');
73
+ if (parts.length !== 3)
74
+ return value;
75
+ const [year, month, day] = parts;
76
+ return `${day}-${month}-${year}`;
77
+ }
78
+ /**
79
+ * Builds a 6x7 calendar grid for the provided month/year.
80
+ * Includes trailing days from previous/next months to fill the grid.
81
+ * @param currentYear Target year.
82
+ * @param currentMonth Target month (0-based).
83
+ * @param selected Selected date parts or `null`.
84
+ * @param today Reference date for the "today" flag.
85
+ * @returns Calendar day entries for rendering.
86
+ */
87
+ export function buildCalendarDays(currentYear, currentMonth, selected, today) {
88
+ const calendarDays = [];
89
+ const firstDay = new Date(currentYear, currentMonth, 1);
90
+ const lastDay = new Date(currentYear, currentMonth + 1, 0);
91
+ const todayYear = today.getFullYear();
92
+ const todayMonth = today.getMonth();
93
+ const todayDay = today.getDate();
94
+ // Get the day of week for the first day (0 = Sunday, we want Monday = 0).
95
+ let startDay = firstDay.getDay() - 1;
96
+ if (startDay < 0)
97
+ startDay = 6;
98
+ // Helper to flag if a given day is selected.
99
+ const isSelected = (day, month, year) => !!selected &&
100
+ selected.day === day &&
101
+ selected.month === month &&
102
+ selected.year === year;
103
+ // Previous month days
104
+ const prevMonthLastDay = new Date(currentYear, currentMonth, 0).getDate();
105
+ const prevMonth = currentMonth === 0 ? 11 : currentMonth - 1;
106
+ const prevYear = currentMonth === 0 ? currentYear - 1 : currentYear;
107
+ for (let i = startDay - 1; i >= 0; i--) {
108
+ const day = prevMonthLastDay - i;
109
+ calendarDays.push({
110
+ date: day,
111
+ month: prevMonth,
112
+ year: prevYear,
113
+ isCurrentMonth: false,
114
+ isToday: false,
115
+ isSelected: isSelected(day, prevMonth, prevYear),
116
+ });
117
+ }
118
+ // Current month days
119
+ for (let day = 1; day <= lastDay.getDate(); day++) {
120
+ const isToday = day === todayDay &&
121
+ currentMonth === todayMonth &&
122
+ currentYear === todayYear;
123
+ calendarDays.push({
124
+ date: day,
125
+ month: currentMonth,
126
+ year: currentYear,
127
+ isCurrentMonth: true,
128
+ isToday,
129
+ isSelected: isSelected(day, currentMonth, currentYear),
130
+ });
131
+ }
132
+ // Next month days to fill the grid (6 rows x 7 days = 42).
133
+ const remainingDays = 42 - calendarDays.length;
134
+ const nextMonth = currentMonth === 11 ? 0 : currentMonth + 1;
135
+ const nextYear = currentMonth === 11 ? currentYear + 1 : currentYear;
136
+ for (let day = 1; day <= remainingDays; day++) {
137
+ calendarDays.push({
138
+ date: day,
139
+ month: nextMonth,
140
+ year: nextYear,
141
+ isCurrentMonth: false,
142
+ isToday: false,
143
+ isSelected: isSelected(day, nextMonth, nextYear),
144
+ });
145
+ }
146
+ return calendarDays;
147
+ }
148
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFlLWRhdGUtdGltZS1waWNrZXIudXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3RlZ2VsLWFuZ3VsYXItZXh0ZW5zaW9ucy9zcmMvbGliL2NvbXBvbmVudHMvdGFlLWRhdGUtdGltZS1waWNrZXIvdGFlLWRhdGUtdGltZS1waWNrZXIudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBaUJBOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsUUFBZ0I7SUFDcEQsSUFBSSxDQUFDLFFBQVE7UUFBRSxPQUFPLElBQUksQ0FBQztJQUMzQiwwREFBMEQ7SUFDMUQsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRXBDLHFEQUFxRDtJQUNyRCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFbkMsOEJBQThCO0lBQzlCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRXJELE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzlCLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQzlCLElBQVksRUFDWixLQUFhLEVBQ2IsR0FBVztJQUVY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Q2pELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFJlcHJlc2VudHMgYSBub3JtYWxpemVkIGRhdGUgaW4gbG9jYWwgdGltZSAoMC1iYXNlZCBtb250aCkuICovXG5leHBvcnQgdHlwZSBEYXRlUGFydHMgPSB7XG4gIHllYXI6IG51bWJlcjtcbiAgbW9udGg6IG51bWJlcjtcbiAgZGF5OiBudW1iZXI7XG59O1xuXG4vKiogQSBzaW5nbGUgZGF5IGVudHJ5IHVzZWQgYnkgdGhlIGNhbGVuZGFyIGdyaWQgcmVuZGVyZXIuICovXG5leHBvcnQgdHlwZSBDYWxlbmRhckRheSA9IHtcbiAgZGF0ZTogbnVtYmVyO1xuICBtb250aDogbnVtYmVyO1xuICB5ZWFyOiBudW1iZXI7XG4gIGlzQ3VycmVudE1vbnRoOiBib29sZWFuO1xuICBpc1RvZGF5OiBib29sZWFuO1xuICBpc1NlbGVjdGVkOiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBQYXJzZXMgYW4gSVNPIGRhdGUgc2VnbWVudCAoYFlZWVktTU0tRERgKSBpbnRvIGxvY2FsIGRhdGUgcGFydHMuXG4gKiBAcGFyYW0gZGF0ZVBhcnQgSVNPIGRhdGUgc2VnbWVudCB0byBwYXJzZS5cbiAqIEByZXR1cm5zIFBhcnNlZCBkYXRlIHBhcnRzIG9yIGBudWxsYCB3aGVuIGludmFsaWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURhdGVQYXJ0c0Zyb21Jc28oZGF0ZVBhcnQ6IHN0cmluZyk6IERhdGVQYXJ0cyB8IG51bGwge1xuICBpZiAoIWRhdGVQYXJ0KSByZXR1cm4gbnVsbDtcbiAgLy8gU3BsaXQgb24gdGhlIElTTyBzZXBhcmF0b3IgYW5kIHZhbGlkYXRlIGV4cGVjdGVkIHBhcnRzLlxuICBjb25zdCBwYXJ0cyA9IGRhdGVQYXJ0LnNwbGl0KCctJyk7XG4gIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHJldHVybiBudWxsO1xuXG4gIC8vIENvbnZlcnQgdG8gbnVtYmVycyBhbmQgbm9ybWFsaXplIG1vbnRoIHRvIDAtYmFzZWQuXG4gIGNvbnN0IHllYXIgPSBwYXJzZUludChwYXJ0c1swXSwgMTApO1xuICBjb25zdCBtb250aCA9IHBhcnNlSW50KHBhcnRzWzFdLCAxMCkgLSAxO1xuICBjb25zdCBkYXkgPSBwYXJzZUludChwYXJ0c1syXSwgMTApO1xuXG4gIC8vIFJlamVjdCBpbnZhbGlkIGRhdGVzIGVhcmx5LlxuICBpZiAoIWlzVmFsaWREYXRlUGFydHMoeWVhciwgbW9udGgsIGRheSkpIHJldHVybiBudWxsO1xuXG4gIHJldHVybiB7IHllYXIsIG1vbnRoLCBkYXkgfTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgZGF0ZSBwYXJ0cyAoMC1iYXNlZCBtb250aCkgYWdhaW5zdCBjYWxlbmRhciBsaW1pdHMuXG4gKiBAcGFyYW0geWVhciBGdWxsIHllYXIgdmFsdWUuXG4gKiBAcGFyYW0gbW9udGggWmVyby1iYXNlZCBtb250aC5cbiAqIEBwYXJhbSBkYXkgRGF5IG9mIG1vbnRoICgxLWJhc2VkKS5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBkYXRlIGV4aXN0cyBpbiB0aGUgY2FsZW5kYXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRGF0ZVBhcnRzKFxuICB5ZWFyOiBudW1iZXIsXG4gIG1vbnRoOiBudW1iZXIsXG4gIGRheTogbnVtYmVyLFxuKTogYm9vbGVhbiB7XG4gIGlmIChcbiAgICAhTnVtYmVyLmlzRmluaXRlKHllYXIpIHx8XG4gICAgIU51bWJlci5pc0Zpbml0ZShtb250aCkgfHxcbiAgICAhTnVtYmVyLmlzRmluaXRlKGRheSlcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIEJhc2ljIHJhbmdlIGNoZWNrcyBmb3IgbW9udGgvZGF5LlxuICBpZiAobW9udGggPCAwIHx8IG1vbnRoID4gMTEgfHwgZGF5IDwgMSkgcmV0dXJuIGZhbHNlO1xuICAvLyBFbnN1cmUgdGhlIGRheSBleGlzdHMgaW4gdGhlIHRhcmdldCBtb250aC95ZWFyLlxuICBjb25zdCBsYXN0RGF5ID0gbmV3IERhdGUoeWVhciwgbW9udGggKyAxLCAwKS5nZXREYXRlKCk7XG4gIHJldHVybiBkYXkgPD0gbGFzdERheTtcbn1cblxuLyoqXG4gKiBGb3JtYXRzIGFuIElTTyBkYXRlL2RhdGV0aW1lIHZhbHVlIGludG8gYGRkLU1NLVlZWVlgIGRpc3BsYXkgZm9ybWF0LlxuICogQHBhcmFtIHZhbHVlIElTTyBkYXRlIG9yIGRhdGV0aW1lIHN0cmluZy5cbiAqIEBwYXJhbSBtb2RlIEZvcm1hdHRpbmcgbW9kZSAoYGRhdGVgIG9yIGBkYXRldGltZWApLlxuICogQHJldHVybnMgRGlzcGxheS1mcmllbmRseSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREaXNwbGF5RGF0ZVRpbWUoXG4gIHZhbHVlOiBzdHJpbmcsXG4gIG1vZGU6ICdkYXRlJyB8ICdkYXRldGltZScgfCAndGltZScsXG4pOiBzdHJpbmcge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKG1vZGUgPT09ICd0aW1lJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGlmIChtb2RlID09PSAnZGF0ZXRpbWUnKSB7XG4gICAgY29uc3QgW2RhdGVQYXJ0LCB0aW1lUGFydF0gPSB2YWx1ZS5zcGxpdCgnVCcpO1xuICAgIGlmICghZGF0ZVBhcnQpIHJldHVybiB2YWx1ZTtcblxuICAgIC8vIEV4cGVjdCBJU08gYFlZWVktTU0tRERgIGZvciB0aGUgZGF0ZSBwb3J0aW9uLlxuICAgIGNvbnN0IGRhdGVQYXJ0cyA9IGRhdGVQYXJ0LnNwbGl0KCctJyk7XG4gICAgaWYgKGRhdGVQYXJ0cy5sZW5ndGggIT09IDMpIHJldHVybiB2YWx1ZTtcblxuICAgIGNvbnN0IFt5ZWFyLCBtb250aCwgZGF5XSA9IGRhdGVQYXJ0cztcbiAgICBjb25zdCBmb3JtYXR0ZWREYXRlID0gYCR7ZGF5fS0ke21vbnRofS0ke3llYXJ9YDtcblxuICAgIC8vIFByZXNlcnZlIHRpbWUgaWYgcHJlc2VudC5cbiAgICBpZiAodGltZVBhcnQpIHtcbiAgICAgIHJldHVybiBgJHtmb3JtYXR0ZWREYXRlfSAke3RpbWVQYXJ0fWA7XG4gICAgfVxuICAgIHJldHVybiBmb3JtYXR0ZWREYXRlO1xuICB9XG5cbiAgLy8gRGF0ZS1vbmx5IG1vZGUgZXhwZWN0cyBJU08gYFlZWVktTU0tRERgLlxuICBjb25zdCBwYXJ0cyA9IHZhbHVlLnNwbGl0KCctJyk7XG4gIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHJldHVybiB2YWx1ZTtcblxuICBjb25zdCBbeWVhciwgbW9udGgsIGRheV0gPSBwYXJ0cztcbiAgcmV0dXJuIGAke2RheX0tJHttb250aH0tJHt5ZWFyfWA7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgNng3IGNhbGVuZGFyIGdyaWQgZm9yIHRoZSBwcm92aWRlZCBtb250aC95ZWFyLlxuICogSW5jbHVkZXMgdHJhaWxpbmcgZGF5cyBmcm9tIHByZXZpb3VzL25leHQgbW9udGhzIHRvIGZpbGwgdGhlIGdyaWQuXG4gKiBAcGFyYW0gY3VycmVudFllYXIgVGFyZ2V0IHllYXIuXG4gKiBAcGFyYW0gY3VycmVudE1vbnRoIFRhcmdldCBtb250aCAoMC1iYXNlZCkuXG4gKiBAcGFyYW0gc2VsZWN0ZWQgU2VsZWN0ZWQgZGF0ZSBwYXJ0cyBvciBgbnVsbGAuXG4gKiBAcGFyYW0gdG9kYXkgUmVmZXJlbmNlIGRhdGUgZm9yIHRoZSBcInRvZGF5XCIgZmxhZy5cbiAqIEByZXR1cm5zIENhbGVuZGFyIGRheSBlbnRyaWVzIGZvciByZW5kZXJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENhbGVuZGFyRGF5cyhcbiAgY3VycmVudFllYXI6IG51bWJlcixcbiAgY3VycmVudE1vbnRoOiBudW1iZXIsXG4gIHNlbGVjdGVkOiBEYXRlUGFydHMgfCBudWxsLFxuICB0b2RheTogRGF0ZSxcbik6IENhbGVuZGFyRGF5W10ge1xuICBjb25zdCBjYWxlbmRhckRheXM6IENhbGVuZGFyRGF5W10gPSBbXTtcblxuICBjb25zdCBmaXJzdERheSA9IG5ldyBEYXRlKGN1cnJlbnRZZWFyLCBjdXJyZW50TW9udGgsIDEpO1xuICBjb25zdCBsYXN0RGF5ID0gbmV3IERhdGUoY3VycmVudFllYXIsIGN1cnJlbnRNb250aCArIDEsIDApO1xuICBjb25zdCB0b2RheVllYXIgPSB0b2RheS5nZXRGdWxsWWVhcigpO1xuICBjb25zdCB0b2RheU1vbnRoID0gdG9kYXkuZ2V0TW9udGgoKTtcbiAgY29uc3QgdG9kYXlEYXkgPSB0b2RheS5nZXREYXRlKCk7XG5cbiAgLy8gR2V0IHRoZSBkYXkgb2Ygd2VlayBmb3IgdGhlIGZpcnN0IGRheSAoMCA9IFN1bmRheSwgd2Ugd2FudCBNb25kYXkgPSAwKS5cbiAgbGV0IHN0YXJ0RGF5ID0gZmlyc3REYXkuZ2V0RGF5KCkgLSAxO1xuICBpZiAoc3RhcnREYXkgPCAwKSBzdGFydERheSA9IDY7XG5cbiAgLy8gSGVscGVyIHRvIGZsYWcgaWYgYSBnaXZlbiBkYXkgaXMgc2VsZWN0ZWQuXG4gIGNvbnN0IGlzU2VsZWN0ZWQgPSAoZGF5OiBudW1iZXIsIG1vbnRoOiBudW1iZXIsIHllYXI6IG51bWJlcik6IGJvb2xlYW4gPT5cbiAgICAhIXNlbGVjdGVkICYmXG4gICAgc2VsZWN0ZWQuZGF5ID09PSBkYXkgJiZcbiAgICBzZWxlY3RlZC5tb250aCA9PT0gbW9udGggJiZcbiAgICBzZWxlY3RlZC55ZWFyID09PSB5ZWFyO1xuXG4gIC8vIFByZXZpb3VzIG1vbnRoIGRheXNcbiAgY29uc3QgcHJldk1vbnRoTGFzdERheSA9IG5ldyBEYXRlKGN1cnJlbnRZZWFyLCBjdXJyZW50TW9udGgsIDApLmdldERhdGUoKTtcbiAgY29uc3QgcHJldk1vbnRoID0gY3VycmVudE1vbnRoID09PSAwID8gMTEgOiBjdXJyZW50TW9udGggLSAxO1xuICBjb25zdCBwcmV2WWVhciA9IGN1cnJlbnRNb250aCA9PT0gMCA/IGN1cnJlbnRZZWFyIC0gMSA6IGN1cnJlbnRZZWFyO1xuICBmb3IgKGxldCBpID0gc3RhcnREYXkgLSAxOyBpID49IDA7IGktLSkge1xuICAgIGNvbnN0IGRheSA9IHByZXZNb250aExhc3REYXkgLSBpO1xuICAgIGNhbGVuZGFyRGF5cy5wdXNoKHtcbiAgICAgIGRhdGU6IGRheSxcbiAgICAgIG1vbnRoOiBwcmV2TW9udGgsXG4gICAgICB5ZWFyOiBwcmV2WWVhcixcbiAgICAgIGlzQ3VycmVudE1vbnRoOiBmYWxzZSxcbiAgICAgIGlzVG9kYXk6IGZhbHNlLFxuICAgICAgaXNTZWxlY3RlZDogaXNTZWxlY3RlZChkYXksIHByZXZNb250aCwgcHJldlllYXIpLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gQ3VycmVudCBtb250aCBkYXlzXG4gIGZvciAobGV0IGRheSA9IDE7IGRheSA8PSBsYXN0RGF5LmdldERhdGUoKTsgZGF5KyspIHtcbiAgICBjb25zdCBpc1RvZGF5ID1cbiAgICAgIGRheSA9PT0gdG9kYXlEYXkgJiZcbiAgICAgIGN1cnJlbnRNb250aCA9PT0gdG9kYXlNb250aCAmJlxuICAgICAgY3VycmVudFllYXIgPT09IHRvZGF5WWVhcjtcbiAgICBjYWxlbmRhckRheXMucHVzaCh7XG4gICAgICBkYXRlOiBkYXksXG4gICAgICBtb250aDogY3VycmVudE1vbnRoLFxuICAgICAgeWVhcjogY3VycmVudFllYXIsXG4gICAgICBpc0N1cnJlbnRNb250aDogdHJ1ZSxcbiAgICAgIGlzVG9kYXksXG4gICAgICBpc1NlbGVjdGVkOiBpc1NlbGVjdGVkKGRheSwgY3VycmVudE1vbnRoLCBjdXJyZW50WWVhciksXG4gICAgfSk7XG4gIH1cblxuICAvLyBOZXh0IG1vbnRoIGRheXMgdG8gZmlsbCB0aGUgZ3JpZCAoNiByb3dzIHggNyBkYXlzID0gNDIpLlxuICBjb25zdCByZW1haW5pbmdEYXlzID0gNDIgLSBjYWxlbmRhckRheXMubGVuZ3RoO1xuICBjb25zdCBuZXh0TW9udGggPSBjdXJyZW50TW9udGggPT09IDExID8gMCA6IGN1cnJlbnRNb250aCArIDE7XG4gIGNvbnN0IG5leHRZZWFyID0gY3VycmVudE1vbnRoID09PSAxMSA/IGN1cnJlbnRZZWFyICsgMSA6IGN1cnJlbnRZZWFyO1xuICBmb3IgKGxldCBkYXkgPSAxOyBkYXkgPD0gcmVtYWluaW5nRGF5czsgZGF5KyspIHtcbiAgICBjYWxlbmRhckRheXMucHVzaCh7XG4gICAgICBkYXRlOiBkYXksXG4gICAgICBtb250aDogbmV4dE1vbnRoLFxuICAgICAgeWVhcjogbmV4dFllYXIsXG4gICAgICBpc0N1cnJlbnRNb250aDogZmFsc2UsXG4gICAgICBpc1RvZGF5OiBmYWxzZSxcbiAgICAgIGlzU2VsZWN0ZWQ6IGlzU2VsZWN0ZWQoZGF5LCBuZXh0TW9udGgsIG5leHRZZWFyKSxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBjYWxlbmRhckRheXM7XG59XG4iXX0=
@@ -0,0 +1,38 @@
1
+ /* eslint-disable @angular-eslint/directive-selector */
2
+ import { Directive, input } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Directive that provides typed context for an `ng-template`.
6
+ *
7
+ * This is a compile-time helper: it does not affect runtime behavior,
8
+ * but it allows Angular's template type checker to infer the template context.
9
+ *
10
+ * Usage:
11
+ * ```html
12
+ * <ng-template #tpl let-data [typedContext]="someContext">...</ng-template>
13
+ * ```
14
+ */
15
+ export class TypedTemplateDirective {
16
+ /**
17
+ * Typed context value used only for type inference.
18
+ * This input is not read at runtime.
19
+ */
20
+ typedContext = input.required();
21
+ /**
22
+ * Template context guard to inform Angular's template type system.
23
+ * Always returns `true` at runtime; used purely for typing.
24
+ */
25
+ static ngTemplateContextGuard(dir, ctx) {
26
+ return true;
27
+ }
28
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: TypedTemplateDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
29
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.17", type: TypedTemplateDirective, isStandalone: true, selector: "ng-template[typedContext]", inputs: { typedContext: { classPropertyName: "typedContext", publicName: "typedContext", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 });
30
+ }
31
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: TypedTemplateDirective, decorators: [{
32
+ type: Directive,
33
+ args: [{
34
+ selector: 'ng-template[typedContext]',
35
+ standalone: true,
36
+ }]
37
+ }] });
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWQtdGVtcGxhdGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy90ZWdlbC1hbmd1bGFyLWV4dGVuc2lvbnMvc3JjL2xpYi9kaXJlY3RpdmVzL3R5cGVkLXRlbXBsYXRlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLFNBQVMsRUFBZSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRTlEOzs7Ozs7Ozs7O0dBVUc7QUFLSCxNQUFNLE9BQU8sc0JBQXNCO0lBQ2pDOzs7T0FHRztJQUNNLFlBQVksR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFrQixDQUFDO0lBRXpEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxzQkFBc0IsQ0FDM0IsR0FBOEIsRUFDOUIsR0FBWTtRQUVaLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzt3R0FoQlUsc0JBQXNCOzRGQUF0QixzQkFBc0I7OzRGQUF0QixzQkFBc0I7a0JBSmxDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLDJCQUEyQjtvQkFDckMsVUFBVSxFQUFFLElBQUk7aUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1zZWxlY3RvciAqL1xuaW1wb3J0IHsgRGlyZWN0aXZlLCBUZW1wbGF0ZVJlZiwgaW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBEaXJlY3RpdmUgdGhhdCBwcm92aWRlcyB0eXBlZCBjb250ZXh0IGZvciBhbiBgbmctdGVtcGxhdGVgLlxuICpcbiAqIFRoaXMgaXMgYSBjb21waWxlLXRpbWUgaGVscGVyOiBpdCBkb2VzIG5vdCBhZmZlY3QgcnVudGltZSBiZWhhdmlvcixcbiAqIGJ1dCBpdCBhbGxvd3MgQW5ndWxhcidzIHRlbXBsYXRlIHR5cGUgY2hlY2tlciB0byBpbmZlciB0aGUgdGVtcGxhdGUgY29udGV4dC5cbiAqXG4gKiBVc2FnZTpcbiAqIGBgYGh0bWxcbiAqIDxuZy10ZW1wbGF0ZSAjdHBsIGxldC1kYXRhIFt0eXBlZENvbnRleHRdPVwic29tZUNvbnRleHRcIj4uLi48L25nLXRlbXBsYXRlPlxuICogYGBgXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ25nLXRlbXBsYXRlW3R5cGVkQ29udGV4dF0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBUeXBlZFRlbXBsYXRlRGlyZWN0aXZlPFQ+IHtcbiAgLyoqXG4gICAqIFR5cGVkIGNvbnRleHQgdmFsdWUgdXNlZCBvbmx5IGZvciB0eXBlIGluZmVyZW5jZS5cbiAgICogVGhpcyBpbnB1dCBpcyBub3QgcmVhZCBhdCBydW50aW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZWRDb250ZXh0ID0gaW5wdXQucmVxdWlyZWQ8VGVtcGxhdGVSZWY8VD4+KCk7XG5cbiAgLyoqXG4gICAqIFRlbXBsYXRlIGNvbnRleHQgZ3VhcmQgdG8gaW5mb3JtIEFuZ3VsYXIncyB0ZW1wbGF0ZSB0eXBlIHN5c3RlbS5cbiAgICogQWx3YXlzIHJldHVybnMgYHRydWVgIGF0IHJ1bnRpbWU7IHVzZWQgcHVyZWx5IGZvciB0eXBpbmcuXG4gICAqL1xuICBzdGF0aWMgbmdUZW1wbGF0ZUNvbnRleHRHdWFyZDxUPihcbiAgICBkaXI6IFR5cGVkVGVtcGxhdGVEaXJlY3RpdmU8VD4sXG4gICAgY3R4OiB1bmtub3duLFxuICApOiBjdHggaXMgeyAkaW1wbGljaXQ6IFQgfSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbiJdfQ==
@@ -1,5 +1,6 @@
1
1
  import { inject, Injectable, InjectionToken, makeEnvironmentProviders, provideAppInitializer, } from '@angular/core';
2
- import { catchError, defer, firstValueFrom, from, map, of, switchMap, tap, } from 'rxjs';
2
+ import { catchError, defer, firstValueFrom, from, map, of, switchMap, tap, throwError, } from 'rxjs';
3
+ import { fromFetch } from 'rxjs/fetch';
3
4
  import { parseEnvFile } from '../core/parse-env-file';
4
5
  import * as i0 from "@angular/core";
5
6
  /**
@@ -62,13 +63,14 @@ export function provideRuntimeConfig(kit, staticEnv, { envPath = '/env/runtime.e
62
63
  * Returns an `Observable<ConfigShape>` and caches the final result.
63
64
  */
64
65
  load() {
65
- return defer(() => from(fetch(envPath).then((res) => {
66
+ return defer(() => fromFetch(envPath).pipe(switchMap((res) => {
66
67
  // Handle HTTP errors explicitly so they go through catchError
67
68
  if (!res.ok) {
68
- throw new Error(`Failed to load runtime config: ${res.status} ${res.statusText}`);
69
+ return throwError(() => new Error(`Failed to load runtime config: ${res.status} ${res.statusText}`));
69
70
  }
71
+ // Response.text() returns a Promise, which switchMap can handle
70
72
  return res.text();
71
- })).pipe(
73
+ }),
72
74
  // 1. SPA fallback guard (server returned HTML instead of .env)
73
75
  map((raw) => {
74
76
  const trimmed = raw.trim();
@@ -158,4 +160,4 @@ export function provideRuntimeConfig(kit, staticEnv, { envPath = '/env/runtime.e
158
160
  },
159
161
  ]);
160
162
  }
161
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZS1ydW50aW1lLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdGVnZWwtYW5ndWxhci1leHRlbnNpb25zL3NyYy9saWIvZW52L2FuZ3VsYXIvcHJvdmlkZS1ydW50aW1lLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsTUFBTSxFQUNOLFVBQVUsRUFDVixjQUFjLEVBQ2Qsd0JBQXdCLEVBQ3hCLHFCQUFxQixHQUN0QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsVUFBVSxFQUNWLEtBQUssRUFDTCxjQUFjLEVBQ2QsSUFBSSxFQUNKLEdBQUcsRUFFSCxFQUFFLEVBQ0YsU0FBUyxFQUNULEdBQUcsR0FDSixNQUFNLE1BQU0sQ0FBQztBQUdkLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFFdEQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQVcsRUFBa0MsRUFBRSxDQUFDO0lBQzlELHNCQUFzQixHQUFHLEdBQUc7SUFDNUIsYUFBYTtJQUNiLEVBQUU7Q0FDSCxDQUFDO0FBa0NGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBSWxDLEdBQWlCLEVBQ2pCLFNBQThCLEVBQzlCLEVBQ0UsT0FBTyxHQUFHLGtCQUFrQixFQUM1QixLQUFLLEdBQUcsS0FBSyxFQUNiLFdBQVcsR0FBRyxJQUFJLEVBQ2xCLEtBQUssTUFDNkIsRUFBRTtJQUt0QyxnRUFBZ0U7SUFDaEUsTUFBTSxXQUFXLEdBQUcsS0FBSyxJQUFJLElBQUksY0FBYyxDQUFZLFlBQVksQ0FBQyxDQUFDO0lBRXpFOzs7T0FHRztJQUNILE1BQ00sb0JBQW9CO1FBQ3hCLGtEQUFrRDtRQUMxQyxNQUFNLENBQWE7UUFFM0I7OztXQUdHO1FBQ0gsSUFBSTtZQUNGLE9BQU8s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LE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRTtTQUNyRDtLQUNGLENBQUMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW52aXJvbm1lbnRQcm92aWRlcnMsXG4gIGluamVjdCxcbiAgSW5qZWN0YWJsZSxcbiAgSW5qZWN0aW9uVG9rZW4sXG4gIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyxcbiAgcHJvdmlkZUFwcEluaXRpYWxpemVyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIGNhdGNoRXJyb3IsXG4gIGRlZmVyLFxuICBmaXJzdFZhbHVlRnJvbSxcbiAgZnJvbSxcbiAgbWFwLFxuICBPYnNlcnZhYmxlLFxuICBvZixcbiAgc3dpdGNoTWFwLFxuICB0YXAsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHogZnJvbSAnem9kJztcbmltcG9ydCB7IEVudktpdCwgU2NoZW1hT3V0cHV0LCBTdGF0aWNFbnZGcm9tIH0gZnJvbSAnLi4vY29yZS9lbnYtdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VFbnZGaWxlIH0gZnJvbSAnLi4vY29yZS9wYXJzZS1lbnYtZmlsZSc7XG5cbi8qKlxuICogQnVpbGRzIHN0eWxlZCBjb25zb2xlIGFyZ3VtZW50cyBmb3IgUnVudGltZUNvbmZpZyBsb2dzLlxuICpcbiAqIFRoZSByZXR1cm5lZCB0dXBsZSBjYW4gYmUgc3ByZWFkIGRpcmVjdGx5IGludG8gYGNvbnNvbGUubG9nYCxcbiAqIGFsbG93aW5nIHRoZSBicm93c2VyIHRvIHJlbmRlciBhIGNvbG9yZWQgYFtSdW50aW1lQ29uZmlnXWAgcHJlZml4XG4gKiB3aGlsZSBwcmVzZXJ2aW5nIHRoZSBvcmlnaW5hbCBjYWxsZXIgbG9jYXRpb24gaW4gRGV2VG9vbHMuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHRzXG4gKiBjb25zb2xlLmxvZyguLi5yY0FyZ3MoJ1J1bnRpbWUgb3ZlcnJpZGVzIGxvYWRlZC4nKSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdGV4dCB0byBhcHBlbmQgYWZ0ZXIgdGhlIGNvbG9yZWQgcHJlZml4LlxuICogQHJldHVybnMgQSB0dXBsZSBvZiBhcmd1bWVudHMgKGBbZm9ybWF0LCBzdHlsZSwgcmVzZXRdYCkgZm9yIGBjb25zb2xlLmxvZ2AuXG4gKi9cbmNvbnN0IHJjQXJncyA9IChtc2c6IHN0cmluZyk6IFBhcmFtZXRlcnM8dHlwZW9mIGNvbnNvbGUubG9nPiA9PiBbXG4gICclY1tSdW50aW1lQ29uZmlnXSVjICcgKyBtc2csXG4gICdjb2xvcjojMGNmOycsXG4gICcnLFxuXTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb25maWd1cmluZyB0aGUgQW5ndWxhciBydW50aW1lLWNvbmZpZyBwcm92aWRlci5cbiAqXG4gKiBAcHJvcGVydHkgZW52UGF0aFxuICogVGhlIFVSTCAob3IgcGF0aCkgdG8gdGhlIHJ1bnRpbWUgYC5lbnZgIGZpbGUgdGhhdCB3aWxsIGJlIGZldGNoZWQgYXQgYXBwIHN0YXJ0LlxuICogRGVmYXVsdHMgdG8gYFwiL2Vudi9ydW50aW1lLmVudlwiYC5cbiAqXG4gKiBAcHJvcGVydHkgZGVidWdcbiAqIEVuYWJsZXMgdmVyYm9zZSBjb25zb2xlIGxvZ2dpbmcgd2hlbiBgdHJ1ZWAuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gKlxuICogQHByb3BlcnR5IHN0b3BPbkVycm9yXG4gKiBJZiBgdHJ1ZWAsIGFueSBmYWlsdXJlIHdoaWxlIGxvYWRpbmcvcGFyc2luZy92YWxpZGF0aW5nIHRoZSBydW50aW1lIGNvbmZpZ1xuICogd2lsbCByZWplY3QgdGhlIGFwcCBpbml0aWFsaXplciBhbmQgKiphYm9ydCBib290KiogKHJlY29tbWVuZGVkIGZvciBwcm9kKS5cbiAqIElmIGBmYWxzZWAsIHRoZSBwcm92aWRlciBmYWxscyBiYWNrIHRvIHRoZSBzdGF0aWMgZW52aXJvbm1lbnQgb25seS5cbiAqIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAqXG4gKiBAcHJvcGVydHkgdG9rZW5cbiAqIE9wdGlvbmFsIGBJbmplY3Rpb25Ub2tlbmAgdXNlZCB0byBleHBvc2UgdGhlIHZhbGlkYXRlZCBjb25maWd1cmF0aW9uXG4gKiB2aWEgQW5ndWxhciBkZXBlbmRlbmN5IGluamVjdGlvbi4gSWYgb21pdHRlZCwgdGhlIHByb3ZpZGVyIHdpbGwgY3JlYXRlIG9uZVxuICogYXV0b21hdGljYWxseSBuYW1lZCBgRU5WX0NPTkZJR2AuXG4gKi9cbmludGVyZmFjZSBQcm92aWRlUnVudGltZUNvbmZpZ09wdGlvbnM8UyBleHRlbmRzIHouWm9kT2JqZWN0PHouWm9kUmF3U2hhcGU+PiB7XG4gIC8qKiBQYXRoIHRvIHRoZSBydW50aW1lIGVudiBmaWxlIChkZWZhdWx0OiAvZW52L3J1bnRpbWUuZW52KSAqL1xuICBlbnZQYXRoPzogc3RyaW5nO1xuICAvKiogTG9nIGRlYnVnIGluZm8gdG8gY29uc29sZSAqL1xuICBkZWJ1Zz86IGJvb2xlYW47XG4gIC8qKiBUaHJvdyBvbiBlcnJvciB0byBzdG9wIGFwcCBib290IChkZWZhdWx0OiB0cnVlKSAqL1xuICBzdG9wT25FcnJvcj86IGJvb2xlYW47XG4gIC8qKiBJbmplY3Rpb24gdG9rZW4gdXNlZCB0byBwcm92aWRlIHRoZSB2YWxpZGF0ZWQgY29uZmlnIHZpYSBBbmd1bGFyIERJICovXG4gIHRva2VuPzogSW5qZWN0aW9uVG9rZW48U2NoZW1hT3V0cHV0PFM+Pjtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgcHJvdmlkZXJzIHRoYXQ6XG4gKiAtIEZldGNoIGEgcnVudGltZSBgLmVudmAgZmlsZSBhdCBzdGFydHVwLFxuICogLSBQYXJzZSBpdCB0byBhIGRlZXAtcGFydGlhbCBzdHJ1Y3R1cmUgdmlhIHRoZSBraXQsXG4gKiAtIEVuZm9yY2UgcnVudGltZS1yZXF1aXJlZCBrZXlzIHdoZW4gYXBwcm9wcmlhdGUsXG4gKiAtIE1lcmdlIHdpdGggdGhlIHN0YXRpYyBlbnZpcm9ubWVudCxcbiAqIC0gVmFsaWRhdGUgdGhlICoqZmluYWwqKiBjb25maWd1cmF0aW9uIGFnYWluc3QgdGhlIFpvZCBzY2hlbWEsXG4gKiAtIEV4cG9zZSB0aGUgcmVzdWx0aW5nIGNvbmZpZyB2aWEgYSBnZW5lcmF0ZWQgYEluamVjdGlvblRva2VuYC5cbiAqXG4gKiBAdHlwZVBhcmFtIFMgLSBab2Qgc2NoZW1hIHR5cGUgZGVzY3JpYmluZyB0aGUgZnVsbCBjb25maWcgc2hhcGUuXG4gKiBAdHlwZVBhcmFtIEsgLSBMaXN0IG9mIHJ1bnRpbWUtcmVxdWlyZWQgdG9wLWxldmVsIGtleXMuXG4gKlxuICogQHBhcmFtIGtpdFxuICogVGhlIGBFbnZLaXRgIGNyZWF0ZWQgYnkgYGNyZWF0ZUVudktpdChzY2hlbWEsIHJ1bnRpbWVSZXF1aXJlZEtleXMpYC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogUnVudGltZSBsb2FkaW5nIGJlaGF2aW9yIGFuZCBESSB0b2tlbiBkZXNjcmlwdGlvbi4gU2VlIHtAbGluayBQcm92aWRlUnVudGltZUNvbmZpZ09wdGlvbnN9LlxuICpcbiAqIEByZXR1cm5zIFRoZSBgRW52aXJvbm1lbnRQcm92aWRlcnNgIHRvIGJlIGFkZGVkIHRvIGBhcHBDb25maWcucHJvdmlkZXJzYCxcbiAqXG4gKiBAcmVtYXJrc1xuICogLSBUaGlzIHVzZXMgYW4gQW5ndWxhciAqKmZ1bmN0aW9uYWwgYXBwIGluaXRpYWxpemVyKiogdG8gcGVyZm9ybSB0aGUgbG9hZCBzdGVwLlxuICogLSBJZiB0aGUgc2VydmVyIHJldHVybnMgYW4gSFRNTCBTUEEgZmFsbGJhY2sgKGluc3RlYWQgb2YgdGhlIGAuZW52YCBmaWxlKSwgdGhlIHByb3ZpZGVyXG4gKiAgIHF1aWV0bHkgdXNlcyB0aGUgc3RhdGljIGVudmlyb25tZW50IChubyBydW50aW1lIG92ZXJyaWRlcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlUnVudGltZUNvbmZpZzxcbiAgUyBleHRlbmRzIHouWm9kT2JqZWN0PHouWm9kUmF3U2hhcGU+LFxuICBLIGV4dGVuZHMgcmVhZG9ubHkgKGtleW9mIHoub3V0cHV0PFM+KVtdXG4+KFxuICBraXQ6IEVudktpdDxTLCBLPixcbiAgc3RhdGljRW52OiBTdGF0aWNFbnZGcm9tPFMsIEs+LFxuICB7XG4gICAgZW52UGF0aCA9ICcvZW52L3J1bnRpbWUuZW52JyxcbiAgICBkZWJ1ZyA9IGZhbHNlLFxuICAgIHN0b3BPbkVycm9yID0gdHJ1ZSxcbiAgICB0b2tlbixcbiAgfTogUHJvdmlkZVJ1bnRpbWVDb25maWdPcHRpb25zPFM+ID0ge31cbik6IEVudmlyb25tZW50UHJvdmlkZXJzIHtcbiAgLy8gVGhlIHZhbGlkYXRlZCBjb25maWcgdHlwZSBkZXJpdmVkIGZyb20gdGhlIHNjaGVtYS5cbiAgdHlwZSBFbnZDb25maWcgPSBTY2hlbWFPdXRwdXQ8Uz47XG5cbiAgLy8gVHlwZWQgdG9rZW4gdXNlZCB0byBleHBvc2UgdGhlIGZpbmFsIHZhbGlkYXRlZCBjb25maWcgdmlhIERJLlxuICBjb25zdCBjb25maWdUb2tlbiA9IHRva2VuID8/IG5ldyBJbmplY3Rpb25Ub2tlbjxFbnZDb25maWc+KCdFTlZfQ09ORklHJyk7XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIgc2VydmljZSB0aGF0IGhhbmRsZXMgZmV0Y2hpbmcsIHBhcnNpbmcsIHZhbGlkYXRpbmcsIGFuZCBjYWNoaW5nXG4gICAqIG9mIHRoZSBydW50aW1lIGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuICBjbGFzcyBSdW50aW1lQ29uZmlnU2VydmljZSB7XG4gICAgLy8gQ2FjaGVkIGluc3RhbmNlIG9mIHRoZSB2YWxpZGF0ZWQgY29uZmlndXJhdGlvbi5cbiAgICBwcml2YXRlIGNvbmZpZz86IEVudkNvbmZpZztcblxuICAgIC8qKlxuICAgICAqIExvYWRzLCBwYXJzZXMsIG1lcmdlcyBhbmQgdmFsaWRhdGVzIHRoZSBydW50aW1lIGNvbmZpZ3VyYXRpb24uXG4gICAgICogUmV0dXJucyBhbiBgT2JzZXJ2YWJsZTxDb25maWdTaGFwZT5gIGFuZCBjYWNoZXMgdGhlIGZpbmFsIHJlc3VsdC5cbiAgICAgKi9cbiAgICBsb2FkKCk6IE9ic2VydmFibGU8RW52Q29uZmlnPiB7XG4gICAgICByZXR1cm4gZGVmZXIoKCkgPT5cbiAgICAgICAgZnJvbShcbiAgICAgICAgICBmZXRjaChlbnZQYXRoKS50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBIVFRQIGVycm9ycyBleHBsaWNpdGx5IHNvIHRoZXkgZ28gdGhyb3VnaCBjYXRjaEVycm9yXG4gICAgICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHJ1bnRpbWUgY29uZmlnOiAke3Jlcy5zdGF0dXN9ICR7cmVzLnN0YXR1c1RleHR9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcy50ZXh0KCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKS5waXBlKFxuICAgICAgICAgIC8vIDEuIFNQQSBmYWxsYmFjayBndWFyZCAoc2VydmVyIHJldHVybmVkIEhUTUwgaW5zdGVhZCBvZiAuZW52KVxuICAgICAgICAgIG1hcCgocmF3OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRyaW1tZWQgPSByYXcudHJpbSgpO1xuICAgICAgICAgICAgY29uc3QgbG9va3NIdG1sID1cbiAgICAgICAgICAgICAgL15cXHMqPCFkb2N0eXBlL2kudGVzdCh0cmltbWVkKSB8fCAvXlxccyo8aHRtbFtcXHM+XS9pLnRlc3QodHJpbW1lZCk7XG4gICAgICAgICAgICBpZiAobG9va3NIdG1sKSB7XG4gICAgICAgICAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgLi4ucmNBcmdzKFxuICAgICAgICAgICAgICAgICAgICAnTm8gcnVudGltZSBlbnZpcm9ubWVudCBmaWxlIGRldGVjdGVkLCB1c2luZyBzdGF0aWMgZW52aXJvbm1lbnQgb25seS4nXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBTaWduYWwg4oCcbm8gcnVudGltZS5lbnYsIHVzZSBzdGF0aWMgb25seeKAnVxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByYXc7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgdGFwKCh2OiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWRlYnVnKSByZXR1cm47XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgLi4ucmNBcmdzKFxuICAgICAgICAgICAgICAgIHYgPT09IG51bGxcbiAgICAgICAgICAgICAgICAgID8gJ05vIHJ1bnRpbWUgZW52aXJvbm1lbnQgZmlsZSBkZWZpbmVkLCB1c2luZyBzdGF0aWMgZW52aXJvbm1lbnQnXG4gICAgICAgICAgICAgICAgICA6ICdSdW50aW1lIGVudmlyb25tZW50IGZpbGUgbG9hZGVkLCBhcHBseWluZyBvdmVycmlkZXMuJ1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIC8vIDIuIEVpdGhlciBjb250aW51ZSB0aGUgcGlwZSBvciByZXR1cm4gZGVmYXVsdHNcbiAgICAgICAgICBzd2l0Y2hNYXAoKHJhdzogc3RyaW5nIHwgbnVsbCk6IE9ic2VydmFibGU8RW52Q29uZmlnPiA9PiB7XG4gICAgICAgICAgICBpZiAocmF3ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmcm9tKGtpdC5tZXJnZUFuZFZhbGlkYXRlQXN5bmMoc3RhdGljRW52KSkucGlwZShcbiAgICAgICAgICAgICAgICB0YXAoKGNmZykgPT4gKHRoaXMuY29uZmlnID0gY2ZnKSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gMy4gUGFyc2UgcmF3IGAuZW52YCB0ZXh0IC0+IG9iamVjdCwgdGhlbiBkZWVwLXBhcnRpYWwtcGFyc2UgdmlhIGtpdFxuICAgICAgICAgICAgY29uc3QgcnVudGltZUNvbmZpZ1JhdzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBwYXJzZUVudkZpbGUocmF3KTtcbiAgICAgICAgICAgIHJldHVybiBmcm9tKGtpdC5wYXJzZVJ1bnRpbWVPdmVycmlkZXNBc3luYyhydW50aW1lQ29uZmlnUmF3KSkucGlwZShcbiAgICAgICAgICAgICAgdGFwKChvdmVycmlkZXM6IFBhcnRpYWw8RW52Q29uZmlnPikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1ZylcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKC4uLnJjQXJncygnUnVudGltZSBjb25maWcgKHBhcnNlZCk6JyksIG92ZXJyaWRlcyk7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAvLyA0LiBNZXJnZSBzdGF0aWMgKyBvdmVycmlkZXMgYW5kIHZhbGlkYXRlIHRoZSBmaW5hbCBjb25maWcgKGFzeW5jKVxuICAgICAgICAgICAgICBzd2l0Y2hNYXAoXG4gICAgICAgICAgICAgICAgKG92ZXJyaWRlczogUGFydGlhbDxFbnZDb25maWc+KTogT2JzZXJ2YWJsZTxFbnZDb25maWc+ID0+XG4gICAgICAgICAgICAgICAgICBmcm9tKGtpdC5tZXJnZUFuZFZhbGlkYXRlQXN5bmMoc3RhdGljRW52LCBvdmVycmlkZXMpKVxuICAgICAgICAgICAgICApLFxuXG4gICAgICAgICAgICAgIC8vIDUuIENhY2hlIHRoZSB2YWxpZGF0ZWQgY29uZmlnIGZvciBzeW5jaHJvbm91cyBhY2Nlc3MgbGF0ZXJcbiAgICAgICAgICAgICAgdGFwKChtZXJnZWRDb25maWc6IEVudkNvbmZpZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1ZylcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKC4uLnJjQXJncygnTWVyZ2VkIGNvbmZpZzonKSwgbWVyZ2VkQ29uZmlnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZyA9IG1lcmdlZENvbmZpZztcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSksXG5cbiAgICAgICAgICAvLyA2LiBFcnJvciBoYW5kbGluZzogZmFpbCBmYXN0IG9yIGdyYWNlZnVsbHkgZmFsbCBiYWNrIHRvIHN0YXRpYy1vbmx5XG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICBpZiAoc3RvcE9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgLy8gUmVqZWN0IGFwcCBpbml0aWFsaXphdGlvbiAocmVjb21tZW5kZWQgZm9yIHByb2R1Y3Rpb24pXG4gICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIC4uLnJjQXJncygnRXJyb3Igb2NjdXJyZWQgd2hpbGUgbG9hZGluZyBydW50aW1lIGNvbmZpZzonKSxcbiAgICAgICAgICAgICAgZXJyXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICByZXR1cm4gb2YodGhpcy51c2VEZWZhdWx0cygpKTtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi5cbiAgICAgKiBJZiBub3QgeWV0IGxvYWRlZCwgcmV0dXJucyBhIHZhbGlkYXRlZCBzdGF0aWMtb25seSBjb25maWd1cmF0aW9uLlxuICAgICAqL1xuICAgIGdldCgpOiBFbnZDb25maWcge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1J1bnRpbWVDb25maWdTZXJ2aWNlLmdldCgpIGNhbGxlZCBiZWZvcmUgY29uZmlndXJhdGlvbiB3YXMgbG9hZGVkLiAnICtcbiAgICAgICAgICAgICdFbnN1cmUgcHJvdmlkZUFwcEluaXRpYWxpemVyIHdhaXRzIGZvciBSdW50aW1lQ29uZmlnU2VydmljZS5sb2FkKCkuJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIHRvIGEgdmFsaWRhdGVkIHN0YXRpYy1vbmx5IGNvbmZpZ3VyYXRpb25cbiAgICAgKiBVc2VkIHdoZW4gdGhlIHJ1bnRpbWUgYC5lbnZgIGZpbGUgaXMgbWlzc2luZy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHVzZURlZmF1bHRzKCk6IEVudkNvbmZpZyB7XG4gICAgICAvLyBOb3RlOiB0aGlzIHVzZXMgdGhlIHN0YXRpYyBlbnY7IG1lcmdlK3ZhbGlkYXRlIGlzIHBlcmZvcm1lZCBpbiBgZ2V0KClgIGlmIG5lZWRlZC5cbiAgICAgIHRoaXMuY29uZmlnID8/PSBzdGF0aWNFbnYgYXMgRW52Q29uZmlnO1xuICAgICAgcmV0dXJuIHRoaXMuY29uZmlnO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlZ2lzdGVyIHRoZSBzZXJ2aWNlICsgaW5pdGlhbGl6ZXIgKyB0b2tlbiBleHBvc3VyZSB3aXRoIEFuZ3VsYXIgREkuXG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW1xuICAgIFJ1bnRpbWVDb25maWdTZXJ2aWNlLFxuXG4gICAgLy8gQW5ndWxhciAxOSsgZnVuY3Rpb25hbCBpbml0aWFsaXplciAoc3Vic2NyaWJlcyB0byB0aGUgbG9hZCBPYnNlcnZhYmxlKVxuICAgIC8vIFVzaW5nIGZpcnN0VmFsdWVGcm9tIHRvIGVuZm9yZWNlIFwiYXdhaXQgdW50aWwgbG9hZGVkXCIgc2VtYW50aWNzXG4gICAgcHJvdmlkZUFwcEluaXRpYWxpemVyKCgpID0+XG4gICAgICBmaXJzdFZhbHVlRnJvbShpbmplY3QoUnVudGltZUNvbmZpZ1NlcnZpY2UpLmxvYWQoKSlcbiAgICApLFxuXG4gICAgLy8gRXhwb3NlIHRoZSBmaW5hbCB2YWxpZGF0ZWQgY29uZmlnIHZpYSB0aGUgZ2VuZXJhdGVkIHRva2VuXG4gICAge1xuICAgICAgcHJvdmlkZTogY29uZmlnVG9rZW4sXG4gICAgICB1c2VGYWN0b3J5OiAoKSA9PiBpbmplY3QoUnVudGltZUNvbmZpZ1NlcnZpY2UpLmdldCgpLFxuICAgIH0sXG4gIF0pO1xufVxuIl19
163
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZS1ydW50aW1lLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdGVnZWwtYW5ndWxhci1leHRlbnNpb25zL3NyYy9saWIvZW52L2FuZ3VsYXIvcHJvdmlkZS1ydW50aW1lLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsTUFBTSxFQUNOLFVBQVUsRUFDVixjQUFjLEVBQ2Qsd0JBQXdCLEVBQ3hCLHFCQUFxQixHQUN0QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsVUFBVSxFQUNWLEtBQUssRUFDTCxjQUFjLEVBQ2QsSUFBSSxFQUNKLEdBQUcsRUFFSCxFQUFFLEVBQ0YsU0FBUyxFQUNULEdBQUcsRUFDSCxVQUFVLEdBQ1gsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBR3ZDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFFdEQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQVcsRUFBa0MsRUFBRSxDQUFDO0lBQzlELHNCQUFzQixHQUFHLEdBQUc7SUFDNUIsYUFBYTtJQUNiLEVBQUU7Q0FDSCxDQUFDO0FBa0NGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBSWxDLEdBQWlCLEVBQ2pCLFNBQThCLEVBQzlCLEVBQ0UsT0FBTyxHQUFHLGtCQUFrQixFQUM1QixLQUFLLEdBQUcsS0FBSyxFQUNiLFdBQVcsR0FBRyxJQUFJLEVBQ2xCLEtBQUssTUFDNkIsRUFBRTtJQUt0QyxnRUFBZ0U7SUFDaEUsTUFBTSxXQUFXLEdBQUcsS0FBSyxJQUFJLElBQUksY0FBYyxDQUFZLFlBQVksQ0FBQyxDQUFDO0lBRXpFOzs7T0FHRztJQUNILE1BQ00sb0JBQW9CO1FBQ3hCLGtEQUFrRDtRQUMxQyxNQUFNLENBQWE7UUFFM0I7OztXQUdHO1FBQ0gsSUFBSTtZQUNGLE9BQU8sS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUNoQixTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUNyQixTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDaEIsOERBQThEO2dCQUM5RCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUNaLE9BQU8sVUFBVSxDQUNmLEdBQUcsRUFBRSxDQUNILElBQUksS0FBSyxDQUNQLGtDQUFrQyxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FDakUsQ0FDSixDQUFDO2dCQUNKLENBQUM7Z0JBRUQsZ0VBQWdFO2dCQUNoRSxPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNwQixDQUFDLENBQUM7WUFDRiwrREFBK0Q7WUFDL0QsR0FBRyxDQUFDLENBQUMsR0FBVyxFQUFpQixFQUFFO2dCQUNqQyxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sU0FBUyxHQUNiLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3BFLElBQUksU0FBUyxFQUFFLENBQUM7b0JBQ2QsSUFBSSxLQUFLLEVBQUUsQ0FBQzt3QkFDVixPQUFPLENBQUMsR0FBRyxDQUNULEdBQUcsTUFBTSxDQUNQLHNFQUFzRSxDQUN2RSxDQUNGLENBQUM7b0JBQ0osQ0FBQztvQkFDRCwyQ0FBMkM7b0JBQzNDLE9BQU8sSUFBSSxDQUFDO2dCQUNkLENBQUM7Z0JBQ0QsT0FBTyxHQUFHLENBQUM7WUFDYixDQUFDLENBQUMsRUFDRixHQUFHLENBQUMsQ0FBQyxDQUFnQixFQUFFLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxLQUFLO29CQUFFLE9BQU87Z0JBQ25CLE9BQU8sQ0FBQyxHQUFHLENBQ1QsR0FBRyxNQUFNLENBQ1AsQ0FBQyxLQUFLLElBQUk7b0JBQ1IsQ0FBQyxDQUFDLCtEQUErRDtvQkFDakUsQ0FBQyxDQUFDLHNEQUFzRCxDQUMzRCxDQUNGLENBQUM7WUFDSixDQUFDLENBQUM7WUFDRixpREFBaUQ7WUFDakQsU0FBUyxDQUFDLENBQUMsR0FBa0IsRUFBeUIsRUFBRTtnQkFDdEQsSUFBSSxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7b0JBQ2pCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDcEQsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FDbEMsQ0FBQztnQkFDSixDQUFDO2dCQUVELHNFQUFzRTtnQkFDdEUsTUFBTSxnQkFBZ0IsR0FBNEIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNwRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDaEUsR0FBRyxDQUFDLENBQUMsU0FBNkIsRUFBRSxFQUFFO29CQUNwQyxJQUFJLEtBQUs7d0JBQ1AsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUNsRSxDQUFDLENBQUM7Z0JBQ0Ysb0VBQW9FO2dCQUNwRSxTQUFTLENBQ1AsQ0FBQyxTQUE2QixFQUF5QixFQUFFLENBQ3ZELElBQUksQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQ3hEO2dCQUVELDZEQUE2RDtnQkFDN0QsR0FBRyxDQUFDLENBQUMsWUFBdUIsRUFBRSxFQUFFO29CQUM5QixJQUFJLEtBQUs7d0JBQ1AsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO29CQUN6RCxJQUFJLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQztnQkFDN0IsQ0FBQyxDQUFDLENBQ0gsQ0FBQztZQUNKLENBQUMsQ0FBQztZQUVGLHNFQUFzRTtZQUN0RSxVQUFVLENBQUMsQ0FBQyxHQUFZLEVBQUUsRUFBRTtnQkFDMUIsSUFBSSxXQUFXLEVBQUUsQ0FBQztvQkFDaEIseURBQXlEO29CQUN6RCxNQUFNLEdBQUcsQ0FBQztnQkFDWixDQUFDO2dCQUNELE9BQU8sQ0FBQyxLQUFLLENBQ1gsR0FBRyxNQUFNLENBQUMsOENBQThDLENBQUMsRUFDekQsR0FBRyxDQUNKLENBQUM7Z0JBRUYsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDaEMsQ0FBQyxDQUFDLENBQ0gsQ0FDRixDQUFDO1FBQ0osQ0FBQztRQUVEOzs7V0FHRztRQUNILEdBQUc7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNqQixNQUFNLElBQUksS0FBSyxDQUNiLHFFQUFxRTtvQkFDbkUscUVBQXFFLENBQ3hFLENBQUM7WUFDSixDQUFDO1lBRUQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3JCLENBQUM7UUFFRDs7O1dBR0c7UUFDSyxXQUFXO1lBQ2pCLG9GQUFvRjtZQUNwRixJQUFJLENBQUMsTUFBTSxLQUFLLFNBQXNCLENBQUM7WUFDdkMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3JCLENBQUM7NEdBM0hHLG9CQUFvQjtnSEFBcEIsb0JBQW9CLGNBREEsTUFBTTs7Z0dBQzFCLG9CQUFvQjtzQkFEekIsVUFBVTt1QkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7O0lBK0hsQyx1RUFBdUU7SUFDdkUsT0FBTyx3QkFBd0IsQ0FBQztRQUM5QixvQkFBb0I7UUFFcEIseUVBQXlFO1FBQ3pFLGtFQUFrRTtRQUNsRSxxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsQ0FDekIsY0FBYyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQ3BEO1FBRUQsNERBQTREO1FBQzVEO1lBQ0UsT0FBTyxFQUFFLFdBQVc7WUFDcEIsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRTtTQUNyRDtLQUNGLENBQUMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW52aXJvbm1lbnRQcm92aWRlcnMsXG4gIGluamVjdCxcbiAgSW5qZWN0YWJsZSxcbiAgSW5qZWN0aW9uVG9rZW4sXG4gIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyxcbiAgcHJvdmlkZUFwcEluaXRpYWxpemVyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIGNhdGNoRXJyb3IsXG4gIGRlZmVyLFxuICBmaXJzdFZhbHVlRnJvbSxcbiAgZnJvbSxcbiAgbWFwLFxuICBPYnNlcnZhYmxlLFxuICBvZixcbiAgc3dpdGNoTWFwLFxuICB0YXAsXG4gIHRocm93RXJyb3IsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZnJvbUZldGNoIH0gZnJvbSAncnhqcy9mZXRjaCc7XG5pbXBvcnQgeiBmcm9tICd6b2QnO1xuaW1wb3J0IHsgRW52S2l0LCBTY2hlbWFPdXRwdXQsIFN0YXRpY0VudkZyb20gfSBmcm9tICcuLi9jb3JlL2Vudi10eXBlcyc7XG5pbXBvcnQgeyBwYXJzZUVudkZpbGUgfSBmcm9tICcuLi9jb3JlL3BhcnNlLWVudi1maWxlJztcblxuLyoqXG4gKiBCdWlsZHMgc3R5bGVkIGNvbnNvbGUgYXJndW1lbnRzIGZvciBSdW50aW1lQ29uZmlnIGxvZ3MuXG4gKlxuICogVGhlIHJldHVybmVkIHR1cGxlIGNhbiBiZSBzcHJlYWQgZGlyZWN0bHkgaW50byBgY29uc29sZS5sb2dgLFxuICogYWxsb3dpbmcgdGhlIGJyb3dzZXIgdG8gcmVuZGVyIGEgY29sb3JlZCBgW1J1bnRpbWVDb25maWddYCBwcmVmaXhcbiAqIHdoaWxlIHByZXNlcnZpbmcgdGhlIG9yaWdpbmFsIGNhbGxlciBsb2NhdGlvbiBpbiBEZXZUb29scy5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIGNvbnNvbGUubG9nKC4uLnJjQXJncygnUnVudGltZSBvdmVycmlkZXMgbG9hZGVkLicpKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0ZXh0IHRvIGFwcGVuZCBhZnRlciB0aGUgY29sb3JlZCBwcmVmaXguXG4gKiBAcmV0dXJucyBBIHR1cGxlIG9mIGFyZ3VtZW50cyAoYFtmb3JtYXQsIHN0eWxlLCByZXNldF1gKSBmb3IgYGNvbnNvbGUubG9nYC5cbiAqL1xuY29uc3QgcmNBcmdzID0gKG1zZzogc3RyaW5nKTogUGFyYW1ldGVyczx0eXBlb2YgY29uc29sZS5sb2c+ID0+IFtcbiAgJyVjW1J1bnRpbWVDb25maWddJWMgJyArIG1zZyxcbiAgJ2NvbG9yOiMwY2Y7JyxcbiAgJycsXG5dO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIHRoZSBBbmd1bGFyIHJ1bnRpbWUtY29uZmlnIHByb3ZpZGVyLlxuICpcbiAqIEBwcm9wZXJ0eSBlbnZQYXRoXG4gKiBUaGUgVVJMIChvciBwYXRoKSB0byB0aGUgcnVudGltZSBgLmVudmAgZmlsZSB0aGF0IHdpbGwgYmUgZmV0Y2hlZCBhdCBhcHAgc3RhcnQuXG4gKiBEZWZhdWx0cyB0byBgXCIvZW52L3J1bnRpbWUuZW52XCJgLlxuICpcbiAqIEBwcm9wZXJ0eSBkZWJ1Z1xuICogRW5hYmxlcyB2ZXJib3NlIGNvbnNvbGUgbG9nZ2luZyB3aGVuIGB0cnVlYC4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAqXG4gKiBAcHJvcGVydHkgc3RvcE9uRXJyb3JcbiAqIElmIGB0cnVlYCwgYW55IGZhaWx1cmUgd2hpbGUgbG9hZGluZy9wYXJzaW5nL3ZhbGlkYXRpbmcgdGhlIHJ1bnRpbWUgY29uZmlnXG4gKiB3aWxsIHJlamVjdCB0aGUgYXBwIGluaXRpYWxpemVyIGFuZCAqKmFib3J0IGJvb3QqKiAocmVjb21tZW5kZWQgZm9yIHByb2QpLlxuICogSWYgYGZhbHNlYCwgdGhlIHByb3ZpZGVyIGZhbGxzIGJhY2sgdG8gdGhlIHN0YXRpYyBlbnZpcm9ubWVudCBvbmx5LlxuICogRGVmYXVsdHMgdG8gYHRydWVgLlxuICpcbiAqIEBwcm9wZXJ0eSB0b2tlblxuICogT3B0aW9uYWwgYEluamVjdGlvblRva2VuYCB1c2VkIHRvIGV4cG9zZSB0aGUgdmFsaWRhdGVkIGNvbmZpZ3VyYXRpb25cbiAqIHZpYSBBbmd1bGFyIGRlcGVuZGVuY3kgaW5qZWN0aW9uLiBJZiBvbWl0dGVkLCB0aGUgcHJvdmlkZXIgd2lsbCBjcmVhdGUgb25lXG4gKiBhdXRvbWF0aWNhbGx5IG5hbWVkIGBFTlZfQ09ORklHYC5cbiAqL1xuaW50ZXJmYWNlIFByb3ZpZGVSdW50aW1lQ29uZmlnT3B0aW9uczxTIGV4dGVuZHMgei5ab2RPYmplY3Q8ei5ab2RSYXdTaGFwZT4+IHtcbiAgLyoqIFBhdGggdG8gdGhlIHJ1bnRpbWUgZW52IGZpbGUgKGRlZmF1bHQ6IC9lbnYvcnVudGltZS5lbnYpICovXG4gIGVudlBhdGg/OiBzdHJpbmc7XG4gIC8qKiBMb2cgZGVidWcgaW5mbyB0byBjb25zb2xlICovXG4gIGRlYnVnPzogYm9vbGVhbjtcbiAgLyoqIFRocm93IG9uIGVycm9yIHRvIHN0b3AgYXBwIGJvb3QgKGRlZmF1bHQ6IHRydWUpICovXG4gIHN0b3BPbkVycm9yPzogYm9vbGVhbjtcbiAgLyoqIEluamVjdGlvbiB0b2tlbiB1c2VkIHRvIHByb3ZpZGUgdGhlIHZhbGlkYXRlZCBjb25maWcgdmlhIEFuZ3VsYXIgREkgKi9cbiAgdG9rZW4/OiBJbmplY3Rpb25Ub2tlbjxTY2hlbWFPdXRwdXQ8Uz4+O1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBwcm92aWRlcnMgdGhhdDpcbiAqIC0gRmV0Y2ggYSBydW50aW1lIGAuZW52YCBmaWxlIGF0IHN0YXJ0dXAsXG4gKiAtIFBhcnNlIGl0IHRvIGEgZGVlcC1wYXJ0aWFsIHN0cnVjdHVyZSB2aWEgdGhlIGtpdCxcbiAqIC0gRW5mb3JjZSBydW50aW1lLXJlcXVpcmVkIGtleXMgd2hlbiBhcHByb3ByaWF0ZSxcbiAqIC0gTWVyZ2Ugd2l0aCB0aGUgc3RhdGljIGVudmlyb25tZW50LFxuICogLSBWYWxpZGF0ZSB0aGUgKipmaW5hbCoqIGNvbmZpZ3VyYXRpb24gYWdhaW5zdCB0aGUgWm9kIHNjaGVtYSxcbiAqIC0gRXhwb3NlIHRoZSByZXN1bHRpbmcgY29uZmlnIHZpYSBhIGdlbmVyYXRlZCBgSW5qZWN0aW9uVG9rZW5gLlxuICpcbiAqIEB0eXBlUGFyYW0gUyAtIFpvZCBzY2hlbWEgdHlwZSBkZXNjcmliaW5nIHRoZSBmdWxsIGNvbmZpZyBzaGFwZS5cbiAqIEB0eXBlUGFyYW0gSyAtIExpc3Qgb2YgcnVudGltZS1yZXF1aXJlZCB0b3AtbGV2ZWwga2V5cy5cbiAqXG4gKiBAcGFyYW0ga2l0XG4gKiBUaGUgYEVudktpdGAgY3JlYXRlZCBieSBgY3JlYXRlRW52S2l0KHNjaGVtYSwgcnVudGltZVJlcXVpcmVkS2V5cylgLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBSdW50aW1lIGxvYWRpbmcgYmVoYXZpb3IgYW5kIERJIHRva2VuIGRlc2NyaXB0aW9uLiBTZWUge0BsaW5rIFByb3ZpZGVSdW50aW1lQ29uZmlnT3B0aW9uc30uXG4gKlxuICogQHJldHVybnMgVGhlIGBFbnZpcm9ubWVudFByb3ZpZGVyc2AgdG8gYmUgYWRkZWQgdG8gYGFwcENvbmZpZy5wcm92aWRlcnNgLFxuICpcbiAqIEByZW1hcmtzXG4gKiAtIFRoaXMgdXNlcyBhbiBBbmd1bGFyICoqZnVuY3Rpb25hbCBhcHAgaW5pdGlhbGl6ZXIqKiB0byBwZXJmb3JtIHRoZSBsb2FkIHN0ZXAuXG4gKiAtIElmIHRoZSBzZXJ2ZXIgcmV0dXJucyBhbiBIVE1MIFNQQSBmYWxsYmFjayAoaW5zdGVhZCBvZiB0aGUgYC5lbnZgIGZpbGUpLCB0aGUgcHJvdmlkZXJcbiAqICAgcXVpZXRseSB1c2VzIHRoZSBzdGF0aWMgZW52aXJvbm1lbnQgKG5vIHJ1bnRpbWUgb3ZlcnJpZGVzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVSdW50aW1lQ29uZmlnPFxuICBTIGV4dGVuZHMgei5ab2RPYmplY3Q8ei5ab2RSYXdTaGFwZT4sXG4gIEsgZXh0ZW5kcyByZWFkb25seSAoa2V5b2Ygei5vdXRwdXQ8Uz4pW10sXG4+KFxuICBraXQ6IEVudktpdDxTLCBLPixcbiAgc3RhdGljRW52OiBTdGF0aWNFbnZGcm9tPFMsIEs+LFxuICB7XG4gICAgZW52UGF0aCA9ICcvZW52L3J1bnRpbWUuZW52JyxcbiAgICBkZWJ1ZyA9IGZhbHNlLFxuICAgIHN0b3BPbkVycm9yID0gdHJ1ZSxcbiAgICB0b2tlbixcbiAgfTogUHJvdmlkZVJ1bnRpbWVDb25maWdPcHRpb25zPFM+ID0ge30sXG4pOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XG4gIC8vIFRoZSB2YWxpZGF0ZWQgY29uZmlnIHR5cGUgZGVyaXZlZCBmcm9tIHRoZSBzY2hlbWEuXG4gIHR5cGUgRW52Q29uZmlnID0gU2NoZW1hT3V0cHV0PFM+O1xuXG4gIC8vIFR5cGVkIHRva2VuIHVzZWQgdG8gZXhwb3NlIHRoZSBmaW5hbCB2YWxpZGF0ZWQgY29uZmlnIHZpYSBESS5cbiAgY29uc3QgY29uZmlnVG9rZW4gPSB0b2tlbiA/PyBuZXcgSW5qZWN0aW9uVG9rZW48RW52Q29uZmlnPignRU5WX0NPTkZJRycpO1xuXG4gIC8qKlxuICAgKiBBbmd1bGFyIHNlcnZpY2UgdGhhdCBoYW5kbGVzIGZldGNoaW5nLCBwYXJzaW5nLCB2YWxpZGF0aW5nLCBhbmQgY2FjaGluZ1xuICAgKiBvZiB0aGUgcnVudGltZSBlbnZpcm9ubWVudCBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbiAgY2xhc3MgUnVudGltZUNvbmZpZ1NlcnZpY2Uge1xuICAgIC8vIENhY2hlZCBpbnN0YW5jZSBvZiB0aGUgdmFsaWRhdGVkIGNvbmZpZ3VyYXRpb24uXG4gICAgcHJpdmF0ZSBjb25maWc/OiBFbnZDb25maWc7XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcywgcGFyc2VzLCBtZXJnZXMgYW5kIHZhbGlkYXRlcyB0aGUgcnVudGltZSBjb25maWd1cmF0aW9uLlxuICAgICAqIFJldHVybnMgYW4gYE9ic2VydmFibGU8Q29uZmlnU2hhcGU+YCBhbmQgY2FjaGVzIHRoZSBmaW5hbCByZXN1bHQuXG4gICAgICovXG4gICAgbG9hZCgpOiBPYnNlcnZhYmxlPEVudkNvbmZpZz4ge1xuICAgICAgcmV0dXJuIGRlZmVyKCgpID0+XG4gICAgICAgIGZyb21GZXRjaChlbnZQYXRoKS5waXBlKFxuICAgICAgICAgIHN3aXRjaE1hcCgocmVzKSA9PiB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgSFRUUCBlcnJvcnMgZXhwbGljaXRseSBzbyB0aGV5IGdvIHRocm91Z2ggY2F0Y2hFcnJvclxuICAgICAgICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAgICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHJ1bnRpbWUgY29uZmlnOiAke3Jlcy5zdGF0dXN9ICR7cmVzLnN0YXR1c1RleHR9YCxcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlc3BvbnNlLnRleHQoKSByZXR1cm5zIGEgUHJvbWlzZSwgd2hpY2ggc3dpdGNoTWFwIGNhbiBoYW5kbGVcbiAgICAgICAgICAgIHJldHVybiByZXMudGV4dCgpO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIC8vIDEuIFNQQSBmYWxsYmFjayBndWFyZCAoc2VydmVyIHJldHVybmVkIEhUTUwgaW5zdGVhZCBvZiAuZW52KVxuICAgICAgICAgIG1hcCgocmF3OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRyaW1tZWQgPSByYXcudHJpbSgpO1xuICAgICAgICAgICAgY29uc3QgbG9va3NIdG1sID1cbiAgICAgICAgICAgICAgL15cXHMqPCFkb2N0eXBlL2kudGVzdCh0cmltbWVkKSB8fCAvXlxccyo8aHRtbFtcXHM+XS9pLnRlc3QodHJpbW1lZCk7XG4gICAgICAgICAgICBpZiAobG9va3NIdG1sKSB7XG4gICAgICAgICAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgLi4ucmNBcmdzKFxuICAgICAgICAgICAgICAgICAgICAnTm8gcnVudGltZSBlbnZpcm9ubWVudCBmaWxlIGRldGVjdGVkLCB1c2luZyBzdGF0aWMgZW52aXJvbm1lbnQgb25seS4nLFxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIFNpZ25hbCDigJxubyBydW50aW1lLmVudiwgdXNlIHN0YXRpYyBvbmx54oCdXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJhdztcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0YXAoKHY6IHN0cmluZyB8IG51bGwpID0+IHtcbiAgICAgICAgICAgIGlmICghZGVidWcpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAuLi5yY0FyZ3MoXG4gICAgICAgICAgICAgICAgdiA9PT0gbnVsbFxuICAgICAgICAgICAgICAgICAgPyAnTm8gcnVudGltZSBlbnZpcm9ubWVudCBmaWxlIGRlZmluZWQsIHVzaW5nIHN0YXRpYyBlbnZpcm9ubWVudCdcbiAgICAgICAgICAgICAgICAgIDogJ1J1bnRpbWUgZW52aXJvbm1lbnQgZmlsZSBsb2FkZWQsIGFwcGx5aW5nIG92ZXJyaWRlcy4nLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAvLyAyLiBFaXRoZXIgY29udGludWUgdGhlIHBpcGUgb3IgcmV0dXJuIGRlZmF1bHRzXG4gICAgICAgICAgc3dpdGNoTWFwKChyYXc6IHN0cmluZyB8IG51bGwpOiBPYnNlcnZhYmxlPEVudkNvbmZpZz4gPT4ge1xuICAgICAgICAgICAgaWYgKHJhdyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICByZXR1cm4gZnJvbShraXQubWVyZ2VBbmRWYWxpZGF0ZUFzeW5jKHN0YXRpY0VudikpLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFwKChjZmcpID0+ICh0aGlzLmNvbmZpZyA9IGNmZykpLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyAzLiBQYXJzZSByYXcgYC5lbnZgIHRleHQgLT4gb2JqZWN0LCB0aGVuIGRlZXAtcGFydGlhbC1wYXJzZSB2aWEga2l0XG4gICAgICAgICAgICBjb25zdCBydW50aW1lQ29uZmlnUmF3OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHBhcnNlRW52RmlsZShyYXcpO1xuICAgICAgICAgICAgcmV0dXJuIGZyb20oa2l0LnBhcnNlUnVudGltZU92ZXJyaWRlc0FzeW5jKHJ1bnRpbWVDb25maWdSYXcpKS5waXBlKFxuICAgICAgICAgICAgICB0YXAoKG92ZXJyaWRlczogUGFydGlhbDxFbnZDb25maWc+KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnKVxuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coLi4ucmNBcmdzKCdSdW50aW1lIGNvbmZpZyAocGFyc2VkKTonKSwgb3ZlcnJpZGVzKTtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIC8vIDQuIE1lcmdlIHN0YXRpYyArIG92ZXJyaWRlcyBhbmQgdmFsaWRhdGUgdGhlIGZpbmFsIGNvbmZpZyAoYXN5bmMpXG4gICAgICAgICAgICAgIHN3aXRjaE1hcChcbiAgICAgICAgICAgICAgICAob3ZlcnJpZGVzOiBQYXJ0aWFsPEVudkNvbmZpZz4pOiBPYnNlcnZhYmxlPEVudkNvbmZpZz4gPT5cbiAgICAgICAgICAgICAgICAgIGZyb20oa2l0Lm1lcmdlQW5kVmFsaWRhdGVBc3luYyhzdGF0aWNFbnYsIG92ZXJyaWRlcykpLFxuICAgICAgICAgICAgICApLFxuXG4gICAgICAgICAgICAgIC8vIDUuIENhY2hlIHRoZSB2YWxpZGF0ZWQgY29uZmlnIGZvciBzeW5jaHJvbm91cyBhY2Nlc3MgbGF0ZXJcbiAgICAgICAgICAgICAgdGFwKChtZXJnZWRDb25maWc6IEVudkNvbmZpZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1ZylcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKC4uLnJjQXJncygnTWVyZ2VkIGNvbmZpZzonKSwgbWVyZ2VkQ29uZmlnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZyA9IG1lcmdlZENvbmZpZztcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pLFxuXG4gICAgICAgICAgLy8gNi4gRXJyb3IgaGFuZGxpbmc6IGZhaWwgZmFzdCBvciBncmFjZWZ1bGx5IGZhbGwgYmFjayB0byBzdGF0aWMtb25seVxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgaWYgKHN0b3BPbkVycm9yKSB7XG4gICAgICAgICAgICAgIC8vIFJlamVjdCBhcHAgaW5pdGlhbGl6YXRpb24gKHJlY29tbWVuZGVkIGZvciBwcm9kdWN0aW9uKVxuICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAuLi5yY0FyZ3MoJ0Vycm9yIG9jY3VycmVkIHdoaWxlIGxvYWRpbmcgcnVudGltZSBjb25maWc6JyksXG4gICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHJldHVybiBvZih0aGlzLnVzZURlZmF1bHRzKCkpO1xuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uXG4gICAgICogSWYgbm90IHlldCBsb2FkZWQsIHJldHVybnMgYSB2YWxpZGF0ZWQgc3RhdGljLW9ubHkgY29uZmlndXJhdGlvbi5cbiAgICAgKi9cbiAgICBnZXQoKTogRW52Q29uZmlnIHtcbiAgICAgIGlmICghdGhpcy5jb25maWcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdSdW50aW1lQ29uZmlnU2VydmljZS5nZXQoKSBjYWxsZWQgYmVmb3JlIGNvbmZpZ3VyYXRpb24gd2FzIGxvYWRlZC4gJyArXG4gICAgICAgICAgICAnRW5zdXJlIHByb3ZpZGVBcHBJbml0aWFsaXplciB3YWl0cyBmb3IgUnVudGltZUNvbmZpZ1NlcnZpY2UubG9hZCgpLicsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gdG8gYSB2YWxpZGF0ZWQgc3RhdGljLW9ubHkgY29uZmlndXJhdGlvblxuICAgICAqIFVzZWQgd2hlbiB0aGUgcnVudGltZSBgLmVudmAgZmlsZSBpcyBtaXNzaW5nLlxuICAgICAqL1xuICAgIHByaXZhdGUgdXNlRGVmYXVsdHMoKTogRW52Q29uZmlnIHtcbiAgICAgIC8vIE5vdGU6IHRoaXMgdXNlcyB0aGUgc3RhdGljIGVudjsgbWVyZ2UrdmFsaWRhdGUgaXMgcGVyZm9ybWVkIGluIGBnZXQoKWAgaWYgbmVlZGVkLlxuICAgICAgdGhpcy5jb25maWcgPz89IHN0YXRpY0VudiBhcyBFbnZDb25maWc7XG4gICAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVnaXN0ZXIgdGhlIHNlcnZpY2UgKyBpbml0aWFsaXplciArIHRva2VuIGV4cG9zdXJlIHdpdGggQW5ndWxhciBESS5cbiAgcmV0dXJuIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyhbXG4gICAgUnVudGltZUNvbmZpZ1NlcnZpY2UsXG5cbiAgICAvLyBBbmd1bGFyIDE5KyBmdW5jdGlvbmFsIGluaXRpYWxpemVyIChzdWJzY3JpYmVzIHRvIHRoZSBsb2FkIE9ic2VydmFibGUpXG4gICAgLy8gVXNpbmcgZmlyc3RWYWx1ZUZyb20gdG8gZW5mb3JlY2UgXCJhd2FpdCB1bnRpbCBsb2FkZWRcIiBzZW1hbnRpY3NcbiAgICBwcm92aWRlQXBwSW5pdGlhbGl6ZXIoKCkgPT5cbiAgICAgIGZpcnN0VmFsdWVGcm9tKGluamVjdChSdW50aW1lQ29uZmlnU2VydmljZSkubG9hZCgpKSxcbiAgICApLFxuXG4gICAgLy8gRXhwb3NlIHRoZSBmaW5hbCB2YWxpZGF0ZWQgY29uZmlnIHZpYSB0aGUgZ2VuZXJhdGVkIHRva2VuXG4gICAge1xuICAgICAgcHJvdmlkZTogY29uZmlnVG9rZW4sXG4gICAgICB1c2VGYWN0b3J5OiAoKSA9PiBpbmplY3QoUnVudGltZUNvbmZpZ1NlcnZpY2UpLmdldCgpLFxuICAgIH0sXG4gIF0pO1xufVxuIl19
@@ -0,0 +1,128 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, ElementRef, TemplateRef, computed, effect, input, output, viewChild, } from '@angular/core';
3
+ import { TdsModal, TegelModule } from '@scania/tegel-angular-17';
4
+ import { DynamicComponentDirective } from '../../directives/dynamic-component.directive';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common";
7
+ import * as i2 from "@scania/tegel-angular-17";
8
+ /**
9
+ * Renders a single modal instance backed by the Tegel <tds-modal> web component.
10
+ *
11
+ * Responsibilities:
12
+ * - Initialize the underlying web component once it is ready.
13
+ * - Apply the desired open/close state based on `modal.isOpen`.
14
+ * - Render header/body/action content (including dynamic components).
15
+ */
16
+ export class ModalComponent {
17
+ /**
18
+ * Modal configuration and runtime state.
19
+ */
20
+ modal = input.required();
21
+ /**
22
+ * Emits the modal id when the modal is closed by the user.
23
+ */
24
+ closed = output();
25
+ // Reference to the underlying web component instance.
26
+ _modalRef = viewChild(TdsModal, {
27
+ read: (ElementRef),
28
+ });
29
+ /**
30
+ * Resolved DOM element for the underlying <tds-modal>.
31
+ */
32
+ modalEl = computed(() => this._modalRef()?.nativeElement ?? null);
33
+ /** Tracks whether the modal has been initialized. */
34
+ initialized = false;
35
+ constructor() {
36
+ effect(() => {
37
+ // Track input changes and sync desired open state to the web component.
38
+ this.modal();
39
+ void this.applyOpenState();
40
+ });
41
+ }
42
+ /**
43
+ * Type guard for TemplateRef values.
44
+ * @param value Value to test.
45
+ */
46
+ isTemplateRef(value) {
47
+ return value instanceof TemplateRef;
48
+ }
49
+ /**
50
+ * Type guard for component-backed modal bodies.
51
+ * @param body Body value to test.
52
+ */
53
+ isComponentBody(body) {
54
+ return typeof body === 'object' && body !== null && 'component' in body;
55
+ }
56
+ /**
57
+ * Type guard for template-backed modal bodies.
58
+ * @param body Body value to test.
59
+ */
60
+ isTemplateBody(body) {
61
+ return typeof body === 'object' && body !== null && 'template' in body;
62
+ }
63
+ /**
64
+ * Invokes an action button handler (sync or async).
65
+ * @param button Modal button descriptor.
66
+ */
67
+ async handleButtonClick(button) {
68
+ try {
69
+ await button.onClick?.();
70
+ }
71
+ catch (err) {
72
+ console.error('[tae-modal] Button onClick failed:', err);
73
+ }
74
+ }
75
+ /**
76
+ * Initializes the underlying <tds-modal> after view init.
77
+ */
78
+ ngAfterViewInit() {
79
+ void this.initializeModal();
80
+ }
81
+ /**
82
+ * Calls the web component's initializeModal() once.
83
+ */
84
+ async initializeModal() {
85
+ const el = this.modalEl();
86
+ if (!el) {
87
+ console.warn('[tae-modal] Modal element not found; cannot initialize.');
88
+ return;
89
+ }
90
+ if (this.initialized)
91
+ return;
92
+ const ready = await el.componentOnReady();
93
+ if (!ready) {
94
+ console.warn('[tae-modal] Modal element not ready; initialization skipped.');
95
+ return;
96
+ }
97
+ await el.initializeModal();
98
+ this.initialized = true;
99
+ }
100
+ /**
101
+ * Applies the desired open/close state to the web component.
102
+ */
103
+ async applyOpenState() {
104
+ const modal = this.modal();
105
+ const el = this.modalEl();
106
+ if (!el)
107
+ return;
108
+ if (!this.initialized) {
109
+ // Initialize once before issuing show/close calls.
110
+ await this.initializeModal();
111
+ if (!this.initialized)
112
+ return;
113
+ }
114
+ if (modal.isOpen) {
115
+ await el.showModal();
116
+ }
117
+ else {
118
+ await el.closeModal();
119
+ }
120
+ }
121
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
122
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: ModalComponent, isStandalone: true, selector: "tae-modal", inputs: { modal: { classPropertyName: "modal", publicName: "modal", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { closed: "closed" }, viewQueries: [{ propertyName: "_modalRef", first: true, predicate: TdsModal, descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "@let modalObj = modal();\n\n<tds-modal\n [id]=\"modalObj.id\"\n [selector]=\"modalObj.selector\"\n [referenceEl]=\"modalObj.referenceEl\"\n [size]=\"modalObj.size\"\n [actionsPosition]=\"modalObj.actionsPosition\"\n [prevent]=\"modalObj.prevent\"\n [closable]=\"modalObj.closable\"\n [tdsAlertDialog]=\"modalObj.alertDialog\"\n (tdsClose)=\"this.closed.emit(modalObj.id)\"\n>\n @let header = modalObj.header;\n @if (header) {\n @if (isTemplateRef(header)) {\n <span slot=\"header\">\n <ng-container [ngTemplateOutlet]=\"header\" />\n </span>\n } @else {\n <span slot=\"header\">{{ header }}</span>\n }\n }\n\n @if (!modalObj.lazy || modalObj.isOpen) {\n @let body = modalObj.body;\n @if (body) {\n <span slot=\"body\">\n @if (isComponentBody(body)) {\n <ng-container\n taeDynamicComponent\n [component]=\"body.component\"\n [inputs]=\"body.inputs\"\n [outputs]=\"body.outputs\"\n />\n } @else if (isTemplateBody(body)) {\n <ng-container\n [ngTemplateOutlet]=\"body.template\"\n [ngTemplateOutletContext]=\"{ $implicit: body.context }\"\n />\n } @else {\n {{ body }}\n }\n </span>\n }\n }\n\n @let buttons = modalObj.buttons;\n @if (buttons?.length) {\n <span slot=\"actions\" class=\"tds-u-flex tds-u-gap2\">\n @for (button of buttons; track $index) {\n <tds-button\n [text]=\"button.text\"\n [variant]=\"button.variant ?? 'primary'\"\n [size]=\"button.size ?? 'md'\"\n [disabled]=\"button.disabled ?? false\"\n [attr.data-dismiss-modal]=\"button.dismiss ? '' : null\"\n (click)=\"handleButtonClick(button)\"\n ></tds-button>\n }\n </span>\n }\n</tds-modal>\n", styles: [":host{display:contents}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TegelModule }, { kind: "component", type: i2.TdsButton, selector: "tds-button", inputs: ["animation", "disabled", "fullbleed", "modeVariant", "name", "size", "tdsAriaLabel", "text", "type", "value", "variant"] }, { kind: "component", type: i2.TdsModal, selector: "tds-modal", inputs: ["actionsPosition", "closable", "header", "prevent", "referenceEl", "selector", "show", "size", "tdsAlertDialog"] }, { kind: "directive", type: DynamicComponentDirective, selector: "[taeDynamicComponent]", inputs: ["component", "inputs", "outputs"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
123
+ }
124
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ModalComponent, decorators: [{
125
+ type: Component,
126
+ args: [{ selector: 'tae-modal', imports: [CommonModule, TegelModule, DynamicComponentDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "@let modalObj = modal();\n\n<tds-modal\n [id]=\"modalObj.id\"\n [selector]=\"modalObj.selector\"\n [referenceEl]=\"modalObj.referenceEl\"\n [size]=\"modalObj.size\"\n [actionsPosition]=\"modalObj.actionsPosition\"\n [prevent]=\"modalObj.prevent\"\n [closable]=\"modalObj.closable\"\n [tdsAlertDialog]=\"modalObj.alertDialog\"\n (tdsClose)=\"this.closed.emit(modalObj.id)\"\n>\n @let header = modalObj.header;\n @if (header) {\n @if (isTemplateRef(header)) {\n <span slot=\"header\">\n <ng-container [ngTemplateOutlet]=\"header\" />\n </span>\n } @else {\n <span slot=\"header\">{{ header }}</span>\n }\n }\n\n @if (!modalObj.lazy || modalObj.isOpen) {\n @let body = modalObj.body;\n @if (body) {\n <span slot=\"body\">\n @if (isComponentBody(body)) {\n <ng-container\n taeDynamicComponent\n [component]=\"body.component\"\n [inputs]=\"body.inputs\"\n [outputs]=\"body.outputs\"\n />\n } @else if (isTemplateBody(body)) {\n <ng-container\n [ngTemplateOutlet]=\"body.template\"\n [ngTemplateOutletContext]=\"{ $implicit: body.context }\"\n />\n } @else {\n {{ body }}\n }\n </span>\n }\n }\n\n @let buttons = modalObj.buttons;\n @if (buttons?.length) {\n <span slot=\"actions\" class=\"tds-u-flex tds-u-gap2\">\n @for (button of buttons; track $index) {\n <tds-button\n [text]=\"button.text\"\n [variant]=\"button.variant ?? 'primary'\"\n [size]=\"button.size ?? 'md'\"\n [disabled]=\"button.disabled ?? false\"\n [attr.data-dismiss-modal]=\"button.dismiss ? '' : null\"\n (click)=\"handleButtonClick(button)\"\n ></tds-button>\n }\n </span>\n }\n</tds-modal>\n", styles: [":host{display:contents}\n"] }]
127
+ }], ctorParameters: () => [] });
128
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy90ZWdlbC1hbmd1bGFyLWV4dGVuc2lvbnMvc3JjL2xpYi9tb2RhbC9jb21wb25lbnRzL21vZGFsL21vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdGVnZWwtYW5ndWxhci1leHRlbnNpb25zL3NyYy9saWIvbW9kYWwvY29tcG9uZW50cy9tb2RhbC9tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFdBQVcsRUFDWCxRQUFRLEVBQ1IsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDakUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sOENBQThDLENBQUM7Ozs7QUFTekY7Ozs7Ozs7R0FPRztBQVFILE1BQU0sT0FBTyxjQUFjO0lBQ3pCOztPQUVHO0lBQ00sS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQVMsQ0FBQztJQUN6Qzs7T0FFRztJQUNnQixNQUFNLEdBQUcsTUFBTSxFQUFVLENBQUM7SUFDN0Msc0RBQXNEO0lBQ3JDLFNBQVMsR0FBRyxTQUFTLENBQUMsUUFBUSxFQUFFO1FBQy9DLElBQUksRUFBRSxDQUFBLFVBQStCLENBQUE7S0FDdEMsQ0FBQyxDQUFDO0lBRUg7O09BRUc7SUFDZ0IsT0FBTyxHQUFHLFFBQVEsQ0FDbkMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLGFBQWEsSUFBSSxJQUFJLENBQzlD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LFlBQVksRUFBRSxXQUFXLEVBQUUseUJBQXlCLENBQUMsbUJBQzlDLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgVGVtcGxhdGVSZWYsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIGlucHV0LFxuICBvdXRwdXQsXG4gIHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUZHNNb2RhbCwgVGVnZWxNb2R1bGUgfSBmcm9tICdAc2NhbmlhL3RlZ2VsLWFuZ3VsYXItMTcnO1xuaW1wb3J0IHsgRHluYW1pY0NvbXBvbmVudERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvZHluYW1pYy1jb21wb25lbnQuZGlyZWN0aXZlJztcbmltcG9ydCB7XG4gIE1vZGFsLFxuICBNb2RhbEJvZHksXG4gIE1vZGFsQ29tcG9uZW50Qm9keSxcbiAgTW9kYWxUZW1wbGF0ZUJvZHksXG59IGZyb20gJy4uLy4uL3NjaGVtYS9tb2RhbC5tb2RlbCc7XG5pbXBvcnQgeyBNb2RhbEJ1dHRvbiB9IGZyb20gJy4uLy4uL3NjaGVtYS9tb2RhbC50eXBlcyc7XG5cbi8qKlxuICogUmVuZGVycyBhIHNpbmdsZSBtb2RhbCBpbnN0YW5jZSBiYWNrZWQgYnkgdGhlIFRlZ2VsIDx0ZHMtbW9kYWw+IHdlYiBjb21wb25lbnQuXG4gKlxuICogUmVzcG9uc2liaWxpdGllczpcbiAqIC0gSW5pdGlhbGl6ZSB0aGUgdW5kZXJseWluZyB3ZWIgY29tcG9uZW50IG9uY2UgaXQgaXMgcmVhZHkuXG4gKiAtIEFwcGx5IHRoZSBkZXNpcmVkIG9wZW4vY2xvc2Ugc3RhdGUgYmFzZWQgb24gYG1vZGFsLmlzT3BlbmAuXG4gKiAtIFJlbmRlciBoZWFkZXIvYm9keS9hY3Rpb24gY29udGVudCAoaW5jbHVkaW5nIGR5bmFtaWMgY29tcG9uZW50cykuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RhZS1tb2RhbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tb2RhbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21vZGFsLmNvbXBvbmVudC5zY3NzJ10sXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFRlZ2VsTW9kdWxlLCBEeW5hbWljQ29tcG9uZW50RGlyZWN0aXZlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE1vZGFsQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIC8qKlxuICAgKiBNb2RhbCBjb25maWd1cmF0aW9uIGFuZCBydW50aW1lIHN0YXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgbW9kYWwgPSBpbnB1dC5yZXF1aXJlZDxNb2RhbD4oKTtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBtb2RhbCBpZCB3aGVuIHRoZSBtb2RhbCBpcyBjbG9zZWQgYnkgdGhlIHVzZXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2xvc2VkID0gb3V0cHV0PHN0cmluZz4oKTtcbiAgLy8gUmVmZXJlbmNlIHRvIHRoZSB1bmRlcmx5aW5nIHdlYiBjb21wb25lbnQgaW5zdGFuY2UuXG4gIHByaXZhdGUgcmVhZG9ubHkgX21vZGFsUmVmID0gdmlld0NoaWxkKFRkc01vZGFsLCB7XG4gICAgcmVhZDogRWxlbWVudFJlZjxIVE1MVGRzTW9kYWxFbGVtZW50PixcbiAgfSk7XG5cbiAgLyoqXG4gICAqIFJlc29sdmVkIERPTSBlbGVtZW50IGZvciB0aGUgdW5kZXJseWluZyA8dGRzLW1vZGFsPi5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBtb2RhbEVsID0gY29tcHV0ZWQoXG4gICAgKCkgPT4gdGhpcy5fbW9kYWxSZWYoKT8ubmF0aXZlRWxlbWVudCA/PyBudWxsLFxuICApO1xuXG4gIC8qKiBUcmFja3Mgd2hldGhlciB0aGUgbW9kYWwgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuICovXG4gIHByaXZhdGUgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgLy8gVHJhY2sgaW5wdXQgY2hhbmdlcyBhbmQgc3luYyBkZXNpcmVkIG9wZW4gc3RhdGUgdG8gdGhlIHdlYiBjb21wb25lbnQuXG4gICAgICB0aGlzLm1vZGFsKCk7XG4gICAgICB2b2lkIHRoaXMuYXBwbHlPcGVuU3RhdGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUeXBlIGd1YXJkIGZvciBUZW1wbGF0ZVJlZiB2YWx1ZXMuXG4gICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byB0ZXN0LlxuICAgKi9cbiAgcHJvdGVjdGVkIGlzVGVtcGxhdGVSZWYodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBUZW1wbGF0ZVJlZjx1bmtub3duPiB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgVGVtcGxhdGVSZWY7XG4gIH1cblxuICAvKipcbiAgICogVHlwZSBndWFyZCBmb3IgY29tcG9uZW50LWJhY2tlZCBtb2RhbCBib2RpZXMuXG4gICAqIEBwYXJhbSBib2R5IEJvZHkgdmFsdWUgdG8gdGVzdC5cbiAgICovXG4gIHByb3RlY3RlZCBpc0NvbXBvbmVudEJvZHkoXG4gICAgYm9keTogTW9kYWxCb2R5PHVua25vd24+LFxuICApOiBib2R5IGlzIE1vZGFsQ29tcG9uZW50Qm9keTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHR5cGVvZiBib2R5ID09PSAnb2JqZWN0JyAmJiBib2R5ICE9PSBudWxsICYmICdjb21wb25lbnQnIGluIGJvZHk7XG4gIH1cblxuICAvKipcbiAgICogVHlwZSBndWFyZCBmb3IgdGVtcGxhdGUtYmFja2VkIG1vZGFsIGJvZGllcy5cbiAgICogQHBhcmFtIGJvZHkgQm9keSB2YWx1ZSB0byB0ZXN0LlxuICAgKi9cbiAgcHJvdGVjdGVkIGlzVGVtcGxhdGVCb2R5KFxuICAgIGJvZHk6IE1vZGFsQm9keTx1bmtub3duPixcbiAgKTogYm9keSBpcyBNb2RhbFRlbXBsYXRlQm9keSB7XG4gICAgcmV0dXJuIHR5cGVvZiBib2R5ID09PSAnb2JqZWN0JyAmJiBib2R5ICE9PSBudWxsICYmICd0ZW1wbGF0ZScgaW4gYm9keTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2VzIGFuIGFjdGlvbiBidXR0b24gaGFuZGxlciAoc3luYyBvciBhc3luYykuXG4gICAqIEBwYXJhbSBidXR0b24gTW9kYWwgYnV0dG9uIGRlc2NyaXB0b3IuXG4gICAqL1xuICBhc3luYyBoYW5kbGVCdXR0b25DbGljayhidXR0b246IE1vZGFsQnV0dG9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGJ1dHRvbi5vbkNsaWNrPy4oKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1t0YWUtbW9kYWxdIEJ1dHRvbiBvbkNsaWNrIGZhaWxlZDonLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgdW5kZXJseWluZyA8dGRzLW1vZGFsPiBhZnRlciB2aWV3IGluaXQuXG4gICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdm9pZCB0aGlzLmluaXRpYWxpemVNb2RhbCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIHRoZSB3ZWIgY29tcG9uZW50J3MgaW5pdGlhbGl6ZU1vZGFsKCkgb25jZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZU1vZGFsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGVsID0gdGhpcy5tb2RhbEVsKCk7XG4gICAgaWYgKCFlbCkge1xuICAgICAgY29uc29sZS53YXJuKCdbdGFlLW1vZGFsXSBNb2RhbCBlbGVtZW50IG5vdCBmb3VuZDsgY2Fubm90IGluaXRpYWxpemUuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSByZXR1cm47XG5cbiAgICBjb25zdCByZWFkeSA9IGF3YWl0IGVsLmNvbXBvbmVudE9uUmVhZHkoKTtcbiAgICBpZiAoIXJlYWR5KSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdbdGFlLW1vZGFsXSBNb2RhbCBlbGVtZW50IG5vdCByZWFkeTsgaW5pdGlhbGl6YXRpb24gc2tpcHBlZC4nLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBlbC5pbml0aWFsaXplTW9kYWwoKTtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHRoZSBkZXNpcmVkIG9wZW4vY2xvc2Ugc3RhdGUgdG8gdGhlIHdlYiBjb21wb25lbnQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFwcGx5T3BlblN0YXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1vZGFsID0gdGhpcy5tb2RhbCgpO1xuICAgIGNvbnN0IGVsID0gdGhpcy5tb2RhbEVsKCk7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgLy8gSW5pdGlhbGl6ZSBvbmNlIGJlZm9yZSBpc3N1aW5nIHNob3cvY2xvc2UgY2FsbHMuXG4gICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVNb2RhbCgpO1xuICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSByZXR1cm47XG4gICAgfVxuICAgIGlmIChtb2RhbC5pc09wZW4pIHtcbiAgICAgIGF3YWl0IGVsLnNob3dNb2RhbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBlbC5jbG9zZU1vZGFsKCk7XG4gICAgfVxuICB9XG59XG4iLCJAbGV0IG1vZGFsT2JqID0gbW9kYWwoKTtcblxuPHRkcy1tb2RhbFxuICBbaWRdPVwibW9kYWxPYmouaWRcIlxuICBbc2VsZWN0b3JdPVwibW9kYWxPYmouc2VsZWN0b3JcIlxuICBbcmVmZXJlbmNlRWxdPVwibW9kYWxPYmoucmVmZXJlbmNlRWxcIlxuICBbc2l6ZV09XCJtb2RhbE9iai5zaXplXCJcbiAgW2FjdGlvbnNQb3NpdGlvbl09XCJtb2RhbE9iai5hY3Rpb25zUG9zaXRpb25cIlxuICBbcHJldmVudF09XCJtb2RhbE9iai5wcmV2ZW50XCJcbiAgW2Nsb3NhYmxlXT1cIm1vZGFsT2JqLmNsb3NhYmxlXCJcbiAgW3Rkc0FsZXJ0RGlhbG9nXT1cIm1vZGFsT2JqLmFsZXJ0RGlhbG9nXCJcbiAgKHRkc0Nsb3NlKT1cInRoaXMuY2xvc2VkLmVtaXQobW9kYWxPYmouaWQpXCJcbj5cbiAgQGxldCBoZWFkZXIgPSBtb2RhbE9iai5oZWFkZXI7XG4gIEBpZiAoaGVhZGVyKSB7XG4gICAgQGlmIChpc1RlbXBsYXRlUmVmKGhlYWRlcikpIHtcbiAgICAgIDxzcGFuIHNsb3Q9XCJoZWFkZXJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJoZWFkZXJcIiAvPlxuICAgICAgPC9zcGFuPlxuICAgIH0gQGVsc2Uge1xuICAgICAgPHNwYW4gc2xvdD1cImhlYWRlclwiPnt7IGhlYWRlciB9fTwvc3Bhbj5cbiAgICB9XG4gIH1cblxuICBAaWYgKCFtb2RhbE9iai5sYXp5IHx8IG1vZGFsT2JqLmlzT3Blbikge1xuICAgIEBsZXQgYm9keSA9IG1vZGFsT2JqLmJvZHk7XG4gICAgQGlmIChib2R5KSB7XG4gICAgICA8c3BhbiBzbG90PVwiYm9keVwiPlxuICAgICAgICBAaWYgKGlzQ29tcG9uZW50Qm9keShib2R5KSkge1xuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgIHRhZUR5bmFtaWNDb21wb25lbnRcbiAgICAgICAgICAgIFtjb21wb25lbnRdPVwiYm9keS5jb21wb25lbnRcIlxuICAgICAgICAgICAgW2lucHV0c109XCJib2R5LmlucHV0c1wiXG4gICAgICAgICAgICBbb3V0cHV0c109XCJib2R5Lm91dHB1dHNcIlxuICAgICAgICAgIC8+XG4gICAgICAgIH0gQGVsc2UgaWYgKGlzVGVtcGxhdGVCb2R5KGJvZHkpKSB7XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiYm9keS50ZW1wbGF0ZVwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGJvZHkuY29udGV4dCB9XCJcbiAgICAgICAgICAvPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICB7eyBib2R5IH19XG4gICAgICAgIH1cbiAgICAgIDwvc3Bhbj5cbiAgICB9XG4gIH1cblxuICBAbGV0IGJ1dHRvbnMgPSBtb2RhbE9iai5idXR0b25zO1xuICBAaWYgKGJ1dHRvbnM/Lmxlbmd0aCkge1xuICAgIDxzcGFuIHNsb3Q9XCJhY3Rpb25zXCIgY2xhc3M9XCJ0ZHMtdS1mbGV4IHRkcy11LWdhcDJcIj5cbiAgICAgIEBmb3IgKGJ1dHRvbiBvZiBidXR0b25zOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgPHRkcy1idXR0b25cbiAgICAgICAgICBbdGV4dF09XCJidXR0b24udGV4dFwiXG4gICAgICAgICAgW3ZhcmlhbnRdPVwiYnV0dG9uLnZhcmlhbnQgPz8gJ3ByaW1hcnknXCJcbiAgICAgICAgICBbc2l6ZV09XCJidXR0b24uc2l6ZSA/PyAnbWQnXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiYnV0dG9uLmRpc2FibGVkID8/IGZhbHNlXCJcbiAgICAgICAgICBbYXR0ci5kYXRhLWRpc21pc3MtbW9kYWxdPVwiYnV0dG9uLmRpc21pc3MgPyAnJyA6IG51bGxcIlxuICAgICAgICAgIChjbGljayk9XCJoYW5kbGVCdXR0b25DbGljayhidXR0b24pXCJcbiAgICAgICAgPjwvdGRzLWJ1dHRvbj5cbiAgICAgIH1cbiAgICA8L3NwYW4+XG4gIH1cbjwvdGRzLW1vZGFsPlxuIl19
@@ -0,0 +1,32 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
3
+ import { ModalService } from '../../modal.service';
4
+ import { ModalComponent } from '../modal/modal.component';
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ * Hosts and renders all active modals.
8
+ *
9
+ * The host listens for close events from each modal instance and
10
+ * forwards them to the modal service, which owns modal lifecycle.
11
+ */
12
+ export class ModalHostComponent {
13
+ modalService = inject(ModalService);
14
+ /**
15
+ * Map of active modals keyed by id.
16
+ */
17
+ modalsSignal = this.modalService.modals;
18
+ /**
19
+ * Handles close events from child modal components.
20
+ * @param id Modal id that emitted the close event.
21
+ */
22
+ handleClosed(id) {
23
+ this.modalService.close(id);
24
+ }
25
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ModalHostComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
26
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: ModalHostComponent, isStandalone: true, selector: "tae-modal-host", ngImport: i0, template: "@for (modal of modalsSignal().values(); track modal.id) {\n <tae-modal [modal]=\"modal\" (closed)=\"handleClosed($event)\" />\n}\n", styles: [":host{display:contents}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: ModalComponent, selector: "tae-modal", inputs: ["modal"], outputs: ["closed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
27
+ }
28
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ModalHostComponent, decorators: [{
29
+ type: Component,
30
+ args: [{ selector: 'tae-modal-host', imports: [CommonModule, ModalComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "@for (modal of modalsSignal().values(); track modal.id) {\n <tae-modal [modal]=\"modal\" (closed)=\"handleClosed($event)\" />\n}\n", styles: [":host{display:contents}\n"] }]
31
+ }] });
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtaG9zdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3RlZ2VsLWFuZ3VsYXItZXh0ZW5zaW9ucy9zcmMvbGliL21vZGFsL2NvbXBvbmVudHMvbW9kYWwtaG9zdC9tb2RhbC1ob3N0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdGVnZWwtYW5ndWxhci1leHRlbnNpb25zL3NyYy9saWIvbW9kYWwvY29tcG9uZW50cy9tb2RhbC1ob3N0L21vZGFsLWhvc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7O0FBRTFEOzs7OztHQUtHO0FBUUgsTUFBTSxPQUFPLGtCQUFrQjtJQUNaLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7SUFFckQ7O09BRUc7SUFDTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7SUFFakQ7OztPQUdHO0lBQ0gsWUFBWSxDQUFDLEVBQVU7UUFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUIsQ0FBQzt3R0FkVSxrQkFBa0I7NEZBQWxCLGtCQUFrQiwwRUNsQi9CLHFJQUdBLGtGRFlZLFlBQVksK0JBQUUsY0FBYzs7NEZBRzNCLGtCQUFrQjtrQkFQOUIsU0FBUzsrQkFDRSxnQkFBZ0IsV0FHakIsQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLG1CQUN0Qix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTW9kYWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbW9kYWwuc2VydmljZSc7XG5pbXBvcnQgeyBNb2RhbENvbXBvbmVudCB9IGZyb20gJy4uL21vZGFsL21vZGFsLmNvbXBvbmVudCc7XG5cbi8qKlxuICogSG9zdHMgYW5kIHJlbmRlcnMgYWxsIGFjdGl2ZSBtb2RhbHMuXG4gKlxuICogVGhlIGhvc3QgbGlzdGVucyBmb3IgY2xvc2UgZXZlbnRzIGZyb20gZWFjaCBtb2RhbCBpbnN0YW5jZSBhbmRcbiAqIGZvcndhcmRzIHRoZW0gdG8gdGhlIG1vZGFsIHNlcnZpY2UsIHdoaWNoIG93bnMgbW9kYWwgbGlmZWN5Y2xlLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0YWUtbW9kYWwtaG9zdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tb2RhbC1ob3N0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbW9kYWwtaG9zdC5jb21wb25lbnQuc2NzcyddLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNb2RhbENvbXBvbmVudF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBNb2RhbEhvc3RDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IG1vZGFsU2VydmljZSA9IGluamVjdChNb2RhbFNlcnZpY2UpO1xuXG4gIC8qKlxuICAgKiBNYXAgb2YgYWN0aXZlIG1vZGFscyBrZXllZCBieSBpZC5cbiAgICovXG4gIHJlYWRvbmx5IG1vZGFsc1NpZ25hbCA9IHRoaXMubW9kYWxTZXJ2aWNlLm1vZGFscztcblxuICAvKipcbiAgICogSGFuZGxlcyBjbG9zZSBldmVudHMgZnJvbSBjaGlsZCBtb2RhbCBjb21wb25lbnRzLlxuICAgKiBAcGFyYW0gaWQgTW9kYWwgaWQgdGhhdCBlbWl0dGVkIHRoZSBjbG9zZSBldmVudC5cbiAgICovXG4gIGhhbmRsZUNsb3NlZChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tb2RhbFNlcnZpY2UuY2xvc2UoaWQpO1xuICB9XG59XG4iLCJAZm9yIChtb2RhbCBvZiBtb2RhbHNTaWduYWwoKS52YWx1ZXMoKTsgdHJhY2sgbW9kYWwuaWQpIHtcbiAgPHRhZS1tb2RhbCBbbW9kYWxdPVwibW9kYWxcIiAoY2xvc2VkKT1cImhhbmRsZUNsb3NlZCgkZXZlbnQpXCIgLz5cbn1cbiJdfQ==