unified-video-framework 1.4.52 → 1.4.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "unified-video-framework",
3
- "version": "1.4.52",
3
+ "version": "1.4.53",
4
4
  "description": "Cross-platform video player framework supporting iOS, Android, Web, Smart TVs (Samsung/LG), Roku, and more",
5
5
  "main": "packages/core/dist/index.js",
6
6
  "types": "packages/core/dist/index.d.ts",
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ import type { EPGProps } from '../types/EPGTypes';
3
+ export declare const EPGOverlay: React.FC<EPGProps>;
4
+ export default EPGOverlay;
5
+ //# sourceMappingURL=EPGOverlay-improved-positioning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EPGOverlay-improved-positioning.d.ts","sourceRoot":"","sources":["../../../src/react/components/EPGOverlay-improved-positioning.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAC;AACjF,OAAO,KAAK,EAAE,QAAQ,EAAuE,MAAM,mBAAmB,CAAC;AAkCvH,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,CA6iBzC,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,415 @@
1
+ import React, { useState, useEffect, useCallback, useMemo, useRef } from 'react';
2
+ import { calculateOptimalTimeRange, getProgramsInRange } from "../utils/EPGUtils.js";
3
+ import EPGNavigationControls from "./EPGNavigationControls.js";
4
+ import EPGTimelineHeader from "./EPGTimelineHeader.js";
5
+ import EPGProgramGrid from "./EPGProgramGrid.js";
6
+ import EPGProgramDetails from "./EPGProgramDetails.js";
7
+ const DEFAULT_CONFIG = {
8
+ timeSlotDuration: 60,
9
+ visibleHours: 4,
10
+ enableInfiniteScroll: true,
11
+ lazyLoadThreshold: 200,
12
+ showChannelLogos: true,
13
+ showProgramImages: true,
14
+ compactMode: false,
15
+ };
16
+ export const EPGOverlay = ({ data, config: userConfig = {}, visible = true, onToggle, className = '', style = {}, }) => {
17
+ const overlayRef = useRef(null);
18
+ const [updateTrigger, setUpdateTrigger] = useState(0);
19
+ const [timelineScrollLeft, setTimelineScrollLeft] = useState(0);
20
+ const config = useMemo(() => ({
21
+ ...DEFAULT_CONFIG,
22
+ ...userConfig,
23
+ }), [userConfig]);
24
+ const [state, setState] = useState(() => {
25
+ const currentTime = Date.now();
26
+ const { start, end } = calculateOptimalTimeRange(currentTime, config.visibleHours);
27
+ return {
28
+ selectedProgram: null,
29
+ selectedChannel: null,
30
+ timelineStart: start,
31
+ timelineEnd: end,
32
+ containerWidth: 2400,
33
+ visibleHours: config.visibleHours,
34
+ currentTime,
35
+ isLoading: false,
36
+ error: null,
37
+ };
38
+ });
39
+ useEffect(() => {
40
+ const interval = setInterval(() => {
41
+ setState(prev => ({
42
+ ...prev,
43
+ currentTime: Date.now(),
44
+ }));
45
+ }, 60000);
46
+ return () => clearInterval(interval);
47
+ }, []);
48
+ const containerWidth = useMemo(() => {
49
+ return state.visibleHours * 600;
50
+ }, [state.visibleHours]);
51
+ const filteredData = useMemo(() => {
52
+ if (!data?.timeline)
53
+ return [];
54
+ return getProgramsInRange(data.timeline, state.timelineStart, state.timelineEnd, 1);
55
+ }, [data?.timeline, state.timelineStart, state.timelineEnd]);
56
+ const getSmartModalPosition = useCallback(() => {
57
+ const basePosition = {
58
+ position: 'absolute',
59
+ width: '400px',
60
+ maxHeight: '65%',
61
+ zIndex: 200,
62
+ borderRadius: '12px',
63
+ overflow: 'hidden',
64
+ boxShadow: '0 12px 48px rgba(0, 0, 0, 0.7)',
65
+ backdropFilter: 'blur(8px)',
66
+ animation: 'modalSlideIn 0.3s cubic-bezier(0.4, 0, 0.2, 1)',
67
+ };
68
+ return {
69
+ ...basePosition,
70
+ top: '60px',
71
+ right: '20px',
72
+ '@media (max-width: 1200px)': {
73
+ width: '350px',
74
+ top: '40px',
75
+ },
76
+ '@media (max-width: 900px)': {
77
+ position: 'fixed',
78
+ top: '50%',
79
+ left: '50%',
80
+ right: 'auto',
81
+ transform: 'translate(-50%, -50%)',
82
+ width: '90vw',
83
+ maxWidth: '400px',
84
+ maxHeight: '80vh',
85
+ },
86
+ };
87
+ }, []);
88
+ const handleNavigate = useCallback(async (direction) => {
89
+ setState(prev => ({ ...prev, isLoading: true, error: null }));
90
+ try {
91
+ let newStart;
92
+ let newEnd;
93
+ if (direction === 'today') {
94
+ const { start, end } = calculateOptimalTimeRange(Date.now(), state.visibleHours);
95
+ newStart = start;
96
+ newEnd = end;
97
+ }
98
+ else {
99
+ const timeShift = state.visibleHours * 60 * 60 * 1000;
100
+ if (direction === 'left') {
101
+ newStart = state.timelineStart - timeShift;
102
+ newEnd = state.timelineEnd - timeShift;
103
+ }
104
+ else {
105
+ newStart = state.timelineStart + timeShift;
106
+ newEnd = state.timelineEnd + timeShift;
107
+ }
108
+ }
109
+ setState(prev => ({
110
+ ...prev,
111
+ timelineStart: newStart,
112
+ timelineEnd: newEnd,
113
+ containerWidth: prev.visibleHours * 600,
114
+ isLoading: false,
115
+ }));
116
+ setUpdateTrigger(prev => prev + 1);
117
+ }
118
+ catch (error) {
119
+ setState(prev => ({
120
+ ...prev,
121
+ error: error instanceof Error ? error.message : 'Navigation failed',
122
+ isLoading: false,
123
+ }));
124
+ }
125
+ }, [state.visibleHours, state.timelineStart, state.timelineEnd]);
126
+ const handleTimeRangeChange = useCallback((hours) => {
127
+ const { start, end } = calculateOptimalTimeRange(state.currentTime, hours);
128
+ setState(prev => ({
129
+ ...prev,
130
+ visibleHours: hours,
131
+ timelineStart: start,
132
+ timelineEnd: end,
133
+ containerWidth: hours * 600,
134
+ }));
135
+ setUpdateTrigger(prev => prev + 1);
136
+ }, [state.currentTime]);
137
+ const handleProgramSelect = useCallback((program, channel) => {
138
+ setState(prev => ({
139
+ ...prev,
140
+ selectedProgram: program,
141
+ selectedChannel: channel,
142
+ }));
143
+ if (config.onProgramSelect) {
144
+ config.onProgramSelect(program, channel);
145
+ }
146
+ }, [config]);
147
+ const handleChannelSelect = useCallback((channel) => {
148
+ setState(prev => ({
149
+ ...prev,
150
+ selectedChannel: channel,
151
+ }));
152
+ if (config.onChannelSelect) {
153
+ config.onChannelSelect(channel);
154
+ }
155
+ }, [config]);
156
+ const handleAction = useCallback(async (action) => {
157
+ setState(prev => ({ ...prev, isLoading: true, error: null }));
158
+ try {
159
+ switch (action.type) {
160
+ case 'favorite':
161
+ if (config.onFavorite) {
162
+ await config.onFavorite(action.program, action.channel);
163
+ }
164
+ break;
165
+ case 'record':
166
+ if (config.onRecord) {
167
+ await config.onRecord(action.program, action.channel);
168
+ }
169
+ break;
170
+ case 'reminder':
171
+ if (config.onSetReminder) {
172
+ await config.onSetReminder(action.program, action.channel);
173
+ }
174
+ break;
175
+ case 'catchup':
176
+ if (config.onCatchup) {
177
+ await config.onCatchup(action.program, action.channel);
178
+ }
179
+ break;
180
+ }
181
+ if (filteredData && state.selectedProgram) {
182
+ const updatedProgram = { ...state.selectedProgram };
183
+ switch (action.type) {
184
+ case 'favorite':
185
+ updatedProgram.isFavorite = !updatedProgram.isFavorite;
186
+ break;
187
+ case 'record':
188
+ updatedProgram.isRecording = !updatedProgram.isRecording;
189
+ break;
190
+ case 'reminder':
191
+ updatedProgram.hasReminder = !updatedProgram.hasReminder;
192
+ break;
193
+ }
194
+ setState(prev => ({
195
+ ...prev,
196
+ selectedProgram: updatedProgram,
197
+ isLoading: false,
198
+ }));
199
+ }
200
+ else {
201
+ setState(prev => ({ ...prev, isLoading: false }));
202
+ }
203
+ }
204
+ catch (error) {
205
+ setState(prev => ({
206
+ ...prev,
207
+ error: error instanceof Error ? error.message : 'Action failed',
208
+ isLoading: false,
209
+ }));
210
+ }
211
+ }, [config, filteredData, state.selectedProgram]);
212
+ const handleTimelineScroll = useCallback((scrollLeft) => {
213
+ setTimelineScrollLeft(scrollLeft);
214
+ }, []);
215
+ const handleProgramGridScroll = useCallback((scrollLeft) => {
216
+ setTimelineScrollLeft(scrollLeft);
217
+ }, []);
218
+ const handleTimeClick = useCallback((timestamp) => {
219
+ const newStart = timestamp - (state.visibleHours * 30 * 60 * 1000);
220
+ const newEnd = newStart + (state.visibleHours * 60 * 60 * 1000);
221
+ setState(prev => ({
222
+ ...prev,
223
+ timelineStart: newStart,
224
+ timelineEnd: newEnd,
225
+ }));
226
+ setUpdateTrigger(prev => prev + 1);
227
+ }, [state.visibleHours]);
228
+ const handleCloseDetails = useCallback(() => {
229
+ setState(prev => ({
230
+ ...prev,
231
+ selectedProgram: null,
232
+ }));
233
+ }, []);
234
+ useEffect(() => {
235
+ const handleKeyPress = (e) => {
236
+ if (!visible)
237
+ return;
238
+ switch (e.key) {
239
+ case 'ArrowLeft':
240
+ e.preventDefault();
241
+ handleNavigate('left');
242
+ break;
243
+ case 'ArrowRight':
244
+ e.preventDefault();
245
+ handleNavigate('right');
246
+ break;
247
+ case 'Home':
248
+ e.preventDefault();
249
+ handleNavigate('today');
250
+ break;
251
+ case 'Escape':
252
+ if (state.selectedProgram) {
253
+ e.preventDefault();
254
+ handleCloseDetails();
255
+ }
256
+ break;
257
+ }
258
+ };
259
+ if (visible) {
260
+ document.addEventListener('keydown', handleKeyPress);
261
+ }
262
+ return () => {
263
+ document.removeEventListener('keydown', handleKeyPress);
264
+ };
265
+ }, [visible, handleNavigate, handleCloseDetails, state.selectedProgram]);
266
+ if (!visible)
267
+ return null;
268
+ const canNavigateLeft = true;
269
+ const canNavigateRight = true;
270
+ return (React.createElement("div", { ref: overlayRef, className: `epg-overlay ${className}`, style: {
271
+ position: 'fixed',
272
+ top: '35%',
273
+ left: 0,
274
+ right: 0,
275
+ bottom: 0,
276
+ backgroundColor: '#0a0a0a',
277
+ color: '#fff',
278
+ zIndex: 100,
279
+ display: 'flex',
280
+ flexDirection: 'column',
281
+ overflow: 'hidden',
282
+ ...style,
283
+ } },
284
+ React.createElement(EPGNavigationControls, { onNavigate: handleNavigate, onTimeRangeChange: handleTimeRangeChange, canNavigateLeft: canNavigateLeft, canNavigateRight: canNavigateRight, currentTime: state.currentTime, timelineStart: state.timelineStart, timelineEnd: state.timelineEnd, visibleHours: state.visibleHours }),
285
+ React.createElement(EPGTimelineHeader, { timelineStart: state.timelineStart, timelineEnd: state.timelineEnd, containerWidth: containerWidth, currentTime: state.currentTime, visibleHours: state.visibleHours, slotDuration: config.timeSlotDuration, onTimeClick: handleTimeClick, scrollLeft: timelineScrollLeft, onScroll: handleTimelineScroll }),
286
+ React.createElement("div", { className: "epg-main-content", style: {
287
+ flex: 1,
288
+ display: 'flex',
289
+ overflow: 'hidden',
290
+ position: 'relative',
291
+ } },
292
+ React.createElement(EPGProgramGrid, { data: filteredData, timelineStart: state.timelineStart, timelineEnd: state.timelineEnd, containerWidth: containerWidth, currentTime: state.currentTime, selectedProgram: state.selectedProgram, onProgramSelect: handleProgramSelect, onChannelSelect: handleChannelSelect, onTimelineScroll: handleProgramGridScroll, timelineScrollLeft: timelineScrollLeft, channelHeight: 80, visibleChannels: 6, style: { flex: 1 } }),
293
+ state.selectedProgram && (React.createElement("div", { className: "epg-details-panel", style: getSmartModalPosition() },
294
+ React.createElement(EPGProgramDetails, { program: state.selectedProgram, channel: state.selectedChannel || undefined, onClose: handleCloseDetails, onAction: handleAction, isModal: false, currentTime: state.currentTime })))),
295
+ state.isLoading && (React.createElement("div", { className: "epg-loading-overlay", style: {
296
+ position: 'absolute',
297
+ top: 0,
298
+ left: 0,
299
+ right: 0,
300
+ bottom: 0,
301
+ backgroundColor: 'rgba(0, 0, 0, 0.5)',
302
+ display: 'flex',
303
+ alignItems: 'center',
304
+ justifyContent: 'center',
305
+ zIndex: 300,
306
+ } },
307
+ React.createElement("div", { style: {
308
+ color: '#fff',
309
+ fontSize: '18px',
310
+ fontWeight: '600',
311
+ } }, "Loading..."))),
312
+ state.error && (React.createElement("div", { className: "epg-error-message", style: {
313
+ position: 'absolute',
314
+ top: '20px',
315
+ left: '50%',
316
+ transform: 'translateX(-50%)',
317
+ backgroundColor: '#e74c3c',
318
+ color: '#fff',
319
+ padding: '12px 20px',
320
+ borderRadius: '8px',
321
+ fontSize: '14px',
322
+ fontWeight: '600',
323
+ zIndex: 400,
324
+ maxWidth: '400px',
325
+ textAlign: 'center',
326
+ boxShadow: '0 4px 12px rgba(231, 76, 60, 0.3)',
327
+ } },
328
+ state.error,
329
+ React.createElement("button", { onClick: () => setState(prev => ({ ...prev, error: null })), style: {
330
+ marginLeft: '12px',
331
+ backgroundColor: 'transparent',
332
+ border: 'none',
333
+ color: '#fff',
334
+ cursor: 'pointer',
335
+ fontSize: '16px',
336
+ padding: '0',
337
+ } }, "\u00D7"))),
338
+ React.createElement("style", null, `
339
+ @keyframes slideInRight {
340
+ from {
341
+ transform: translateX(100%);
342
+ opacity: 0;
343
+ }
344
+ to {
345
+ transform: translateX(0);
346
+ opacity: 1;
347
+ }
348
+ }
349
+
350
+ @keyframes modalSlideIn {
351
+ from {
352
+ transform: translateY(-30px);
353
+ opacity: 0;
354
+ scale: 0.9;
355
+ }
356
+ to {
357
+ transform: translateY(0);
358
+ opacity: 1;
359
+ scale: 1;
360
+ }
361
+ }
362
+
363
+ .epg-overlay * {
364
+ box-sizing: border-box;
365
+ }
366
+
367
+ .epg-overlay::-webkit-scrollbar {
368
+ width: 8px;
369
+ height: 8px;
370
+ }
371
+
372
+ .epg-overlay::-webkit-scrollbar-track {
373
+ background: #1a1a1a;
374
+ }
375
+
376
+ .epg-overlay::-webkit-scrollbar-thumb {
377
+ background: #444;
378
+ border-radius: 4px;
379
+ }
380
+
381
+ .epg-overlay::-webkit-scrollbar-thumb:hover {
382
+ background: #666;
383
+ }
384
+
385
+ /* Enhanced modal styling */
386
+ .epg-details-panel {
387
+ backdrop-filter: blur(16px);
388
+ background: linear-gradient(135deg, rgba(26, 26, 26, 0.95), rgba(42, 42, 42, 0.95));
389
+ border: 1px solid rgba(255, 255, 255, 0.1);
390
+ }
391
+
392
+ /* Responsive modal positioning */
393
+ @media (max-width: 1200px) {
394
+ .epg-details-panel {
395
+ width: 350px !important;
396
+ top: 40px !important;
397
+ }
398
+ }
399
+
400
+ @media (max-width: 900px) {
401
+ .epg-details-panel {
402
+ position: fixed !important;
403
+ top: 50% !important;
404
+ left: 50% !important;
405
+ right: auto !important;
406
+ transform: translate(-50%, -50%) !important;
407
+ width: 90vw !important;
408
+ max-width: 400px !important;
409
+ max-height: 80vh !important;
410
+ }
411
+ }
412
+ `)));
413
+ };
414
+ export default EPGOverlay;
415
+ //# sourceMappingURL=EPGOverlay-improved-positioning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EPGOverlay-improved-positioning.js","sourceRoot":"","sources":["../../../src/react/components/EPGOverlay-improved-positioning.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"EPGOverlay.d.ts","sourceRoot":"","sources":["../../../src/react/components/EPGOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAC;AACjF,OAAO,KAAK,EAAE,QAAQ,EAAuE,MAAM,mBAAmB,CAAC;AAkCvH,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,CAuezC,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"EPGOverlay.d.ts","sourceRoot":"","sources":["../../../src/react/components/EPGOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAC;AACjF,OAAO,KAAK,EAAE,QAAQ,EAAuE,MAAM,mBAAmB,CAAC;AAkCvH,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,CA+gBzC,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -102,6 +102,22 @@ export const EPGOverlay = ({ data, config: userConfig = {}, visible = true, onTo
102
102
  }));
