@mcp-monorepo/ics 1.2.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/ics-parser/errors.d.ts +16 -0
  2. package/dist/ics-parser/errors.d.ts.map +1 -0
  3. package/dist/ics-parser/errors.js +31 -0
  4. package/dist/ics-parser/errors.js.map +1 -0
  5. package/dist/ics-parser/event-expander.d.ts +71 -0
  6. package/dist/ics-parser/event-expander.d.ts.map +1 -0
  7. package/dist/ics-parser/event-expander.js +328 -0
  8. package/dist/ics-parser/event-expander.js.map +1 -0
  9. package/dist/ics-parser/index.d.ts +67 -0
  10. package/dist/ics-parser/index.d.ts.map +1 -0
  11. package/dist/ics-parser/index.js +91 -0
  12. package/dist/ics-parser/index.js.map +1 -0
  13. package/dist/ics-parser/parser.d.ts +26 -0
  14. package/dist/ics-parser/parser.d.ts.map +1 -0
  15. package/dist/ics-parser/parser.js +99 -0
  16. package/dist/ics-parser/parser.js.map +1 -0
  17. package/dist/ics-parser/property-parsers.d.ts +66 -0
  18. package/dist/ics-parser/property-parsers.d.ts.map +1 -0
  19. package/dist/ics-parser/property-parsers.js +226 -0
  20. package/dist/ics-parser/property-parsers.js.map +1 -0
  21. package/dist/ics-parser/rrule-expander.d.ts +10 -0
  22. package/dist/ics-parser/rrule-expander.d.ts.map +1 -0
  23. package/dist/ics-parser/rrule-expander.js +305 -0
  24. package/dist/ics-parser/rrule-expander.js.map +1 -0
  25. package/dist/ics-parser/timezone-processor.d.ts +40 -0
  26. package/dist/ics-parser/timezone-processor.d.ts.map +1 -0
  27. package/dist/ics-parser/timezone-processor.js +219 -0
  28. package/dist/ics-parser/timezone-processor.js.map +1 -0
  29. package/dist/ics-parser/types.d.ts +119 -0
  30. package/dist/ics-parser/types.d.ts.map +1 -0
  31. package/dist/ics-parser/types.js +2 -0
  32. package/dist/ics-parser/types.js.map +1 -0
  33. package/dist/ics-parser/utils.d.ts +16 -0
  34. package/dist/ics-parser/utils.d.ts.map +1 -0
  35. package/dist/ics-parser/utils.js +19 -0
  36. package/dist/ics-parser/utils.js.map +1 -0
  37. package/dist/index.js +5 -3
  38. package/dist/index.js.map +1 -1
  39. package/dist/lib/config.d.ts +10 -0
  40. package/dist/lib/config.d.ts.map +1 -0
  41. package/dist/lib/config.js +39 -0
  42. package/dist/lib/config.js.map +1 -0
  43. package/dist/lib/event-store-2.d.ts +11 -0
  44. package/dist/lib/event-store-2.d.ts.map +1 -0
  45. package/dist/lib/event-store-2.js +90 -0
  46. package/dist/lib/event-store-2.js.map +1 -0
  47. package/dist/lib/format-date.d.ts +7 -1
  48. package/dist/lib/format-date.d.ts.map +1 -1
  49. package/dist/lib/format-date.js +9 -4
  50. package/dist/lib/format-date.js.map +1 -1
  51. package/dist/lib/types.d.ts +0 -42
  52. package/dist/lib/types.d.ts.map +1 -1
  53. package/dist/tools/fetch-events.d.ts.map +1 -1
  54. package/dist/tools/fetch-events.js +31 -26
  55. package/dist/tools/fetch-events.js.map +1 -1
  56. package/dist/tools/search-events.d.ts.map +1 -1
  57. package/dist/tools/search-events.js +50 -17
  58. package/dist/tools/search-events.js.map +1 -1
  59. package/package.json +11 -9
  60. package/dist/lib/event-store.d.ts +0 -20
  61. package/dist/lib/event-store.d.ts.map +0 -1
  62. package/dist/lib/event-store.js +0 -107
  63. package/dist/lib/event-store.js.map +0 -1
  64. package/dist/lib/filter-events.d.ts +0 -3
  65. package/dist/lib/filter-events.d.ts.map +0 -1
  66. package/dist/lib/filter-events.js +0 -10
  67. package/dist/lib/filter-events.js.map +0 -1
  68. package/dist/lib/recurrrence.d.ts +0 -3
  69. package/dist/lib/recurrrence.d.ts.map +0 -1
  70. package/dist/lib/recurrrence.js +0 -70
  71. package/dist/lib/recurrrence.js.map +0 -1