103
103
  setUpdateTrigger(prev => prev + 1);
104
104
  }, [state.currentTime]);
105
+ const getModalPosition = useCallback(() => {
106
+ if (!overlayRef.current) {
107
+ return { top: '20px', right: '20px' };
108
+ }
109
+ const overlayRect = overlayRef.current.getBoundingClientRect();
110
+ const modalWidth = 400;
111
+ const modalHeight = 400;
112
+ const rightSpace = overlayRect.width - modalWidth - 40;
113
+ const topSpace = overlayRect.height - modalHeight - 40;
114
+ let position = {
115
+ top: Math.max(20, Math.min(topSpace / 2, 80)),
116
+ right: rightSpace > 0 ? '20px' : 'auto',
117
+ left: rightSpace > 0 ? 'auto' : '20px',
118
+ };
119
+ return position;
120
+ }, []);
105
121
  const handleProgramSelect = useCallback((program, channel) => {
106
122
  setState(prev => ({
107
123
  ...prev,
@@ -260,12 +276,15 @@ export const EPGOverlay = ({ data, config: userConfig = {}, visible = true, onTo
260
276
  React.createElement(EPGProgramGrid, { data: filteredData, timelineStart: state.timelineStart, timelineEnd: state.timelineEnd, containerWidth: containerWidth, currentTime: state.currentTime, selectedProgram: state.selectedProgram, onProgramSelect: handleProgramSelect, onChannelSelect: handleChannelSelect, onTimelineScroll: handleProgramGridScroll, timelineScrollLeft: timelineScrollLeft, channelHeight: 80, visibleChannels: 6, style: { flex: 1 } }),
261
277
  state.selectedProgram && (React.createElement("div", { className: "epg-details-panel", style: {
262
278
  position: 'absolute',
263
- bottom: '20px',
279
+ top: '60px',
264
280
  right: '20px',
265
281
  width: '400px',
266
- maxHeight: '60%',
282
+ maxHeight: '70%',
267
283
  zIndex: 200,
268
- animation: 'slideInRight 0.3s ease-out',
284
+ animation: 'slideInFromTop 0.3s ease-out',
285
+ boxShadow: '0 8px 32px rgba(0, 0, 0, 0.6)',
286
+ borderRadius: '12px',
287
+ overflow: 'hidden',
269
288
  } },
270
289
  React.createElement(EPGProgramDetails, { program: state.selectedProgram, channel: state.selectedChannel || undefined, onClose: handleCloseDetails, onAction: handleAction, isModal: false, currentTime: state.currentTime })))),
271
290
  state.isLoading && (React.createElement("div", { className: "epg-loading-overlay", style: {
@@ -323,6 +342,19 @@ export const EPGOverlay = ({ data, config: userConfig = {}, visible = true, onTo
323
342
  }
324
343
  }
325
344
 
345
+ @keyframes slideInFromTop {
346
+ from {
347
+ transform: translateY(-20px);
348
+ opacity: 0;
349
+ scale: 0.95;
350
+ }
351
+ to {
352
+ transform: translateY(0);
353
+ opacity: 1;
354
+ scale: 1;
355
+ }
356
+ }
357
+
326
358
  .epg-overlay * {
327
359
  box-sizing: border-box;
328
360
  }
@@ -1 +1 @@
1
- {"version":3,"file":"EPGOverlay.js","sourceRoot":"","sources":["../../../src/react/components/EPGOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAEjF,OAAO,EACL,yBAAyB,EAGzB,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AAEpD,MAAM,cAAc,GAAc;IAChC,gBAAgB,EAAE,EAAE;IACpB,YAAY,EAAE,CAAC;IACf,oBAAoB,EAAE,IAAI;IAC1B,iBAAiB,EAAE,GAAG;IACtB,gBAAgB,EAAE,IAAI;IACtB,iBAAiB,EAAE,IAAI;IACvB,WAAW,EAAE,KAAK;CACnB,CAAC;AAcF,MAAM,CAAC,MAAM,UAAU,GAAuB,CAAC,EAC7C,IAAI,EACJ,MAAM,EAAE,UAAU,GAAG,EAAE,EACvB,OAAO,GAAG,IAAI,EACd,QAAQ,EACR,SAAS,GAAG,EAAE,EACd,KAAK,GAAG,EAAE,GACX,EAAE,EAAE;IACH,MAAM,UAAU,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAChD,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAGhE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC5B,GAAG,cAAc;QACjB,GAAG,UAAU;KACd,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAGlB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAkB,GAAG,EAAE;QACvD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC/B,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,yBAAyB,CAAC,WAAW,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;QAEnF,OAAO;YACL,eAAe,EAAE,IAAI;YACrB,eAAe,EAAE,IAAI;YACrB,aAAa,EAAE,KAAK;YACpB,WAAW,EAAE,GAAG;YAChB,cAAc,EAAE,IAAI;YACpB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,WAAW;YACX,SAAS,EAAE,KAAK;YAChB,KAAK,EAAE,IAAI;SACZ,CAAC;IACJ,CAAC,CAAC,CAAC;IAGH,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;YAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAChB,GAAG,IAAI;gBACP,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;aACxB,CAAC,CAAC,CAAC;QACN,CAAC,EAAE,KAAK,CAAC,CAAC;QAEV,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC,EAAE,EAAE,CAAC,CAAC;IAGP,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,EAAE;QAClC,OAAO,KAAK,CAAC,YAAY,GAAG,GAAG,CAAC;IAClC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;IAGzB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE;QAChC,IAAI,CAAC,IAAI,EAAE,QAAQ;YAAE,OAAO,EAAE,CAAC;QAE/B,OAAO,kBAAkB,CACvB,IAAI,CAAC,QAAQ,EACb,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,WAAW,EACjB,CAAC,CACF,CAAC;IACJ,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IAG7D,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,EAAE,SAAqC,EAAE,EAAE;QACjF,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAE9D,IAAI;YACF,IAAI,QAAgB,CAAC;YACrB,IAAI,MAAc,CAAC;YAEnB,IAAI,SAAS,KAAK,OAAO,EAAE;gBACzB,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,yBAAyB,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;gBACjF,QAAQ,GAAG,KAAK,CAAC;gBACjB,MAAM,GAAG,GAAG,CAAC;aACd;iBAAM;gBACL,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;gBACtD,IAAI,SAAS,KAAK,MAAM,EAAE;oBACxB,QAAQ,GAAG,KAAK,CAAC,aAAa,GAAG,SAAS,CAAC;oBAC3C,MAAM,GAAG,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC;iBACxC;qBAAM;oBACL,QAAQ,GAAG,KAAK,CAAC,aAAa,GAAG,SAAS,CAAC;oBAC3C,MAAM,GAAG,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC;iBACxC;aACF;YAED,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAChB,GAAG,IAAI;gBACP,aAAa,EAAE,QAAQ;gBACvB,WAAW,EAAE,MAAM;gBACnB,cAAc,EAAE,IAAI,CAAC,YAAY,GAAG,GAAG;gBACvC,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC,CAAC;YAGJ,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;SAEpC;QAAC,OAAO,KAAK,EAAE;YACd,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAChB,GAAG,IAAI;gBACP,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB;gBACnE,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC,CAAC;SACL;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IAGjE,MAAM,qBAAqB,GAAG,WAAW,CAAC,CAAC,KAAa,EAAE,EAAE;QAC1D,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,yBAAyB,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAE3E,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChB,GAAG,IAAI;YACP,YAAY,EAAE,KAAK;YACnB,aAAa,EAAE,KAAK;YACpB,WAAW,EAAE,GAAG;YAChB,cAAc,EAAE,KAAK,GAAG,GAAG;SAC5B,CAAC,CAAC,CAAC;QAEJ,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IACrC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IAGxB,MAAM,mBAAmB,GAAG,WAAW,CAAC,CAAC,OAAmB,EAAE,OAAsB,EAAE,EAAE;QACtF,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChB,GAAG,IAAI;YACP,eAAe,EAAE,OAAO;YACxB,eAAe,EAAE,OAAO;SACzB,CAAC,CAAC,CAAC;QAGJ,IAAI,MAAM,CAAC,eAAe,EAAE;YAC1B,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;SAC1C;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAGb,MAAM,mBAAmB,GAAG,WAAW,CAAC,CAAC,OAAsB,EAAE,EAAE;QACjE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChB,GAAG,IAAI;YACP,eAAe,EAAE,OAAO;SACzB,CAAC,CAAC,CAAC;QAGJ,IAAI,MAAM,CAAC,eAAe,EAAE;YAC1B,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;SACjC;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAGb,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,EAAE,MAAiB,EAAE,EAAE;QAC3D,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAE9D,IAAI;YACF,QAAQ,MAAM,CAAC,IAAI,EAAE;gBACnB,KAAK,UAAU;oBACb,IAAI,MAAM,CAAC,UAAU,EAAE;wBACrB,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;qBACzD;oBACD,MAAM;gBACR,KAAK,QAAQ;oBACX,IAAI,MAAM,CAAC,QAAQ,EAAE;wBACnB,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;qBACvD;oBACD,MAAM;gBACR,KAAK,UAAU;oBACb,IAAI,MAAM,CAAC,aAAa,EAAE;wBACxB,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;qBAC5D;oBACD,MAAM;gBACR,KAAK,SAAS;oBACZ,IAAI,MAAM,CAAC,SAAS,EAAE;wBACpB,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;qBACxD;oBACD,MAAM;aACT;YAGD,IAAI,YAAY,IAAI,KAAK,CAAC,eAAe,EAAE;gBACzC,MAAM,cAAc,GAAG,EAAE,GAAG,KAAK,CAAC,eAAe,EAAE,CAAC;gBACpD,QAAQ,MAAM,CAAC,IAAI,EAAE;oBACnB,KAAK,UAAU;wBACb,cAAc,CAAC,UAAU,GAAG,CAAC,cAAc,CAAC,UAAU,CAAC;wBACvD,MAAM;oBACR,KAAK,QAAQ;wBACX,cAAc,CAAC,WAAW,GAAG,CAAC,cAAc,CAAC,WAAW,CAAC;wBACzD,MAAM;oBACR,KAAK,UAAU;wBACb,cAAc,CAAC,WAAW,GAAG,CAAC,cAAc,CAAC,WAAW,CAAC;wBACzD,MAAM;iBACT;gBAED,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAChB,GAAG,IAAI;oBACP,eAAe,EAAE,cAAc;oBAC/B,SAAS,EAAE,KAAK;iBACjB,CAAC,CAAC,CAAC;aACL;iBAAM;gBACL,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;aACnD;SACF;QAAC,OAAO,KAAK,EAAE;YACd,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAChB,GAAG,IAAI;gBACP,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;gBAC/D,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC,CAAC;SACL;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;IAGlD,MAAM,oBAAoB,GAAG,WAAW,CAAC,CAAC,UAAkB,EAAE,EAAE;QAC9D,qBAAqB,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC,EAAE,EAAE,CAAC,CAAC;IAGP,MAAM,uBAAuB,GAAG,WAAW,CAAC,CAAC,UAAkB,EAAE,EAAE;QACjE,qBAAqB,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC,EAAE,EAAE,CAAC,CAAC;IAGP,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,SAAiB,EAAE,EAAE;QACxD,MAAM,QAAQ,GAAG,SAAS,GAAG,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,QAAQ,GAAG,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAEhE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChB,GAAG,IAAI;YACP,aAAa,EAAE,QAAQ;YACvB,WAAW,EAAE,MAAM;SACpB,CAAC,CAAC,CAAC;QAEJ,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IACrC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;IAGzB,MAAM,kBAAkB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC1C,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChB,GAAG,IAAI;YACP,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC,CAAC;IACN,CAAC,EAAE,EAAE,CAAC,CAAC;IAGP,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,cAAc,GAAG,CAAC,CAAgB,EAAE,EAAE;YAC1C,IAAI,CAAC,OAAO;gBAAE,OAAO;YAErB,QAAQ,CAAC,CAAC,GAAG,EAAE;gBACb,KAAK,WAAW;oBACd,CAAC,CAAC,cAAc,EAAE,CAAC;oBACnB,cAAc,CAAC,MAAM,CAAC,CAAC;oBACvB,MAAM;gBACR,KAAK,YAAY;oBACf,CAAC,CAAC,cAAc,EAAE,CAAC;oBACnB,cAAc,CAAC,OAAO,CAAC,CAAC;oBACxB,MAAM;gBACR,KAAK,MAAM;oBACT,CAAC,CAAC,cAAc,EAAE,CAAC;oBACnB,cAAc,CAAC,OAAO,CAAC,CAAC;oBACxB,MAAM;gBACR,KAAK,QAAQ;oBACX,IAAI,KAAK,CAAC,eAAe,EAAE;wBACzB,CAAC,CAAC,cAAc,EAAE,CAAC;wBACnB,kBAAkB,EAAE,CAAC;qBACtB;oBACD,MAAM;aACT;QACH,CAAC,CAAC;QAEF,IAAI,OAAO,EAAE;YACX,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;SACtD;QAED,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QAC1D,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;IAGzE,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAG1B,MAAM,eAAe,GAAG,IAAI,CAAC;IAC7B,MAAM,gBAAgB,GAAG,IAAI,CAAC;IAE9B,OAAO,CACL,6BACE,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,eAAe,SAAS,EAAE,EACrC,KAAK,EAAE;YACL,QAAQ,EAAE,OAAO;YACjB,GAAG,EAAE,KAAK;YACV,IAAI,EAAE,CAAC;YACP,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,CAAC;YACT,eAAe,EAAE,SAAS;YAC1B,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,MAAM;YACf,aAAa,EAAE,QAAQ;YACvB,QAAQ,EAAE,QAAQ;YAClB,GAAG,KAAK;SACT;QAGD,oBAAC,qBAAqB,IACpB,UAAU,EAAE,cAAc,EAC1B,iBAAiB,EAAE,qBAAqB,EACxC,eAAe,EAAE,eAAe,EAChC,gBAAgB,EAAE,gBAAgB,EAClC,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,aAAa,EAAE,KAAK,CAAC,aAAa,EAClC,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,YAAY,EAAE,KAAK,CAAC,YAAY,GAChC;QAGF,oBAAC,iBAAiB,IAChB,aAAa,EAAE,KAAK,CAAC,aAAa,EAClC,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,YAAY,EAAE,KAAK,CAAC,YAAY,EAChC,YAAY,EAAE,MAAM,CAAC,gBAAgB,EACrC,WAAW,EAAE,eAAe,EAC5B,UAAU,EAAE,kBAAkB,EAC9B,QAAQ,EAAE,oBAAoB,GAC9B;QAGF,6BACE,SAAS,EAAC,kBAAkB,EAC5B,KAAK,EAAE;gBACL,IAAI,EAAE,CAAC;gBACP,OAAO,EAAE,MAAM;gBACf,QAAQ,EAAE,QAAQ;gBAClB,QAAQ,EAAE,UAAU;aACrB;YAGD,oBAAC,cAAc,IACb,IAAI,EAAE,YAAY,EAClB,aAAa,EAAE,KAAK,CAAC,aAAa,EAClC,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,eAAe,EAAE,KAAK,CAAC,eAAe,EACtC,eAAe,EAAE,mBAAmB,EACpC,eAAe,EAAE,mBAAmB,EACpC,gBAAgB,EAAE,uBAAuB,EACzC,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,EAAE,EAAE,EACjB,eAAe,EAAE,CAAC,EAClB,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,GAClB;YAGD,KAAK,CAAC,eAAe,IAAI,CACxB,6BACE,SAAS,EAAC,mBAAmB,EAC7B,KAAK,EAAE;oBACL,QAAQ,EAAE,UAAU;oBACpB,MAAM,EAAE,MAAM;oBACd,KAAK,EAAE,MAAM;oBACb,KAAK,EAAE,OAAO;oBACd,SAAS,EAAE,KAAK;oBAChB,MAAM,EAAE,GAAG;oBACX,SAAS,EAAE,4BAA4B;iBACxC;gBAED,oBAAC,iBAAiB,IAChB,OAAO,EAAE,KAAK,CAAC,eAAe,EAC9B,OAAO,EAAE,KAAK,CAAC,eAAe,IAAI,SAAS,EAC3C,OAAO,EAAE,kBAAkB,EAC3B,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,KAAK,EACd,WAAW,EAAE,KAAK,CAAC,WAAW,GAC9B,CACE,CACP,CACG;QAGL,KAAK,CAAC,SAAS,IAAI,CAClB,6BACE,SAAS,EAAC,qBAAqB,EAC/B,KAAK,EAAE;gBACL,QAAQ,EAAE,UAAU;gBACpB,GAAG,EAAE,CAAC;gBACN,IAAI,EAAE,CAAC;gBACP,KAAK,EAAE,CAAC;gBACR,MAAM,EAAE,CAAC;gBACT,eAAe,EAAE,oBAAoB;gBACrC,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,QAAQ;gBACpB,cAAc,EAAE,QAAQ;gBACxB,MAAM,EAAE,GAAG;aACZ;YAED,6BACE,KAAK,EAAE;oBACL,KAAK,EAAE,MAAM;oBACb,QAAQ,EAAE,MAAM;oBAChB,UAAU,EAAE,KAAK;iBAClB,iBAGG,CACF,CACP;QAGA,KAAK,CAAC,KAAK,IAAI,CACd,6BACE,SAAS,EAAC,mBAAmB,EAC7B,KAAK,EAAE;gBACL,QAAQ,EAAE,UAAU;gBACpB,GAAG,EAAE,MAAM;gBACX,IAAI,EAAE,KAAK;gBACX,SAAS,EAAE,kBAAkB;gBAC7B,eAAe,EAAE,SAAS;gBAC1B,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,WAAW;gBACpB,YAAY,EAAE,KAAK;gBACnB,QAAQ,EAAE,MAAM;gBAChB,UAAU,EAAE,KAAK;gBACjB,MAAM,EAAE,GAAG;gBACX,QAAQ,EAAE,OAAO;gBACjB,SAAS,EAAE,QAAQ;gBACnB,SAAS,EAAE,mCAAmC;aAC/C;YAEA,KAAK,CAAC,KAAK;YACZ,gCACE,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAC3D,KAAK,EAAE;oBACL,UAAU,EAAE,MAAM;oBAClB,eAAe,EAAE,aAAa;oBAC9B,MAAM,EAAE,MAAM;oBACd,KAAK,EAAE,MAAM;oBACb,MAAM,EAAE,SAAS;oBACjB,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,GAAG;iBACb,aAGM,CACL,CACP;QAGD,mCAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiCP,CAAS,CACN,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"EPGOverlay.js","sourceRoot":"","sources":["../../../src/react/components/EPGOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAEjF,OAAO,EACL,yBAAyB,EAGzB,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AAEpD,MAAM,cAAc,GAAc;IAChC,gBAAgB,EAAE,EAAE;IACpB,YAAY,EAAE,CAAC;IACf,oBAAoB,EAAE,IAAI;IAC1B,iBAAiB,EAAE,GAAG;IACtB,gBAAgB,EAAE,IAAI;IACtB,iBAAiB,EAAE,IAAI;IACvB,WAAW,EAAE,KAAK;CACnB,CAAC;AAcF,MAAM,CAAC,MAAM,UAAU,GAAuB,CAAC,EAC7C,IAAI,EACJ,MAAM,EAAE,UAAU,GAAG,EAAE,EACvB,OAAO,GAAG,IAAI,EACd,QAAQ,EACR,SAAS,GAAG,EAAE,EACd,KAAK,GAAG,EAAE,GACX,EAAE,EAAE;IACH,MAAM,UAAU,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAChD,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAGhE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC5B,GAAG,cAAc;QACjB,GAAG,UAAU;KACd,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAGlB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAkB,GAAG,EAAE;QACvD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC/B,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,yBAAyB,CAAC,WAAW,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;QAEnF,OAAO;YACL,eAAe,EAAE,IAAI;YACrB,eAAe,EAAE,IAAI;YACrB,aAAa,EAAE,KAAK;YACpB,WAAW,EAAE,GAAG;YAChB,cAAc,EAAE,IAAI;YACpB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,WAAW;YACX,SAAS,EAAE,KAAK;YAChB,KAAK,EAAE,IAAI;SACZ,CAAC;IACJ,CAAC,CAAC,CAAC;IAGH,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;YAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAChB,GAAG,IAAI;gBACP,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;aACxB,CAAC,CAAC,CAAC;QACN,CAAC,EAAE,KAAK,CAAC,CAAC;QAEV,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC,EAAE,EAAE,CAAC,CAAC;IAGP,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,EAAE;QAClC,OAAO,KAAK,CAAC,YAAY,GAAG,GAAG,CAAC;IAClC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;IAGzB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE;QAChC,IAAI,CAAC,IAAI,EAAE,QAAQ;YAAE,OAAO,EAAE,CAAC;QAE/B,OAAO,kBAAkB,CACvB,IAAI,CAAC,QAAQ,EACb,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,WAAW,EACjB,CAAC,CACF,CAAC;IACJ,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IAG7D,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,EAAE,SAAqC,EAAE,EAAE;QACjF,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAE9D,IAAI;YACF,IAAI,QAAgB,CAAC;YACrB,IAAI,MAAc,CAAC;YAEnB,IAAI,SAAS,KAAK,OAAO,EAAE;gBACzB,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,yBAAyB,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;gBACjF,QAAQ,GAAG,KAAK,CAAC;gBACjB,MAAM,GAAG,GAAG,CAAC;aACd;iBAAM;gBACL,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;gBACtD,IAAI,SAAS,KAAK,MAAM,EAAE;oBACxB,QAAQ,GAAG,KAAK,CAAC,aAAa,GAAG,SAAS,CAAC;oBAC3C,MAAM,GAAG,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC;iBACxC;qBAAM;oBACL,QAAQ,GAAG,KAAK,CAAC,aAAa,GAAG,SAAS,CAAC;oBAC3C,MAAM,GAAG,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC;iBACxC;aACF;YAED,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAChB,GAAG,IAAI;gBACP,aAAa,EAAE,QAAQ;gBACvB,WAAW,EAAE,MAAM;gBACnB,cAAc,EAAE,IAAI,CAAC,YAAY,GAAG,GAAG;gBACvC,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC,CAAC;YAGJ,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;SAEpC;QAAC,OAAO,KAAK,EAAE;YACd,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAChB,GAAG,IAAI;gBACP,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB;gBACnE,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC,CAAC;SACL;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IAGjE,MAAM,qBAAqB,GAAG,WAAW,CAAC,CAAC,KAAa,EAAE,EAAE;QAC1D,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,yBAAyB,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAE3E,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChB,GAAG,IAAI;YACP,YAAY,EAAE,KAAK;YACnB,aAAa,EAAE,KAAK;YACpB,WAAW,EAAE,GAAG;YAChB,cAAc,EAAE,KAAK,GAAG,GAAG;SAC5B,CAAC,CAAC,CAAC;QAEJ,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IACrC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IAGxB,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,EAAE;QACxC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;YACvB,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;SACvC;QAED,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;QAC/D,MAAM,UAAU,GAAG,GAAG,CAAC;QACvB,MAAM,WAAW,GAAG,GAAG,CAAC;QAGxB,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,GAAG,UAAU,GAAG,EAAE,CAAC;QACvD,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,GAAG,WAAW,GAAG,EAAE,CAAC;QAGvD,IAAI,QAAQ,GAAG;YACb,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7C,KAAK,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;YACvC,IAAI,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;SACvC,CAAC;QAEF,OAAO,QAAQ,CAAC;IAClB,CAAC,EAAE,EAAE,CAAC,CAAC;IAGP,MAAM,mBAAmB,GAAG,WAAW,CAAC,CAAC,OAAmB,EAAE,OAAsB,EAAE,EAAE;QACtF,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChB,GAAG,IAAI;YACP,eAAe,EAAE,OAAO;YACxB,eAAe,EAAE,OAAO;SACzB,CAAC,CAAC,CAAC;QAGJ,IAAI,MAAM,CAAC,eAAe,EAAE;YAC1B,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;SAC1C;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAGb,MAAM,mBAAmB,GAAG,WAAW,CAAC,CAAC,OAAsB,EAAE,EAAE;QACjE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChB,GAAG,IAAI;YACP,eAAe,EAAE,OAAO;SACzB,CAAC,CAAC,CAAC;QAGJ,IAAI,MAAM,CAAC,eAAe,EAAE;YAC1B,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;SACjC;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAGb,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,EAAE,MAAiB,EAAE,EAAE;QAC3D,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAE9D,IAAI;YACF,QAAQ,MAAM,CAAC,IAAI,EAAE;gBACnB,KAAK,UAAU;oBACb,IAAI,MAAM,CAAC,UAAU,EAAE;wBACrB,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;qBACzD;oBACD,MAAM;gBACR,KAAK,QAAQ;oBACX,IAAI,MAAM,CAAC,QAAQ,EAAE;wBACnB,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;qBACvD;oBACD,MAAM;gBACR,KAAK,UAAU;oBACb,IAAI,MAAM,CAAC,aAAa,EAAE;wBACxB,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;qBAC5D;oBACD,MAAM;gBACR,KAAK,SAAS;oBACZ,IAAI,MAAM,CAAC,SAAS,EAAE;wBACpB,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;qBACxD;oBACD,MAAM;aACT;YAGD,IAAI,YAAY,IAAI,KAAK,CAAC,eAAe,EAAE;gBACzC,MAAM,cAAc,GAAG,EAAE,GAAG,KAAK,CAAC,eAAe,EAAE,CAAC;gBACpD,QAAQ,MAAM,CAAC,IAAI,EAAE;oBACnB,KAAK,UAAU;wBACb,cAAc,CAAC,UAAU,GAAG,CAAC,cAAc,CAAC,UAAU,CAAC;wBACvD,MAAM;oBACR,KAAK,QAAQ;wBACX,cAAc,CAAC,WAAW,GAAG,CAAC,cAAc,CAAC,WAAW,CAAC;wBACzD,MAAM;oBACR,KAAK,UAAU;wBACb,cAAc,CAAC,WAAW,GAAG,CAAC,cAAc,CAAC,WAAW,CAAC;wBACzD,MAAM;iBACT;gBAED,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAChB,GAAG,IAAI;oBACP,eAAe,EAAE,cAAc;oBAC/B,SAAS,EAAE,KAAK;iBACjB,CAAC,CAAC,CAAC;aACL;iBAAM;gBACL,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;aACnD;SACF;QAAC,OAAO,KAAK,EAAE;YACd,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAChB,GAAG,IAAI;gBACP,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;gBAC/D,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC,CAAC;SACL;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;IAGlD,MAAM,oBAAoB,GAAG,WAAW,CAAC,CAAC,UAAkB,EAAE,EAAE;QAC9D,qBAAqB,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC,EAAE,EAAE,CAAC,CAAC;IAGP,MAAM,uBAAuB,GAAG,WAAW,CAAC,CAAC,UAAkB,EAAE,EAAE;QACjE,qBAAqB,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC,EAAE,EAAE,CAAC,CAAC;IAGP,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,SAAiB,EAAE,EAAE;QACxD,MAAM,QAAQ,GAAG,SAAS,GAAG,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,QAAQ,GAAG,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAEhE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChB,GAAG,IAAI;YACP,aAAa,EAAE,QAAQ;YACvB,WAAW,EAAE,MAAM;SACpB,CAAC,CAAC,CAAC;QAEJ,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IACrC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;IAGzB,MAAM,kBAAkB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC1C,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChB,GAAG,IAAI;YACP,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC,CAAC;IACN,CAAC,EAAE,EAAE,CAAC,CAAC;IAGP,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,cAAc,GAAG,CAAC,CAAgB,EAAE,EAAE;YAC1C,IAAI,CAAC,OAAO;gBAAE,OAAO;YAErB,QAAQ,CAAC,CAAC,GAAG,EAAE;gBACb,KAAK,WAAW;oBACd,CAAC,CAAC,cAAc,EAAE,CAAC;oBACnB,cAAc,CAAC,MAAM,CAAC,CAAC;oBACvB,MAAM;gBACR,KAAK,YAAY;oBACf,CAAC,CAAC,cAAc,EAAE,CAAC;oBACnB,cAAc,CAAC,OAAO,CAAC,CAAC;oBACxB,MAAM;gBACR,KAAK,MAAM;oBACT,CAAC,CAAC,cAAc,EAAE,CAAC;oBACnB,cAAc,CAAC,OAAO,CAAC,CAAC;oBACxB,MAAM;gBACR,KAAK,QAAQ;oBACX,IAAI,KAAK,CAAC,eAAe,EAAE;wBACzB,CAAC,CAAC,cAAc,EAAE,CAAC;wBACnB,kBAAkB,EAAE,CAAC;qBACtB;oBACD,MAAM;aACT;QACH,CAAC,CAAC;QAEF,IAAI,OAAO,EAAE;YACX,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;SACtD;QAED,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QAC1D,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;IAGzE,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAG1B,MAAM,eAAe,GAAG,IAAI,CAAC;IAC7B,MAAM,gBAAgB,GAAG,IAAI,CAAC;IAE9B,OAAO,CACL,6BACE,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,eAAe,SAAS,EAAE,EACrC,KAAK,EAAE;YACL,QAAQ,EAAE,OAAO;YACjB,GAAG,EAAE,KAAK;YACV,IAAI,EAAE,CAAC;YACP,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,CAAC;YACT,eAAe,EAAE,SAAS;YAC1B,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,MAAM;YACf,aAAa,EAAE,QAAQ;YACvB,QAAQ,EAAE,QAAQ;YAClB,GAAG,KAAK;SACT;QAGD,oBAAC,qBAAqB,IACpB,UAAU,EAAE,cAAc,EAC1B,iBAAiB,EAAE,qBAAqB,EACxC,eAAe,EAAE,eAAe,EAChC,gBAAgB,EAAE,gBAAgB,EAClC,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,aAAa,EAAE,KAAK,CAAC,aAAa,EAClC,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,YAAY,EAAE,KAAK,CAAC,YAAY,GAChC;QAGF,oBAAC,iBAAiB,IAChB,aAAa,EAAE,KAAK,CAAC,aAAa,EAClC,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,YAAY,EAAE,KAAK,CAAC,YAAY,EAChC,YAAY,EAAE,MAAM,CAAC,gBAAgB,EACrC,WAAW,EAAE,eAAe,EAC5B,UAAU,EAAE,kBAAkB,EAC9B,QAAQ,EAAE,oBAAoB,GAC9B;QAGF,6BACE,SAAS,EAAC,kBAAkB,EAC5B,KAAK,EAAE;gBACL,IAAI,EAAE,CAAC;gBACP,OAAO,EAAE,MAAM;gBACf,QAAQ,EAAE,QAAQ;gBAClB,QAAQ,EAAE,UAAU;aACrB;YAGD,oBAAC,cAAc,IACb,IAAI,EAAE,YAAY,EAClB,aAAa,EAAE,KAAK,CAAC,aAAa,EAClC,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,eAAe,EAAE,KAAK,CAAC,eAAe,EACtC,eAAe,EAAE,mBAAmB,EACpC,eAAe,EAAE,mBAAmB,EACpC,gBAAgB,EAAE,uBAAuB,EACzC,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,EAAE,EAAE,EACjB,eAAe,EAAE,CAAC,EAClB,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,GAClB;YAGD,KAAK,CAAC,eAAe,IAAI,CACxB,6BACE,SAAS,EAAC,mBAAmB,EAC7B,KAAK,EAAE;oBACL,QAAQ,EAAE,UAAU;oBACpB,GAAG,EAAE,MAAM;oBACX,KAAK,EAAE,MAAM;oBACb,KAAK,EAAE,OAAO;oBACd,SAAS,EAAE,KAAK;oBAChB,MAAM,EAAE,GAAG;oBACX,SAAS,EAAE,8BAA8B;oBACzC,SAAS,EAAE,+BAA+B;oBAC1C,YAAY,EAAE,MAAM;oBACpB,QAAQ,EAAE,QAAQ;iBACnB;gBAED,oBAAC,iBAAiB,IAChB,OAAO,EAAE,KAAK,CAAC,eAAe,EAC9B,OAAO,EAAE,KAAK,CAAC,eAAe,IAAI,SAAS,EAC3C,OAAO,EAAE,kBAAkB,EAC3B,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,KAAK,EACd,WAAW,EAAE,KAAK,CAAC,WAAW,GAC9B,CACE,CACP,CACG;QAGL,KAAK,CAAC,SAAS,IAAI,CAClB,6BACE,SAAS,EAAC,qBAAqB,EAC/B,KAAK,EAAE;gBACL,QAAQ,EAAE,UAAU;gBACpB,GAAG,EAAE,CAAC;gBACN,IAAI,EAAE,CAAC;gBACP,KAAK,EAAE,CAAC;gBACR,MAAM,EAAE,CAAC;gBACT,eAAe,EAAE,oBAAoB;gBACrC,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,QAAQ;gBACpB,cAAc,EAAE,QAAQ;gBACxB,MAAM,EAAE,GAAG;aACZ;YAED,6BACE,KAAK,EAAE;oBACL,KAAK,EAAE,MAAM;oBACb,QAAQ,EAAE,MAAM;oBAChB,UAAU,EAAE,KAAK;iBAClB,iBAGG,CACF,CACP;QAGA,KAAK,CAAC,KAAK,IAAI,CACd,6BACE,SAAS,EAAC,mBAAmB,EAC7B,KAAK,EAAE;gBACL,QAAQ,EAAE,UAAU;gBACpB,GAAG,EAAE,MAAM;gBACX,IAAI,EAAE,KAAK;gBACX,SAAS,EAAE,kBAAkB;gBAC7B,eAAe,EAAE,SAAS;gBAC1B,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,WAAW;gBACpB,YAAY,EAAE,KAAK;gBACnB,QAAQ,EAAE,MAAM;gBAChB,UAAU,EAAE,KAAK;gBACjB,MAAM,EAAE,GAAG;gBACX,QAAQ,EAAE,OAAO;gBACjB,SAAS,EAAE,QAAQ;gBACnB,SAAS,EAAE,mCAAmC;aAC/C;YAEA,KAAK,CAAC,KAAK;YACZ,gCACE,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAC3D,KAAK,EAAE;oBACL,UAAU,EAAE,MAAM;oBAClB,eAAe,EAAE,aAAa;oBAC9B,MAAM,EAAE,MAAM;oBACd,KAAK,EAAE,MAAM;oBACb,MAAM,EAAE,SAAS;oBACjB,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,GAAG;iBACb,aAGM,CACL,CACP;QAGD,mCAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8CP,CAAS,CACN,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,595 @@
1
+ import React, { useState, useEffect, useCallback, useMemo, useRef } from 'react';
2
+ import type { EPGProps, EPGProgram, EPGProgramRow, EPGAction, EPGNavigationState, EPGConfig } from '../types/EPGTypes';
3
+ import {
4
+ calculateOptimalTimeRange,
5
+ calculateScrollPosition,
6
+ debounce,
7
+ getProgramsInRange
8
+ } from '../utils/EPGUtils';
9
+ import EPGNavigationControls from './EPGNavigationControls';
10
+ import EPGTimelineHeader from './EPGTimelineHeader';
11
+ import EPGProgramGrid from './EPGProgramGrid';
12
+ import EPGProgramDetails from './EPGProgramDetails';
13
+
14
+ const DEFAULT_CONFIG: EPGConfig = {
15
+ timeSlotDuration: 60, // 1 hour
16
+ visibleHours: 4,
17
+ enableInfiniteScroll: true,
18
+ lazyLoadThreshold: 200,
19
+ showChannelLogos: true,
20
+ showProgramImages: true,
21
+ compactMode: false,
22
+ };
23
+
24
+ interface EPGOverlayState {
25
+ selectedProgram: EPGProgram | null;
26
+ selectedChannel: EPGProgramRow | null;
27
+ timelineStart: number;
28
+ timelineEnd: number;
29
+ containerWidth: number;
30
+ visibleHours: number;
31
+ currentTime: number;
32
+ isLoading: boolean;
33
+ error: string | null;
34
+ }
35
+
36
+ export const EPGOverlay: React.FC<EPGProps> = ({
37
+ data,
38
+ config: userConfig = {},
39
+ visible = true,
40
+ onToggle,
41
+ className = '',
42
+ style = {},
43
+ }) => {
44
+ const overlayRef = useRef<HTMLDivElement>(null);
45
+ const [updateTrigger, setUpdateTrigger] = useState(0);
46
+ const [timelineScrollLeft, setTimelineScrollLeft] = useState(0);
47
+
48
+ // Merge user config with defaults
49
+ const config = useMemo(() => ({
50
+ ...DEFAULT_CONFIG,
51
+ ...userConfig,
52
+ }), [userConfig]);
53
+
54
+ // Initialize state
55
+ const [state, setState] = useState<EPGOverlayState>(() => {
56
+ const currentTime = Date.now();
57
+ const { start, end } = calculateOptimalTimeRange(currentTime, config.visibleHours);
58
+
59
+ return {
60
+ selectedProgram: null,
61
+ selectedChannel: null,
62
+ timelineStart: start,
63
+ timelineEnd: end,
64
+ containerWidth: 2400, // 4 hours * 600px per hour
65
+ visibleHours: config.visibleHours,
66
+ currentTime,
67
+ isLoading: false,
68
+ error: null,
69
+ };
70
+ });
71
+
72
+ // Update current time every minute
73
+ useEffect(() => {
74
+ const interval = setInterval(() => {
75
+ setState(prev => ({
76
+ ...prev,
77
+ currentTime: Date.now(),
78
+ }));
79
+ }, 60000); // Update every minute
80
+
81
+ return () => clearInterval(interval);
82
+ }, []);
83
+
84
+ // Calculate container width based on visible hours
85
+ const containerWidth = useMemo(() => {
86
+ return state.visibleHours * 600; // 600px per hour
87
+ }, [state.visibleHours]);
88
+
89
+ // Filter programs for current time range
90
+ const filteredData = useMemo(() => {
91
+ if (!data?.timeline) return [];
92
+
93
+ return getProgramsInRange(
94
+ data.timeline,
95
+ state.timelineStart,
96
+ state.timelineEnd,
97
+ 1 // 1 hour padding
98
+ );
99
+ }, [data?.timeline, state.timelineStart, state.timelineEnd]);
100
+
101
+ // Calculate smart modal position - IMPROVED VERSION
102
+ const getSmartModalPosition = useCallback(() => {
103
+ const basePosition = {
104
+ position: 'absolute' as const,
105
+ width: '400px',
106
+ maxHeight: '65%',
107
+ zIndex: 200,
108
+ borderRadius: '12px',
109
+ overflow: 'hidden' as const,
110
+ boxShadow: '0 12px 48px rgba(0, 0, 0, 0.7)',
111
+ backdropFilter: 'blur(8px)',
112
+ animation: 'modalSlideIn 0.3s cubic-bezier(0.4, 0, 0.2, 1)',
113
+ };
114
+
115
+ // Position in upper-right area for better visibility
116
+ return {
117
+ ...basePosition,
118
+ top: '60px', // Higher up from the top
119
+ right: '20px',
120
+ // Add responsive behavior for smaller screens
121
+ '@media (max-width: 1200px)': {
122
+ width: '350px',
123
+ top: '40px',
124
+ },
125
+ '@media (max-width: 900px)': {
126
+ position: 'fixed' as const,
127
+ top: '50%',
128
+ left: '50%',
129
+ right: 'auto',
130
+ transform: 'translate(-50%, -50%)',
131
+ width: '90vw',
132
+ maxWidth: '400px',
133
+ maxHeight: '80vh',
134
+ },
135
+ };
136
+ }, []);
137
+
138
+ // Handle navigation
139
+ const handleNavigate = useCallback(async (direction: 'left' | 'right' | 'today') => {
140
+ setState(prev => ({ ...prev, isLoading: true, error: null }));
141
+
142
+ try {
143
+ let newStart: number;
144
+ let newEnd: number;
145
+
146
+ if (direction === 'today') {
147
+ const { start, end } = calculateOptimalTimeRange(Date.now(), state.visibleHours);
148
+ newStart = start;
149
+ newEnd = end;
150
+ } else {
151
+ const timeShift = state.visibleHours * 60 * 60 * 1000; // Convert hours to ms
152
+ if (direction === 'left') {
153
+ newStart = state.timelineStart - timeShift;
154
+ newEnd = state.timelineEnd - timeShift;
155
+ } else {
156
+ newStart = state.timelineStart + timeShift;
157
+ newEnd = state.timelineEnd + timeShift;
158
+ }
159
+ }
160
+
161
+ setState(prev => ({
162
+ ...prev,
163
+ timelineStart: newStart,
164
+ timelineEnd: newEnd,
165
+ containerWidth: prev.visibleHours * 600,
166
+ isLoading: false,
167
+ }));
168
+
169
+ // Trigger re-render
170
+ setUpdateTrigger(prev => prev + 1);
171
+
172
+ } catch (error) {
173
+ setState(prev => ({
174
+ ...prev,
175
+ error: error instanceof Error ? error.message : 'Navigation failed',
176
+ isLoading: false,
177
+ }));
178
+ }
179
+ }, [state.visibleHours, state.timelineStart, state.timelineEnd]);
180
+
181
+ // Handle time range change
182
+ const handleTimeRangeChange = useCallback((hours: number) => {
183
+ const { start, end } = calculateOptimalTimeRange(state.currentTime, hours);
184
+
185
+ setState(prev => ({
186
+ ...prev,
187
+ visibleHours: hours,
188
+ timelineStart: start,
189
+ timelineEnd: end,
190
+ containerWidth: hours * 600,
191
+ }));
192
+
193
+ setUpdateTrigger(prev => prev + 1);
194
+ }, [state.currentTime]);
195
+
196
+ // Handle program selection
197
+ const handleProgramSelect = useCallback((program: EPGProgram, channel: EPGProgramRow) => {
198
+ setState(prev => ({
199
+ ...prev,
200
+ selectedProgram: program,
201
+ selectedChannel: channel,
202
+ }));
203
+
204
+ // Call user callback if provided
205
+ if (config.onProgramSelect) {
206
+ config.onProgramSelect(program, channel);
207
+ }
208
+ }, [config]);
209
+
210
+ // Handle channel selection
211
+ const handleChannelSelect = useCallback((channel: EPGProgramRow) => {
212
+ setState(prev => ({
213
+ ...prev,
214
+ selectedChannel: channel,
215
+ }));
216
+
217
+ // Call user callback if provided
218
+ if (config.onChannelSelect) {
219
+ config.onChannelSelect(channel);
220
+ }
221
+ }, [config]);
222
+
223
+ // Handle program actions
224
+ const handleAction = useCallback(async (action: EPGAction) => {
225
+ setState(prev => ({ ...prev, isLoading: true, error: null }));
226
+
227
+ try {
228
+ switch (action.type) {
229
+ case 'favorite':
230
+ if (config.onFavorite) {
231
+ await config.onFavorite(action.program, action.channel);
232
+ }
233
+ break;
234
+ case 'record':
235
+ if (config.onRecord) {
236
+ await config.onRecord(action.program, action.channel);
237
+ }
238
+ break;
239
+ case 'reminder':
240
+ if (config.onSetReminder) {
241
+ await config.onSetReminder(action.program, action.channel);
242
+ }
243
+ break;
244
+ case 'catchup':
245
+ if (config.onCatchup) {
246
+ await config.onCatchup(action.program, action.channel);
247
+ }
248
+ break;
249
+ }
250
+
251
+ // Update program state optimistically
252
+ if (filteredData && state.selectedProgram) {
253
+ const updatedProgram = { ...state.selectedProgram };
254
+ switch (action.type) {
255
+ case 'favorite':
256
+ updatedProgram.isFavorite = !updatedProgram.isFavorite;
257
+ break;
258
+ case 'record':
259
+ updatedProgram.isRecording = !updatedProgram.isRecording;
260
+ break;
261
+ case 'reminder':
262
+ updatedProgram.hasReminder = !updatedProgram.hasReminder;
263
+ break;
264
+ }
265
+
266
+ setState(prev => ({
267
+ ...prev,
268
+ selectedProgram: updatedProgram,
269
+ isLoading: false,
270
+ }));
271
+ } else {
272
+ setState(prev => ({ ...prev, isLoading: false }));
273
+ }
274
+ } catch (error) {
275
+ setState(prev => ({
276
+ ...prev,
277
+ error: error instanceof Error ? error.message : 'Action failed',
278
+ isLoading: false,
279
+ }));
280
+ }
281
+ }, [config, filteredData, state.selectedProgram]);
282
+
283
+ // Handle timeline scroll synchronization
284
+ const handleTimelineScroll = useCallback((scrollLeft: number) => {
285
+ setTimelineScrollLeft(scrollLeft);
286
+ }, []);
287
+
288
+ // Handle program grid scroll synchronization
289
+ const handleProgramGridScroll = useCallback((scrollLeft: number) => {
290
+ setTimelineScrollLeft(scrollLeft);
291
+ }, []);
292
+
293
+ // Handle time slot click
294
+ const handleTimeClick = useCallback((timestamp: number) => {
295
+ const newStart = timestamp - (state.visibleHours * 30 * 60 * 1000); // Center the clicked time
296
+ const newEnd = newStart + (state.visibleHours * 60 * 60 * 1000);
297
+
298
+ setState(prev => ({
299
+ ...prev,
300
+ timelineStart: newStart,
301
+ timelineEnd: newEnd,
302
+ }));
303
+
304
+ setUpdateTrigger(prev => prev + 1);
305
+ }, [state.visibleHours]);
306
+
307
+ // Handle close program details
308
+ const handleCloseDetails = useCallback(() => {
309
+ setState(prev => ({
310
+ ...prev,
311
+ selectedProgram: null,
312
+ }));
313
+ }, []);
314
+
315
+ // Handle keyboard navigation
316
+ useEffect(() => {
317
+ const handleKeyPress = (e: KeyboardEvent) => {
318
+ if (!visible) return;
319
+
320
+ switch (e.key) {
321
+ case 'ArrowLeft':
322
+ e.preventDefault();
323
+ handleNavigate('left');
324
+ break;
325
+ case 'ArrowRight':
326
+ e.preventDefault();
327
+ handleNavigate('right');
328
+ break;
329
+ case 'Home':
330
+ e.preventDefault();
331
+ handleNavigate('today');
332
+ break;
333
+ case 'Escape':
334
+ if (state.selectedProgram) {
335
+ e.preventDefault();
336
+ handleCloseDetails();
337
+ }
338
+ break;
339
+ }
340
+ };
341
+
342
+ if (visible) {
343
+ document.addEventListener('keydown', handleKeyPress);
344
+ }
345
+
346
+ return () => {
347
+ document.removeEventListener('keydown', handleKeyPress);
348
+ };
349
+ }, [visible, handleNavigate, handleCloseDetails, state.selectedProgram]);
350
+
351
+ // Don't render if not visible
352
+ if (!visible) return null;
353
+
354
+ // Calculate navigation state
355
+ const canNavigateLeft = true; // Always allow navigation to past
356
+ const canNavigateRight = true; // Always allow navigation to future
357
+
358
+ return (
359
+ <div
360
+ ref={overlayRef}
361
+ className={`epg-overlay ${className}`}
362
+ style={{
363
+ position: 'fixed',
364
+ top: '35%', // Video player takes 30-40% height
365
+ left: 0,
366
+ right: 0,
367
+ bottom: 0,
368
+ backgroundColor: '#0a0a0a',
369
+ color: '#fff',
370
+ zIndex: 100,
371
+ display: 'flex',
372
+ flexDirection: 'column',
373
+ overflow: 'hidden',
374
+ ...style,
375
+ }}
376
+ >
377
+ {/* Navigation Controls */}
378
+ <EPGNavigationControls
379
+ onNavigate={handleNavigate}
380
+ onTimeRangeChange={handleTimeRangeChange}
381
+ canNavigateLeft={canNavigateLeft}
382
+ canNavigateRight={canNavigateRight}
383
+ currentTime={state.currentTime}
384
+ timelineStart={state.timelineStart}
385
+ timelineEnd={state.timelineEnd}
386
+ visibleHours={state.visibleHours}
387
+ />
388
+
389
+ {/* Timeline Header */}
390
+ <EPGTimelineHeader
391
+ timelineStart={state.timelineStart}
392
+ timelineEnd={state.timelineEnd}
393
+ containerWidth={containerWidth}
394
+ currentTime={state.currentTime}
395
+ visibleHours={state.visibleHours}
396
+ slotDuration={config.timeSlotDuration}
397
+ onTimeClick={handleTimeClick}
398
+ scrollLeft={timelineScrollLeft}
399
+ onScroll={handleTimelineScroll}
400
+ />
401
+
402
+ {/* Main Content Area */}
403
+ <div
404
+ className="epg-main-content"
405
+ style={{
406
+ flex: 1,
407
+ display: 'flex',
408
+ overflow: 'hidden',
409
+ position: 'relative',
410
+ }}
411
+ >
412
+ {/* Program Grid */}
413
+ <EPGProgramGrid
414
+ data={filteredData}
415
+ timelineStart={state.timelineStart}
416
+ timelineEnd={state.timelineEnd}
417
+ containerWidth={containerWidth}
418
+ currentTime={state.currentTime}
419
+ selectedProgram={state.selectedProgram}
420
+ onProgramSelect={handleProgramSelect}
421
+ onChannelSelect={handleChannelSelect}
422
+ onTimelineScroll={handleProgramGridScroll}
423
+ timelineScrollLeft={timelineScrollLeft}
424
+ channelHeight={80}
425
+ visibleChannels={6}
426
+ style={{ flex: 1 }}
427
+ />
428
+
429
+ {/* IMPROVED Program Details Panel - Better Positioning */}
430
+ {state.selectedProgram && (
431
+ <div
432
+ className="epg-details-panel"
433
+ style={getSmartModalPosition()}
434
+ >
435
+ <EPGProgramDetails
436
+ program={state.selectedProgram}
437
+ channel={state.selectedChannel || undefined}
438
+ onClose={handleCloseDetails}
439
+ onAction={handleAction}
440
+ isModal={false}
441
+ currentTime={state.currentTime}
442
+ />
443
+ </div>
444
+ )}
445
+ </div>
446
+
447
+ {/* Loading Overlay */}
448
+ {state.isLoading && (
449
+ <div
450
+ className="epg-loading-overlay"
451
+ style={{
452
+ position: 'absolute',
453
+ top: 0,
454
+ left: 0,
455
+ right: 0,
456
+ bottom: 0,
457
+ backgroundColor: 'rgba(0, 0, 0, 0.5)',
458
+ display: 'flex',
459
+ alignItems: 'center',
460
+ justifyContent: 'center',
461
+ zIndex: 300,
462
+ }}
463
+ >
464
+ <div
465
+ style={{
466
+ color: '#fff',
467
+ fontSize: '18px',
468
+ fontWeight: '600',
469
+ }}
470
+ >
471
+ Loading...
472
+ </div>
473
+ </div>
474
+ )}
475
+
476
+ {/* Error Message */}
477
+ {state.error && (
478
+ <div
479
+ className="epg-error-message"
480
+ style={{
481
+ position: 'absolute',
482
+ top: '20px',
483
+ left: '50%',
484
+ transform: 'translateX(-50%)',
485
+ backgroundColor: '#e74c3c',
486
+ color: '#fff',
487
+ padding: '12px 20px',
488
+ borderRadius: '8px',
489
+ fontSize: '14px',
490
+ fontWeight: '600',
491
+ zIndex: 400,
492
+ maxWidth: '400px',
493
+ textAlign: 'center',
494
+ boxShadow: '0 4px 12px rgba(231, 76, 60, 0.3)',
495
+ }}
496
+ >
497
+ {state.error}
498
+ <button
499
+ onClick={() => setState(prev => ({ ...prev, error: null }))}
500
+ style={{
501
+ marginLeft: '12px',
502
+ backgroundColor: 'transparent',
503
+ border: 'none',
504
+ color: '#fff',
505
+ cursor: 'pointer',
506
+ fontSize: '16px',
507
+ padding: '0',
508
+ }}
509
+ >
510
+ ×
511
+ </button>
512
+ </div>
513
+ )}
514
+
515
+ {/* Enhanced Animation Styles */}
516
+ <style>{`
517
+ @keyframes slideInRight {
518
+ from {
519
+ transform: translateX(100%);
520
+ opacity: 0;
521
+ }
522
+ to {
523
+ transform: translateX(0);
524
+ opacity: 1;
525
+ }
526
+ }
527
+
528
+ @keyframes modalSlideIn {
529
+ from {
530
+ transform: translateY(-30px);
531
+ opacity: 0;
532
+ scale: 0.9;
533
+ }
534
+ to {
535
+ transform: translateY(0);
536
+ opacity: 1;
537
+ scale: 1;
538
+ }
539
+ }
540
+
541
+ .epg-overlay * {
542
+ box-sizing: border-box;
543
+ }
544
+
545
+ .epg-overlay::-webkit-scrollbar {
546
+ width: 8px;
547
+ height: 8px;
548
+ }
549
+
550
+ .epg-overlay::-webkit-scrollbar-track {
551
+ background: #1a1a1a;
552
+ }
553
+
554
+ .epg-overlay::-webkit-scrollbar-thumb {
555
+ background: #444;
556
+ border-radius: 4px;
557
+ }
558
+
559
+ .epg-overlay::-webkit-scrollbar-thumb:hover {
560
+ background: #666;
561
+ }
562
+
563
+ /* Enhanced modal styling */
564
+ .epg-details-panel {
565
+ backdrop-filter: blur(16px);
566
+ background: linear-gradient(135deg, rgba(26, 26, 26, 0.95), rgba(42, 42, 42, 0.95));
567
+ border: 1px solid rgba(255, 255, 255, 0.1);
568
+ }
569
+
570
+ /* Responsive modal positioning */
571
+ @media (max-width: 1200px) {
572
+ .epg-details-panel {
573
+ width: 350px !important;
574
+ top: 40px !important;
575
+ }
576
+ }
577
+
578
+ @media (max-width: 900px) {
579
+ .epg-details-panel {
580
+ position: fixed !important;
581
+ top: 50% !important;
582
+ left: 50% !important;
583
+ right: auto !important;
584
+ transform: translate(-50%, -50%) !important;
585
+ width: 90vw !important;
586
+ max-width: 400px !important;
587
+ max-height: 80vh !important;
588
+ }
589
+ }
590
+ `}</style>
591
+ </div>
592
+ );
593
+ };
594
+
595
+ export default EPGOverlay;
@@ -156,6 +156,30 @@ export const EPGOverlay: React.FC<EPGProps> = ({
156
156
  setUpdateTrigger(prev => prev + 1);
157
157
  }, [state.currentTime]);
158
158
 
159
+ // Calculate optimal modal position based on available space
160
+ const getModalPosition = useCallback(() => {
161
+ if (!overlayRef.current) {
162
+ return { top: '20px', right: '20px' };
163
+ }
164
+
165
+ const overlayRect = overlayRef.current.getBoundingClientRect();
166
+ const modalWidth = 400;
167
+ const modalHeight = 400; // Estimated height
168
+
169
+ // Check available space on right side
170
+ const rightSpace = overlayRect.width - modalWidth - 40; // 40px total margin
171
+ const topSpace = overlayRect.height - modalHeight - 40;
172
+
173
+ // Default to top-right, but adjust if not enough space
174
+ let position = {
175
+ top: Math.max(20, Math.min(topSpace / 2, 80)), // Center vertically but not too high
176
+ right: rightSpace > 0 ? '20px' : 'auto',
177
+ left: rightSpace > 0 ? 'auto' : '20px',
178
+ };
179
+
180
+ return position;
181
+ }, []);
182
+
159
183
  // Handle program selection
160
184
  const handleProgramSelect = useCallback((program: EPGProgram, channel: EPGProgramRow) => {
161
185
  setState(prev => ({
@@ -395,12 +419,15 @@ export const EPGOverlay: React.FC<EPGProps> = ({
395
419
  className="epg-details-panel"
396
420
  style={{
397
421
  position: 'absolute',
398
- bottom: '20px',
422
+ top: '60px', // Simple fix - position higher up
399
423
  right: '20px',
400
424
  width: '400px',
401
- maxHeight: '60%',
425
+ maxHeight: '70%',
402
426
  zIndex: 200,
403
- animation: 'slideInRight 0.3s ease-out',
427
+ animation: 'slideInFromTop 0.3s ease-out',
428
+ boxShadow: '0 8px 32px rgba(0, 0, 0, 0.6)',
429
+ borderRadius: '12px', // Added border radius for modern look
430
+ overflow: 'hidden', // Ensure content doesn't overflow rounded corners
404
431
  }}
405
432
  >
406
433
  <EPGProgramDetails
@@ -496,6 +523,19 @@ export const EPGOverlay: React.FC<EPGProps> = ({
496
523
  }
497
524
  }
498
525
 
526
+ @keyframes slideInFromTop {
527
+ from {
528
+ transform: translateY(-20px);
529
+ opacity: 0;
530
+ scale: 0.95;
531
+ }
532
+ to {
533
+ transform: translateY(0);
534
+ opacity: 1;
535
+ scale: 1;
536
+ }
537
+ }
538
+
499
539
  .epg-overlay * {
500
540
  box-sizing: border-box;
501
541
  }