@@ -0,0 +1,305 @@
1
+ import { DateTime } from 'luxon';
2
+ import { InvalidRruleError } from './errors.js';
3
+ const weekdayMap = { MO: 1, TU: 2, WE: 3, TH: 4, FR: 5, SA: 6, SU: 7 };
4
+ const weekdayReverseMap = { 1: 'MO', 2: 'TU', 3: 'WE', 4: 'TH', 5: 'FR', 6: 'SA', 7: 'SU' };
5
+ // --- Validation and Low-Level Helpers (largely unchanged) ---
6
+ function validateRule(rule) {
7
+ const nonEmptyAndInRange = (arr, min, max) => !arr || arr.every((n) => Number.isInteger(n) && n >= min && n <= max);
8
+ if (!rule.freq) {
9
+ throw new InvalidRruleError('RRULE: FREQ is required.');
10
+ }
11
+ if (rule.interval !== undefined && (!Number.isInteger(rule.interval) || rule.interval <= 0)) {
12
+ throw new InvalidRruleError('RRULE: INTERVAL must be a positive integer.');
13
+ }
14
+ if (!nonEmptyAndInRange(rule.bymonth, 1, 12)) {
15
+ throw new InvalidRruleError('RRULE: BYMONTH must be in 1..12.');
16
+ }
17
+ if (rule.bymonthday &&
18
+ !rule.bymonthday.every((n) => Number.isInteger(n) && ((n >= 1 && n <= 31) || (n <= -1 && n >= -31)))) {
19
+ throw new InvalidRruleError('RRULE: BYMONTHDAY must be in 1..31 or -31..-1.');
20
+ }
21
+ if (rule.byyearday &&
22
+ !rule.byyearday.every((n) => Number.isInteger(n) && ((n >= 1 && n <= 366) || (n <= -1 && n >= -366)))) {
23
+ throw new InvalidRruleError('RRULE: BYYEARDAY must be in 1..366 or -366..-1.');
24
+ }
25
+ if (rule.byweekno &&
26
+ !rule.byweekno.every((n) => Number.isInteger(n) && ((n >= 1 && n <= 53) || (n <= -1 && n >= -53)))) {
27
+ throw new InvalidRruleError('RRULE: BYWEEKNO must be in 1..53 or -53..-1.');
28
+ }
29
+ if (!nonEmptyAndInRange(rule.byhour, 0, 23))
30
+ throw new InvalidRruleError('RRULE: BYHOUR must be in 0..23.');
31
+ if (!nonEmptyAndInRange(rule.byminute, 0, 59))
32
+ throw new InvalidRruleError('RRULE: BYMINUTE must be in 0..59.');
33
+ if (!nonEmptyAndInRange(rule.bysecond, 0, 60))
34
+ throw new InvalidRruleError('RRULE: BYSECOND must be in 0..60.');
35
+ if (rule.bysetpos &&
36
+ !rule.bysetpos.every((n) => Number.isInteger(n) && ((n >= 1 && n <= 366) || (n <= -1 && n >= -366)))) {
37
+ throw new InvalidRruleError('RRULE: BYSETPOS must be 1..366 or -366..-1.');
38
+ }
39
+ if (rule.wkst && !(rule.wkst in weekdayMap)) {
40
+ throw new InvalidRruleError('RRULE: WKST must be one of MO,TU,WE,TH,FR,SA,SU.');
41
+ }
42
+ }
43
+ function applyBySetPos(candidates, bysetpos) {
44
+ if (candidates.length === 0)
45
+ return [];
46
+ const result = [];
47
+ for (const pos of bysetpos) {
48
+ const index = pos > 0 ? pos - 1 : candidates.length + pos;
49
+ if (index >= 0 && index < candidates.length) {
50
+ result.push(candidates[index]);
51
+ }
52
+ }
53
+ const seen = new Set();
54
+ return result
55
+ .filter((d) => {
56
+ const ts = d.toMillis();
57
+ if (seen.has(ts))
58
+ return false;
59
+ seen.add(ts);
60
+ return true;
61
+ })
62
+ .sort((a, b) => a.toMillis() - b.toMillis());
63
+ }
64
+ // --- Core Refactored Expansion Logic ---
65
+ /**
66
+ * **REFACTORED**: A generator that expands a recurrence rule into a sequence of dates.
67
+ * This implementation uses an "iterative advancement" strategy to avoid generating
68
+ * huge arrays of candidates, making it significantly more performant.
69
+ * @param options - The start date of the event series (`rangeStart`), the rule, and the query `rangeEnd`.
70
+ */
71
+ export function* expandRrule(options) {
72
+ const { dtstart, rule, rangeStart, rangeEnd } = options;
73
+ validateRule(rule);
74
+ let cursor = dtstart;
75
+ let count = 0;
76
+ const interval = rule.interval ?? 1;
77
+ const wkst = rule.wkst ? weekdayMap[rule.wkst] : 1; // Monday default
78
+ // Main loop: advances the cursor by the specified FREQ and INTERVAL.
79
+ while (true) {
80
+ if ((rule.count !== undefined && count >= rule.count) || (rule.until && cursor > rule.until) || cursor > rangeEnd) {
81
+ break;
82
+ }
83
+ // Generate valid occurrences only for the current period (e.g., this month, this week).
84
+ const occurrencesInPeriod = generateCandidatesForPeriod(cursor, dtstart, rule, wkst);
85
+ for (const occurrence of occurrencesInPeriod) {
86
+ // Filter out dates before the series start or after query/rule end.
87
+ if (occurrence < dtstart)
88
+ continue;
89
+ if ((rule.until && occurrence > rule.until) || occurrence > rangeEnd)
90
+ continue;
91
+ if (rule.count !== undefined && count >= rule.count)
92
+ break;
93
+ if (occurrence.isValid) {
94
+ yield occurrence;
95
+ count++;
96
+ }
97
+ }
98
+ // Advance the cursor to the start of the next period to avoid redundant calculations.
99
+ cursor = advanceCursor(cursor, rule.freq, interval);
100
+ }
101
+ }
102
+ /**
103
+ * **REFACTORED**: Generates candidate dates for a single period (year, month, week, or day)
104
+ * using a targeted approach instead of "generate and filter".
105
+ */
106
+ function generateCandidatesForPeriod(cursor, dtstart, rule, wkst) {
107
+ // 1. Expand Dates: Generate a small, targeted set of days for the period.
108
+ const days = expandDatesInPeriod(cursor, dtstart, rule, wkst);
109
+ // 2. Expand Times: Apply time components to the generated days.
110
+ const times = expandTimes(days, dtstart, rule);
111
+ // 3. Apply BYSETPOS: This is the only filter that needs a complete, sorted set for the period.
112
+ if (rule.bysetpos) {
113
+ // Sort before applying bysetpos.
114
+ times.sort((a, b) => a.toMillis() - b.toMillis());
115
+ return applyBySetPos(times, rule.bysetpos);
116
+ }
117
+ return times;
118
+ }
119
+ /**
120
+ * **NEW**: Intelligently expands the date components for the current period.
121
+ * This is the core of the performance improvement.
122
+ */
123
+ function expandDatesInPeriod(cursor, dtstart, rule, wkst) {
124
+ switch (rule.freq) {
125
+ case 'YEARLY': {
126
+ if (rule.byweekno) {
127
+ // Per RFC 5545, BYWEEKNO is only valid with FREQ=YEARLY]. It is used
128
+ // with BYDAY to select specific days within those weeks.
129
+ const dates = [];
130
+ const year = cursor.year;
131
+ const bydayRule = rule.byday?.map((r) => weekdayMap[r.weekday]) ?? [dtstart.weekday];
132
+ // Luxon's weeksInWeekYear gives the number of weeks in the ISO week-numbering year.
133
+ const weeksInYear = cursor.weeksInWeekYear;
134
+ for (const wn of rule.byweekno) {
135
+ // Handle negative week numbers (e.g., -1 is the last week of the year).
136
+ const weekNumber = wn > 0 ? wn : weeksInYear + wn + 1;
137
+ if (weekNumber < 1 || weekNumber > weeksInYear)
138
+ continue;
139
+ for (const targetWeekday of bydayRule) {
140
+ // Create a date from the ISO week year, week number, and weekday.
141
+ // This correctly handles ISO 8601 week definitions.
142
+ const date = DateTime.fromObject({
143
+ weekYear: year,
144
+ weekNumber: weekNumber,
145
+ weekday: targetWeekday,
146
+ }, { zone: cursor.zone });
147
+ // Ensure the generated date falls within the correct calendar year,
148
+ // as ISO weeks can cross year boundaries.
149
+ if (date.isValid && date.year === year) {
150
+ dates.push(date);
151
+ }
152
+ }
153
+ }
154
+ // The RFC specifies that BYMONTH filters the results of previous rules [1].
155
+ if (rule.bymonth) {
156
+ const monthSet = new Set(rule.bymonth);
157
+ // Return only the dates that fall in the specified months.
158
+ const filtered = dates.filter((d) => monthSet.has(d.month));
159
+ filtered.sort((a, b) => a.toMillis() - b.toMillis());
160
+ return filtered;
161
+ }
162
+ // Sort dates chronologically before returning.
163
+ dates.sort((a, b) => a.toMillis() - b.toMillis());
164
+ return dates;
165
+ }
166
+ const months = rule.bymonth ?? [dtstart.month];
167
+ const dates = [];
168
+ for (const month of months) {
169
+ const monthCursor = cursor.set({ month });
170
+ dates.push(...getDaysInScope(monthCursor, dtstart, rule));
171
+ }
172
+ return dates;
173
+ }
174
+ case 'MONTHLY':
175
+ return getDaysInScope(cursor, dtstart, rule);
176
+ case 'WEEKLY': {
177
+ const startOfWeek = cursor.set({ weekday: wkst });
178
+ const weekDays = Array.from({ length: 7 }, (_, i) => startOfWeek.plus({ days: i }));
179
+ const bydayRule = rule.byday?.map((r) => r.weekday) ?? [weekdayReverseMap[dtstart.weekday]];
180
+ return weekDays.filter((d) => bydayRule.includes(weekdayReverseMap[d.weekday]));
181
+ }
182
+ default: // DAILY, HOURLY, MINUTELY, SECONDLY
183
+ return [cursor];
184
+ }
185
+ }
186
+ /**
187
+ * **NEW**: Helper to get valid days within a scope (e.g., a month),
188
+ * respecting BYDAY, BYMONTHDAY, etc.
189
+ */
190
+ function getDaysInScope(cursor, dtstart, rule) {
191
+ const monthStart = cursor.startOf('month');
192
+ const daysInMonth = cursor.daysInMonth;
193
+ if (!daysInMonth)
194
+ return [];
195
+ const results = new Set();
196
+ // Handle BYYEARDAY if present (for YEARLY rules)
197
+ if (rule.byyearday) {
198
+ for (const yd of rule.byyearday) {
199
+ const dayOfYear = yd > 0 ? yd : cursor.daysInYear + yd + 1;
200
+ const date = cursor.startOf('year').plus({ days: dayOfYear - 1 });
201
+ // Ensure we only add days within the current month being processed
202
+ if (date.month === cursor.month) {
203
+ results.add(date);
204
+ }
205
+ }
206
+ return Array.from(results);
207
+ }
208
+ // Handle BYDAY
209
+ if (rule.byday) {
210
+ for (const byday of rule.byday) {
211
+ const targetWday = weekdayMap[byday.weekday];
212
+ if (byday.n) {
213
+ // Ordinal day, e.g., 2MO (2nd Monday), -1SU (last Sunday)
214
+ const daysOfMonth = Array.from({ length: daysInMonth }, (_, i) => monthStart.plus({ days: i }));
215
+ const matchingDays = daysOfMonth.filter((d) => d.weekday === targetWday);
216
+ const index = byday.n > 0 ? byday.n - 1 : matchingDays.length + byday.n;
217
+ if (index >= 0 && index < matchingDays.length) {
218
+ results.add(matchingDays[index]);
219
+ }
220
+ }
221
+ else {
222
+ // All days of this type, e.g., all Mondays
223
+ for (let i = 0; i < daysInMonth; i++) {
224
+ const date = monthStart.plus({ days: i });
225
+ if (date.weekday === targetWday) {
226
+ results.add(date);
227
+ }
228
+ }
229
+ }
230
+ }
231
+ }
232
+ // Handle BYMONTHDAY
233
+ if (rule.bymonthday) {
234
+ for (const md of rule.bymonthday) {
235
+ const day = md > 0 ? md : daysInMonth + md + 1;
236
+ if (day > 0 && day <= daysInMonth) {
237
+ results.add(monthStart.set({ day }));
238
+ }
239
+ }
240
+ }
241
+ // If no day-related BY... rules, infer from DTSTART
242
+ if (!rule.byday && !rule.bymonthday && !rule.byyearday) {
243
+ const day = Math.min(dtstart.day, daysInMonth);
244
+ results.add(monthStart.set({ day }));
245
+ }
246
+ // If both BYDAY and BYMONTHDAY are present, results should be the intersection.
247
+ // This is implicitly handled because we're adding to a Set. The logic
248
+ // would need to be more complex for a true intersection, but this covers many cases.
249
+ // A simple approach is to filter one by the other.
250
+ if (rule.byday && rule.bymonthday) {
251
+ const monthDaySet = new Set(rule.bymonthday.map((md) => (md > 0 ? md : daysInMonth + md + 1)));
252
+ return Array.from(results).filter((d) => monthDaySet.has(d.day));
253
+ }
254
+ return Array.from(results);
255
+ }
256
+ /**
257
+ * **NEW**: Applies time components to a set of dates.
258
+ */
259
+ function expandTimes(dates, dtstart, rule) {
260
+ if (dates.length === 0)
261
+ return [];
262
+ // If frequency is smaller than daily, time expansion is handled by the cursor advancement.
263
+ if (['HOURLY', 'MINUTELY', 'SECONDLY'].includes(rule.freq)) {
264
+ return dates;
265
+ }
266
+ const hours = rule.byhour ?? [dtstart.hour];
267
+ const minutes = rule.byminute ?? [dtstart.minute];
268
+ const seconds = rule.bysecond ?? [dtstart.second];
269
+ const results = [];
270
+ for (const d of dates) {
271
+ for (const hour of hours) {
272
+ for (const minute of minutes) {
273
+ for (const second of seconds) {
274
+ results.push(d.set({ hour, minute, second, millisecond: dtstart.millisecond }));
275
+ }
276
+ }
277
+ }
278
+ }
279
+ return results;
280
+ }
281
+ /**
282
+ * **NEW**: Advances the cursor to the start of the next period to process.
283
+ */
284
+ function advanceCursor(cursor, freq, interval) {
285
+ switch (freq) {
286
+ case 'YEARLY':
287
+ return cursor.plus({ years: interval }).startOf('year');
288
+ case 'MONTHLY':
289
+ return cursor.plus({ months: interval }).startOf('month');
290
+ case 'WEEKLY':
291
+ return cursor.plus({ weeks: interval }).startOf('week');
292
+ case 'DAILY':
293
+ return cursor.plus({ days: interval }).startOf('day');
294
+ case 'HOURLY':
295
+ return cursor.plus({ hours: interval }).startOf('hour');
296
+ case 'MINUTELY':
297
+ return cursor.plus({ minutes: interval }).startOf('minute');
298
+ case 'SECONDLY':
299
+ return cursor.plus({ seconds: interval }).startOf('second');
300
+ default:
301
+ // Should not happen due to validation, but prevents infinite loops.
302
+ return cursor.plus({ years: 999 });
303
+ }
304
+ }
305
+ //# sourceMappingURL=rrule-expander.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rrule-expander.js","sourceRoot":"","sources":["../../src/ics-parser/rrule-expander.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAuB,MAAM,OAAO,CAAA;AAErD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAG/C,MAAM,UAAU,GAAoC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAA;AACvG,MAAM,iBAAiB,GAA4B,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAA;AAEpH,+DAA+D;AAE/D,SAAS,YAAY,CAAC,IAAoB;IACxC,MAAM,kBAAkB,GAAG,CAAC,GAAyB,EAAE,GAAW,EAAE,GAAW,EAAE,EAAE,CACjF,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,CAAA;IAEvE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,IAAI,iBAAiB,CAAC,0BAA0B,CAAC,CAAA;IACzD,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC;QAC5F,MAAM,IAAI,iBAAiB,CAAC,6CAA6C,CAAC,CAAA;IAC5E,CAAC;IACD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,iBAAiB,CAAC,kCAAkC,CAAC,CAAA;IACjE,CAAC;IACD,IACE,IAAI,CAAC,UAAU;QACf,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EACpG,CAAC;QACD,MAAM,IAAI,iBAAiB,CAAC,gDAAgD,CAAC,CAAA;IAC/E,CAAC;IACD,IACE,IAAI,CAAC,SAAS;QACd,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EACrG,CAAC;QACD,MAAM,IAAI,iBAAiB,CAAC,iDAAiD,CAAC,CAAA;IAChF,CAAC;IACD,IACE,IAAI,CAAC,QAAQ;QACb,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAClG,CAAC;QACD,MAAM,IAAI,iBAAiB,CAAC,8CAA8C,CAAC,CAAA;IAC7E,CAAC;IACD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAAE,MAAM,IAAI,iBAAiB,CAAC,iCAAiC,CAAC,CAAA;IAC3G,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAAE,MAAM,IAAI,iBAAiB,CAAC,mCAAmC,CAAC,CAAA;IAC/G,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAAE,MAAM,IAAI,iBAAiB,CAAC,mCAAmC,CAAC,CAAA;IAC/G,IACE,IAAI,CAAC,QAAQ;QACb,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EACpG,CAAC;QACD,MAAM,IAAI,iBAAiB,CAAC,6CAA6C,CAAC,CAAA;IAC5E,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,iBAAiB,CAAC,kDAAkD,CAAC,CAAA;IACjF,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,UAAsB,EAAE,QAAkB;IAC/D,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IACtC,MAAM,MAAM,GAAe,EAAE,CAAA;IAC7B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAA;QACzD,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;YAC5C,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA;QAChC,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,OAAO,MAAM;SACV,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACZ,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAA;QACvB,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO,KAAK,CAAA;QAC9B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACZ,OAAO,IAAI,CAAA;IACb,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;AAChD,CAAC;AAED,0CAA0C;AAE1C;;;;;GAKG;AACH,MAAM,SAAS,CAAC,CAAC,WAAW,CAAC,OAAqB;IAChD,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAA;IACvD,YAAY,CAAC,IAAI,CAAC,CAAA;IAElB,IAAI,MAAM,GAAG,OAAO,CAAA;IACpB,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAA;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAC,iBAAiB;IAEpE,qEAAqE;IACrE,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,MAAM,GAAG,QAAQ,EAAE,CAAC;YAClH,MAAK;QACP,CAAC;QAED,wFAAwF;QACxF,MAAM,mBAAmB,GAAG,2BAA2B,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;QAEpF,KAAK,MAAM,UAAU,IAAI,mBAAmB,EAAE,CAAC;YAC7C,oEAAoE;YACpE,IAAI,UAAU,GAAG,OAAO;gBAAE,SAAQ;YAClC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,UAAU,GAAG,QAAQ;gBAAE,SAAQ;YAC9E,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK;gBAAE,MAAK;YAE1D,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACvB,MAAM,UAAU,CAAA;gBAChB,KAAK,EAAE,CAAA;YACT,CAAC;QACH,CAAC;QAED,sFAAsF;QACtF,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IACrD,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,2BAA2B,CAClC,MAAgB,EAChB,OAAiB,EACjB,IAAoB,EACpB,IAAoB;IAEpB,0EAA0E;IAC1E,MAAM,IAAI,GAAG,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;IAE7D,gEAAgE;IAChE,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;IAE9C,+FAA+F;IAC/F,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,iCAAiC;QACjC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;QACjD,OAAO,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC5C,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAC1B,MAAgB,EAChB,OAAiB,EACjB,IAAoB,EACpB,IAAoB;IAEpB,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,qEAAqE;gBACrE,yDAAyD;gBACzD,MAAM,KAAK,GAAe,EAAE,CAAA;gBAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;gBACxB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAyB,CAAC,CAAA;gBACtG,oFAAoF;gBACpF,MAAM,WAAW,GAAG,MAAM,CAAC,eAAe,CAAA;gBAE1C,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAC/B,wEAAwE;oBACxE,MAAM,UAAU,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,EAAE,GAAG,CAAC,CAAA;oBAErD,IAAI,UAAU,GAAG,CAAC,IAAI,UAAU,GAAG,WAAW;wBAAE,SAAQ;oBAExD,KAAK,MAAM,aAAa,IAAI,SAAS,EAAE,CAAC;wBACtC,kEAAkE;wBAClE,oDAAoD;wBACpD,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAC9B;4BACE,QAAQ,EAAE,IAAI;4BACd,UAAU,EAAE,UAAU;4BACtB,OAAO,EAAE,aAAa;yBACvB,EACD,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CACtB,CAAA;wBAED,oEAAoE;wBACpE,0CAA0C;wBAC1C,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;4BACvC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;wBAClB,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,4EAA4E;gBAC5E,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBACjB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;oBACtC,2DAA2D;oBAC3D,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;oBAC3D,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;oBACpD,OAAO,QAAQ,CAAA;gBACjB,CAAC;gBAED,+CAA+C;gBAC/C,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;gBACjD,OAAO,KAAK,CAAA;YACd,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YAC9C,MAAM,KAAK,GAAe,EAAE,CAAA;YAC5B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;gBACzC,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAA;YAC3D,CAAC;YACD,OAAO,KAAK,CAAA;QACd,CAAC;QACD,KAAK,SAAS;YACZ,OAAO,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;QAC9C,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;YACjD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YACnF,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;YAC3F,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QACjF,CAAC;QACD,SAAS,oCAAoC;YAC3C,OAAO,CAAC,MAAM,CAAC,CAAA;IACnB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,MAAgB,EAAE,OAAiB,EAAE,IAAoB;IAC/E,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAC1C,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAA;IACtC,IAAI,CAAC,WAAW;QAAE,OAAO,EAAE,CAAA;IAE3B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAY,CAAA;IAEnC,iDAAiD;IACjD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAChC,MAAM,SAAS,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,GAAG,EAAE,GAAG,CAAC,CAAA;YAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,GAAG,CAAC,EAAE,CAAC,CAAA;YACjE,mEAAmE;YACnE,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACnB,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC;IAED,eAAe;IACf,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC/B,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YAC5C,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC;gBACZ,0DAA0D;gBAC1D,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;gBAC/F,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,CAAA;gBACxE,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAA;gBACvE,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC;oBAC9C,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAA;gBAClC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,2CAA2C;gBAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;oBACrC,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;oBACzC,IAAI,IAAI,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;wBAChC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;oBACnB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,EAAE,GAAG,CAAC,CAAA;YAC9C,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;gBAClC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;YACtC,CAAC;QACH,CAAC;IACH,CAAC;IAED,oDAAoD;IACpD,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAA;QAC9C,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;IACtC,CAAC;IAED,gFAAgF;IAChF,sEAAsE;IACtE,qFAAqF;IACrF,mDAAmD;IACnD,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QAClC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9F,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IAClE,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AAC5B,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,KAAiB,EAAE,OAAiB,EAAE,IAAoB;IAC7E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAEjC,2FAA2F;IAC3F,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3D,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAEjD,MAAM,OAAO,GAAe,EAAE,CAAA;IAC9B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;oBAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;gBACjF,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,MAAgB,EAAE,IAAU,EAAE,QAAgB;IACnE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QACzD,KAAK,SAAS;YACZ,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QAC3D,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QACzD,KAAK,OAAO;YACV,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACvD,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QACzD,KAAK,UAAU;YACb,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QAC7D,KAAK,UAAU;YACb,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QAC7D;YACE,oEAAoE;YACpE,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;IACtC,CAAC;AACH,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { DateTime } from 'luxon';
2
+ import { type TimeZoneData, type TimeZoneObservance, type TimeZoneResolver, type TimeZoneTransition, type VComponent } from './types.js';
3
+ /**
4
+ * Processes a single VTIMEZONE component into a structured TimeZoneData object.
5
+ * This function collects the raw observance rules but does not expand them.
6
+ * @param tzComponent - The VTIMEZONE component to process.
7
+ * @returns A structured TimeZoneData object or undefined if the component is invalid.
8
+ */
9
+ export declare function processVTimeZone(tzComponent: VComponent): {
10
+ tzid: string;
11
+ data: TimeZoneData;
12
+ } | undefined;
13
+ /**
14
+ * Creates a map of all timezone definitions from VTIMEZONE components.
15
+ * @param timezones - An array of VTIMEZONE components.
16
+ * @returns A map from TZID to structured TimeZoneData.
17
+ */
18
+ export declare function buildTimeZoneData(timezones: VComponent[]): Map<string, TimeZoneData>;
19
+ /**
20
+ * Expands a single TimeZoneObservance into a list of its transitions.
21
+ * @param observance - The observance to expand.
22
+ * @param rangeEnd - The end of the expansion range.
23
+ * @returns A list of transitions.
24
+ */
25
+ export declare function expandObservanceTransitions(observance: TimeZoneObservance, rangeEnd: DateTime): TimeZoneTransition[];
26
+ /**
27
+ * Finds the correct UTC offset for a given local time within a pre-processed timezone definition.
28
+ * This function dynamically expands recurrence rules to find the correct transition.
29
+ * @param localTime - The local DateTime for which to find the offset.
30
+ * @param tzInfo - The pre-processed timezone data.
31
+ * @returns The applicable UTC offset in minutes.
32
+ */
33
+ export declare function findOffset(localTime: DateTime, tzInfo: TimeZoneData): number;
34
+ /**
35
+ * Creates a resolver function that can determine the UTC offset for any given local time and TZID.
36
+ * @param tzData - The pre-built map of all timezone definitions.
37
+ * @returns A TimeZoneResolver function.
38
+ */
39
+ export declare function createTimeZoneResolver(tzData: Map<string, TimeZoneData>): TimeZoneResolver;
40
+ //# sourceMappingURL=timezone-processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timezone-processor.d.ts","sourceRoot":"","sources":["../../src/ics-parser/timezone-processor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAmB,MAAM,OAAO,CAAA;AAKjD,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,UAAU,EAChB,MAAM,YAAY,CAAA;AAQnB;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,YAAY,CAAA;CAAE,GAAG,SAAS,CAiC1G;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAWpF;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,kBAAkB,EAAE,QAAQ,EAAE,QAAQ,GAAG,kBAAkB,EAAE,CA2CpH;AAsED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAqC5E;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,gBAAgB,CAc1F"}
@@ -0,0 +1,219 @@
1
+ import { DateTime, FixedOffsetZone } from 'luxon';
2
+ import { InvalidObservanceError, TimeZoneDefinitionNotFoundError } from './errors.js';
3
+ import { parseDateTimeList, parseOffset, parseRruleString } from './property-parsers.js';
4
+ import { expandRrule } from './rrule-expander.js';
5
+ import { findProperty, findProperties } from './utils.js';
6
+ /**
7
+ * Buffer for expanding transitions into the future.
8
+ */
9
+ const EXPANSION_RANGE_BUFFER_YEARS = 1;
10
+ /**
11
+ * Processes a single VTIMEZONE component into a structured TimeZoneData object.
12
+ * This function collects the raw observance rules but does not expand them.
13
+ * @param tzComponent - The VTIMEZONE component to process.
14
+ * @returns A structured TimeZoneData object or undefined if the component is invalid.
15
+ */
16
+ export function processVTimeZone(tzComponent) {
17
+ const tzidProp = findProperty(tzComponent, 'TZID');
18
+ if (!tzidProp)
19
+ return undefined;
20
+ const tzid = tzidProp.value;
21
+ const observances = [];
22
+ const url = findProperty(tzComponent, 'TZURL')?.value;
23
+ for (const sub of tzComponent.subComponents) {
24
+ if (sub.type !== 'STANDARD' && sub.type !== 'DAYLIGHT')
25
+ continue;
26
+ const dtstartProp = findProperty(sub, 'DTSTART');
27
+ const offsetToProp = findProperty(sub, 'TZOFFSETTO');
28
+ const offsetFromProp = findProperty(sub, 'TZOFFSETFROM');
29
+ // DTSTART, TZOFFSETTO, and TZOFFSETFROM are required for each observance rule.
30
+ if (!dtstartProp || !offsetToProp || !offsetFromProp)
31
+ continue;
32
+ observances.push({
33
+ dtstart: dtstartProp.value,
34
+ offsetTo: parseOffset(offsetToProp.value),
35
+ offsetFrom: parseOffset(offsetFromProp.value),
36
+ rrule: findProperty(sub, 'RRULE')?.value,
37
+ rdates: findProperties(sub, 'RDATE'),
38
+ });
39
+ }
40
+ // Per RFC 5545, a VTIMEZONE MUST have at least one STANDARD or DAYLIGHT sub-component.
41
+ if (observances.length === 0) {
42
+ return undefined;
43
+ }
44
+ return { tzid, data: { observances, url } };
45
+ }
46
+ /**
47
+ * Creates a map of all timezone definitions from VTIMEZONE components.
48
+ * @param timezones - An array of VTIMEZONE components.
49
+ * @returns A map from TZID to structured TimeZoneData.
50
+ */
51
+ export function buildTimeZoneData(timezones) {
52
+ const tzData = new Map();
53
+ for (const tz of timezones) {
54
+ const processed = processVTimeZone(tz);
55
+ if (processed) {
56
+ // NOTE: For full TZURL support, one would fetch and parse the URL here
57
+ // if the initial `processed.data.observances` is empty or outdated.
58
+ tzData.set(processed.tzid, processed.data);
59
+ }
60
+ }
61
+ return tzData;
62
+ }
63
+ /**
64
+ * Expands a single TimeZoneObservance into a list of its transitions.
65
+ * @param observance - The observance to expand.
66
+ * @param rangeEnd - The end of the expansion range.
67
+ * @returns A list of transitions.
68
+ */
69
+ export function expandObservanceTransitions(observance, rangeEnd) {
70
+ const transitions = [];
71
+ const localTransitionStart = DateTime.fromFormat(observance.dtstart, "yyyyMMdd'T'HHmmss", { zone: 'local' });
72
+ const utcTransitionStart = localTransitionStart
73
+ .setZone(FixedOffsetZone.instance(observance.offsetFrom), { keepLocalTime: true })
74
+ .toUTC();
75
+ // If the first transition is after our range, there are no occurrences to add.
76
+ if (utcTransitionStart > rangeEnd) {
77
+ return [];
78
+ }
79
+ // Add transitions from RRULE properties
80
+ if (observance.rrule) {
81
+ const rule = parseRruleString(observance.rrule);
82
+ const occurrences = expandRrule({
83
+ dtstart: utcTransitionStart,
84
+ rule,
85
+ rangeEnd,
86
+ });
87
+ for (const occ of occurrences) {
88
+ transitions.push({ transitionTime: occ, offsetTo: observance.offsetTo });
89
+ }
90
+ }
91
+ else {
92
+ // Add the primary DTSTART transition
93
+ transitions.push({ transitionTime: utcTransitionStart, offsetTo: observance.offsetTo });
94
+ }
95
+ // Add transitions from RDATE properties
96
+ for (const rdateProp of observance.rdates) {
97
+ for (const localRDateTime of parseDateTimeList(rdateProp)) {
98
+ // RDATE must be interpreted relative to the TZOFFSETFROM.
99
+ const utcRDateTime = localRDateTime
100
+ .setZone(FixedOffsetZone.instance(observance.offsetFrom), { keepLocalTime: true })
101
+ .toUTC();
102
+ if (utcRDateTime <= rangeEnd) {
103
+ transitions.push({ transitionTime: utcRDateTime, offsetTo: observance.offsetTo });
104
+ }
105
+ }
106
+ }
107
+ return transitions;
108
+ }
109
+ /**
110
+ * The core logic for finding an offset, assuming transitions have been pre-calculated.
111
+ * @private
112
+ */
113
+ function findOffsetWithTransitions(localTime, tzInfo, transitions, initialOffset) {
114
+ // Determine potential UTC times for the given local time using all unique offsets.
115
+ const allOffsets = [
116
+ ...new Set(transitions.map((t) => t.offsetTo).concat(tzInfo.observances.map((o) => o.offsetFrom))),
117
+ ];
118
+ const potentialUTCTimes = allOffsets.map((offset) => ({
119
+ offset,
120
+ utcTime: localTime.setZone(FixedOffsetZone.instance(offset), { keepLocalTime: true }),
121
+ }));
122
+ const validInterpretations = potentialUTCTimes
123
+ .map(({ offset, utcTime }) => {
124
+ const lastTransition = transitions.filter((t) => t.transitionTime <= utcTime).pop();
125
+ const effectiveOffset = lastTransition ? lastTransition.offsetTo : initialOffset;
126
+ // A valid interpretation is when the assumed offset matches the effective offset after the transition.
127
+ if (effectiveOffset === offset) {
128
+ return { utcTime, offset };
129
+ }
130
+ return undefined;
131
+ })
132
+ .filter((v) => v !== undefined)
133
+ .sort((a, b) => a.utcTime.toMillis() - b.utcTime.toMillis());
134
+ if (validInterpretations.length === 1) {
135
+ return validInterpretations[0].offset; // Unambiguous time
136
+ }
137
+ if (validInterpretations.length > 1) {
138
+ return validInterpretations[0].offset; // Ambiguous time (fall back), use first occurrence
139
+ }
140
+ // No valid interpretations means the time is in a "gap" (spring forward).
141
+ // Per RFC 5545, we should use the offset from before the gap.
142
+ // We can find this by identifying the transition that would have just occurred.
143
+ // The 'correct' UTC time would be just after this transition.
144
+ // The earliest potential UTC time is the one calculated with the largest offset (e.g., -0400 vs -0500).
145
+ const earliestPotentialUTC = DateTime.max(...potentialUTCTimes.map((p) => p.utcTime));
146
+ const transitionBeforeGap = earliestPotentialUTC !== undefined
147
+ ? transitions.filter((t) => t.transitionTime <= earliestPotentialUTC).pop()
148
+ : undefined;
149
+ if (transitionBeforeGap) {
150
+ // We need the offset *before* this transition. We find the observance that created it.
151
+ for (const obs of tzInfo.observances) {
152
+ if (obs.offsetTo === transitionBeforeGap.offsetTo) {
153
+ // This is a candidate. To be more certain, we could check if transitionBeforeGap
154
+ // is one of the expanded dates of this observance, but that is slow.
155
+ // A simple heuristic is that the `offsetFrom` of this observance is the one we want.
156
+ return obs.offsetFrom;
157
+ }
158
+ }
159
+ }
160
+ return initialOffset; // Fallback
161
+ }
162
+ const transitionCache = new Map();
163
+ /**
164
+ * Finds the correct UTC offset for a given local time within a pre-processed timezone definition.
165
+ * This function dynamically expands recurrence rules to find the correct transition.
166
+ * @param localTime - The local DateTime for which to find the offset.
167
+ * @param tzInfo - The pre-processed timezone data.
168
+ * @returns The applicable UTC offset in minutes.
169
+ */
170
+ export function findOffset(localTime, tzInfo) {
171
+ if (tzInfo.observances.length === 0) {
172
+ throw new InvalidObservanceError();
173
+ }
174
+ const cacheKey = JSON.stringify(tzInfo.observances);
175
+ if (!transitionCache.has(cacheKey)) {
176
+ // We need a reasonable, very large range to pre-calculate all transitions we might need.
177
+ // Events far in the future might need this. Let's say 100 years from now.
178
+ const expansionRangeEnd = DateTime.now().plus({ years: 10 });
179
+ transitionCache.set(cacheKey, tzInfo.observances
180
+ .flatMap((obs) => expandObservanceTransitions(obs, expansionRangeEnd))
181
+ .sort((a, b) => a.transitionTime.toMillis() - b.transitionTime.toMillis()));
182
+ }
183
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
184
+ const transitions = transitionCache.get(cacheKey);
185
+ // Determine the offset for any time before the very first transition.
186
+ const getInitialOffset = () => {
187
+ // Find the earliest rule and use its `offsetFrom`.
188
+ const firstObservance = tzInfo.observances.reduce((earliest, current) => {
189
+ return current.dtstart < earliest.dtstart ? current : earliest;
190
+ });
191
+ return firstObservance.offsetFrom;
192
+ };
193
+ const initialOffset = getInitialOffset();
194
+ if (transitions.length === 0 || localTime < transitions[0].transitionTime) {
195
+ return initialOffset;
196
+ }
197
+ return findOffsetWithTransitions(localTime, tzInfo, transitions, initialOffset);
198
+ }
199
+ /**
200
+ * Creates a resolver function that can determine the UTC offset for any given local time and TZID.
201
+ * @param tzData - The pre-built map of all timezone definitions.
202
+ * @returns A TimeZoneResolver function.
203
+ */
204
+ export function createTimeZoneResolver(tzData) {
205
+ return (localTime, tzid) => {
206
+ if (!localTime.isValid) {
207
+ throw new Error('Invalid input DateTime');
208
+ }
209
+ const tzInfo = tzData.get(tzid);
210
+ if (!tzInfo) {
211
+ if (Intl.supportedValuesOf('timeZone').includes(tzid)) {
212
+ return localTime.setZone(tzid, { keepLocalTime: true }).offset;
213
+ }
214
+ throw new TimeZoneDefinitionNotFoundError(tzid);
215
+ }
216
+ return findOffset(localTime, tzInfo);
217
+ };
218
+ }
219
+ //# sourceMappingURL=timezone-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timezone-processor.js","sourceRoot":"","sources":["../../src/ics-parser/timezone-processor.ts"],"names":[],"mappings":"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"}