diff --git a/.gitignore b/.gitignore index f6ba8575..268844b7 100644 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,4 @@ static/video_editor/videos/sample-video-37s.mp4 .DS_Store static/video_editor/videos/sample-video-10m.mp4 static/video_editor/videos/sample-video-10s.mp4 -/frontend-tools/chapters-editor/node_modules -frontend-tools/chapters-editor/client/public/videos/sample-video.mp4 -frontend-tools/video-js/ +frontend-tools/video-js/public/videos/sample-video-white.mp4 diff --git a/frontend-tools/video-js/src/VideoJS.css b/frontend-tools/video-js/src/VideoJS.css index 7ebee252..7229bb5c 100644 --- a/frontend-tools/video-js/src/VideoJS.css +++ b/frontend-tools/video-js/src/VideoJS.css @@ -46,6 +46,70 @@ html { justify-content: flex-start !important; padding: 0 12px; height: 48px; + /* position: relative !important; */ +} + +/* YouTube-style bottom gradient overlay - covers entire video bottom when controls active */ +.video-js::after { + content: ""; + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 120px; + background: linear-gradient( + to top, + rgba(0, 0, 0, 0.8) 0%, + rgba(0, 0, 0, 0.6) 25%, + rgba(0, 0, 0, 0.4) 50%, + rgba(0, 0, 0, 0.2) 75%, + transparent 100% + ); + pointer-events: none; + opacity: 0; + transition: opacity 0.3s ease; + z-index: 2; +} + +/* Show overlay when controls are active - YouTube style */ +.video-js.vjs-user-active::after, +.video-js.vjs-paused::after, +.video-js.vjs-ended::after { + opacity: 1; +} + +/* Ensure control bar is above the overlay */ +.video-js .vjs-control-bar { + z-index: 6 !important; +} + +/* Progress control above overlay */ +.video-js .vjs-progress-control.vjs-control { + z-index: 7 !important; +} + +/* Clean white icons - overlay provides the contrast */ +.video-js .vjs-control-bar .vjs-button .vjs-icon-placeholder::before { + color: #ffffff !important; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6) !important; +} + +/* Clean white time displays */ +.video-js .vjs-control-bar .vjs-time-control { + color: #ffffff !important; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6) !important; + font-weight: 500 !important; +} + +/* Keep original progress bar styling */ + +/* Volume control visibility */ +.video-js .vjs-volume-control .vjs-volume-bar { + background: rgba(255, 255, 255, 0.3) !important; +} + +.video-js .vjs-volume-control .vjs-volume-level { + background: #ffffff !important; } .video-container { @@ -93,6 +157,7 @@ html { align-items: center; justify-content: center; margin: auto; + display: none !important; } .vjs-next-video-control .vjs-icon-placeholder svg { width: 100%; @@ -577,8 +642,7 @@ html { background-color: rgba(255, 255, 255, 0.1) !important; } .video-js .vjs-settings-button:focus { - outline: 2px solid #fff !important; - outline-offset: 2px !important; + outline: none !important; } .video-js .vjs-settings-button .vjs-icon-cog { diff --git a/frontend-tools/video-js/src/components/chapter/ChapterList.jsx b/frontend-tools/video-js/src/components/chapter/ChapterList.jsx deleted file mode 100644 index ee06f37a..00000000 --- a/frontend-tools/video-js/src/components/chapter/ChapterList.jsx +++ /dev/null @@ -1,207 +0,0 @@ -import React from 'react'; - -function ChapterList() { - const playlistData = [ - { - id: 1, - title: 'Class 12 Chapter 1 || Electric Charges and Fields 01 || Quantisation and Conservation of Charge', - channel: 'Physics Wallah - Alakh Pandey', - duration: '40:13', - thumbnail: - 'https://i.ytimg.com/vi/m5VbK66a254/hqdefault.jpg?sqp=-oaymwEmCKgBEF5IWvKriqkDGQgBFQAAiEIYAdgBAeIBCggYEAIYBjgBQAE=&rs=AOn4CLCt2rMJW2jZAYkcDi9wLQOGVkLSTw', - selected: true, - }, - { - id: 2, - title: 'Class 12 Chapter 1 || Electric Charges and Fields 01 || Quantisation and Conservation of Charge', - channel: 'Physics Wallah - Alakh Pandey', - duration: '40:13', - thumbnail: - 'https://i.ytimg.com/vi/m5VbK66a254/hqdefault.jpg?sqp=-oaymwEmCKgBEF5IWvKriqkDGQgBFQAAiEIYAdgBAeIBCggYEAIYBjgBQAE=&rs=AOn4CLCt2rMJW2jZAYkcDi9wLQOGVkLSTw', - selected: false, - }, - { - id: 3, - title: 'Class 12 Chapter 1 || Electric Charges and Fields 01 || Quantisation and Conservation of Charge', - channel: 'Physics Wallah - Alakh Pandey', - duration: '40:13', - thumbnail: - 'https://i.ytimg.com/vi/m5VbK66a254/hqdefault.jpg?sqp=-oaymwEmCKgBEF5IWvKriqkDGQgBFQAAiEIYAdgBAeIBCggYEAIYBjgBQAE=&rs=AOn4CLCt2rMJW2jZAYkcDi9wLQOGVkLSTw', - selected: false, - }, - { - id: 4, - title: 'Class 12 Chapter 1 || Electric Charges and Fields 01 || Quantisation and Conservation of Charge', - channel: 'Physics Wallah - Alakh Pandey', - duration: '40:13', - thumbnail: - 'https://i.ytimg.com/vi/m5VbK66a254/hqdefault.jpg?sqp=-oaymwEmCKgBEF5IWvKriqkDGQgBFQAAiEIYAdgBAeIBCggYEAIYBjgBQAE=&rs=AOn4CLCt2rMJW2jZAYkcDi9wLQOGVkLSTw', - selected: false, - }, - { - id: 5, - title: 'Class 12 Chapter 1 || Electric Charges and Fields 01 || Quantisation and Conservation of Charge', - channel: 'Physics Wallah - Alakh Pandey', - duration: '40:13', - thumbnail: - 'https://i.ytimg.com/vi/m5VbK66a254/hqdefault.jpg?sqp=-oaymwEmCKgBEF5IWvKriqkDGQgBFQAAiEIYAdgBAeIBCggYEAIYBjgBQAE=&rs=AOn4CLCt2rMJW2jZAYkcDi9wLQOGVkLSTw', - selected: false, - }, - { - id: 6, - title: 'Class 12 Chapter 1 || Electric Charges and Fields 01 || Quantisation and Conservation of Charge', - channel: 'Physics Wallah - Alakh Pandey', - duration: '40:13', - thumbnail: - 'https://i.ytimg.com/vi/m5VbK66a254/hqdefault.jpg?sqp=-oaymwEmCKgBEF5IWvKriqkDGQgBFQAAiEIYAdgBAeIBCggYEAIYBjgBQAE=&rs=AOn4CLCt2rMJW2jZAYkcDi9wLQOGVkLSTw', - selected: false, - }, - { - id: 7, - title: 'Class 12 Chapter 1 || Electric Charges and Fields 01 || Quantisation and Conservation of Charge', - channel: 'Physics Wallah - Alakh Pandey', - duration: '40:13', - thumbnail: - 'https://i.ytimg.com/vi/m5VbK66a254/hqdefault.jpg?sqp=-oaymwEmCKgBEF5IWvKriqkDGQgBFQAAiEIYAdgBAeIBCggYEAIYBjgBQAE=&rs=AOn4CLCt2rMJW2jZAYkcDi9wLQOGVkLSTw', - selected: false, - }, - { - id: 8, - title: 'Class 12 Chapter 1 || Electric Charges and Fields 01 || Quantisation and Conservation of Charge', - channel: 'Physics Wallah - Alakh Pandey', - duration: '40:13', - thumbnail: - 'https://i.ytimg.com/vi/m5VbK66a254/hqdefault.jpg?sqp=-oaymwEmCKgBEF5IWvKriqkDGQgBFQAAiEIYAdgBAeIBCggYEAIYBjgBQAE=&rs=AOn4CLCt2rMJW2jZAYkcDi9wLQOGVkLSTw', - selected: false, - }, - { - id: 9, - title: 'Class 12 Chapter 1 || Electric Charges and Fields 01 || Quantisation and Conservation of Charge', - channel: 'Physics Wallah - Alakh Pandey', - duration: '40:13', - thumbnail: - 'https://i.ytimg.com/vi/m5VbK66a254/hqdefault.jpg?sqp=-oaymwEmCKgBEF5IWvKriqkDGQgBFQAAiEIYAdgBAeIBCggYEAIYBjgBQAE=&rs=AOn4CLCt2rMJW2jZAYkcDi9wLQOGVkLSTw', - selected: false, - }, - ]; - - return ( -
-
-
-
-

- 12 chapter 1 II Electri charges and Fields JEE MAINS/NEET -

-

- Physics Wallah - Alakh Pandey 1 / 17 -

-
-
- -
-
-
-
- - -
-
- -
-
-
-
- -
-
- ); -} - -export default ChapterList; diff --git a/frontend-tools/video-js/src/components/controls/AutoplayToggleButton.js b/frontend-tools/video-js/src/components/controls/AutoplayToggleButton.js index a7422c50..86dbbec3 100644 --- a/frontend-tools/video-js/src/components/controls/AutoplayToggleButton.js +++ b/frontend-tools/video-js/src/components/controls/AutoplayToggleButton.js @@ -11,10 +11,8 @@ class AutoplayToggleButton extends Button { if (this.userPreferences) { const savedAutoplay = this.userPreferences.getPreference('autoplay'); this.isAutoplayEnabled = savedAutoplay === true; // Explicit boolean check - console.log('Autoplay button initialized with saved preference:', this.isAutoplayEnabled); } else { this.isAutoplayEnabled = false; - console.log('Autoplay button initialized with default (no userPreferences):', this.isAutoplayEnabled); } // Bind methods @@ -37,13 +35,10 @@ class AutoplayToggleButton extends Button { }); // Set initial icon state directly - console.log('AutoplayToggleButton createEl: isAutoplayEnabled =', this.isAutoplayEnabled); if (this.isAutoplayEnabled) { this.iconSpan.innerHTML = ``; - console.log('Setting RED icon (autoplay ON)'); } else { this.iconSpan.innerHTML = ``; - console.log('Setting GRAY icon (autoplay OFF)'); } // Create control text span @@ -51,8 +46,6 @@ class AutoplayToggleButton extends Button { className: 'vjs-control-text', }); controlTextSpan.textContent = this.isAutoplayEnabled ? 'Autoplay is on' : 'Autoplay is off'; - - console.log('✓ Autoplay button created with initial tooltip:', this.isAutoplayEnabled ? 'Autoplay is on' : 'Autoplay is off'); // Append both spans to button button.appendChild(this.iconSpan); @@ -65,49 +58,46 @@ class AutoplayToggleButton extends Button { } updateIcon() { - // Add transition and start fade-out - this.iconSpan.style.transition = 'opacity 0.1s ease'; - this.iconSpan.style.opacity = '0'; + // Add transition and start fade-out + this.iconSpan.style.transition = 'opacity 0.1s ease'; + this.iconSpan.style.opacity = '0'; - // After fade-out complete, update innerHTML and fade back in - setTimeout(() => { - if (this.isAutoplayEnabled) { - this.iconSpan.innerHTML = ` + // After fade-out complete, update innerHTML and fade back in + setTimeout(() => { + if (this.isAutoplayEnabled) { + this.iconSpan.innerHTML = ` `; - if (this.el()) { - this.el().title = 'Autoplay is on'; - this.el().setAttribute('aria-label', 'Autoplay is on'); - const controlText = this.el().querySelector('.vjs-control-text'); - if (controlText) controlText.textContent = 'Autoplay is on'; - console.log('✓ Autoplay tooltip updated to: "Autoplay is on"'); - } - } else { - this.iconSpan.innerHTML = ` + if (this.el()) { + this.el().title = 'Autoplay is on'; + this.el().setAttribute('aria-label', 'Autoplay is on'); + const controlText = this.el().querySelector('.vjs-control-text'); + if (controlText) controlText.textContent = 'Autoplay is on'; + } + } else { + this.iconSpan.innerHTML = ` `; - if (this.el()) { - this.el().title = 'Autoplay is off'; - this.el().setAttribute('aria-label', 'Autoplay is off'); - const controlText = this.el().querySelector('.vjs-control-text'); - if (controlText) controlText.textContent = 'Autoplay is off'; - console.log('✓ Autoplay tooltip updated to: "Autoplay is off"'); + if (this.el()) { + this.el().title = 'Autoplay is off'; + this.el().setAttribute('aria-label', 'Autoplay is off'); + const controlText = this.el().querySelector('.vjs-control-text'); + if (controlText) controlText.textContent = 'Autoplay is off'; + } } - } - - // Fade back in - this.iconSpan.style.opacity = '1'; - }, 100); -} + // Fade back in + this.iconSpan.style.opacity = '1'; + }, 100); + } handleClick() { // Toggle autoplay state @@ -116,15 +106,11 @@ class AutoplayToggleButton extends Button { // Save preference if userPreferences is available if (this.userPreferences) { this.userPreferences.setAutoplayPreference(this.isAutoplayEnabled); - console.log('Autoplay preference saved to localStorage:', this.isAutoplayEnabled); } // Update icon and accessibility attributes this.updateIcon(); - console.log('Autoplay toggled:', this.isAutoplayEnabled ? 'ON' : 'OFF'); - console.log('✓ Tooltip should now show:', this.isAutoplayEnabled ? 'Autoplay is on' : 'Autoplay is off'); - // Trigger custom event for other components to listen to this.player().trigger('autoplayToggle', { autoplay: this.isAutoplayEnabled }); } @@ -141,38 +127,38 @@ class AutoplayToggleButton extends Button { let touchHandled = false; // Touch start - button.addEventListener('touchstart', (e) => { - touchStartTime = Date.now(); - touchHandled = false; - }, { passive: true }); + button.addEventListener( + 'touchstart', + (e) => { + touchStartTime = Date.now(); + touchHandled = false; + }, + { passive: true } + ); // Touch end - button.addEventListener('touchend', (e) => { - const touchDuration = Date.now() - touchStartTime; - - // Only show tooltip for quick taps (not swipes) - if (touchDuration < 500) { - e.preventDefault(); - e.stopPropagation(); - - // Show tooltip - button.classList.add('touch-active'); - touchHandled = true; - - // Hide tooltip after delay - setTimeout(() => { - button.classList.remove('touch-active'); - }, 2000); - } - }, { passive: false }); + button.addEventListener( + 'touchend', + (e) => { + const touchDuration = Date.now() - touchStartTime; - // Click fallback for desktop - button.addEventListener('click', (e) => { - if (!touchHandled) { - // This is a desktop click, tooltip will show on hover - console.log('Desktop click on autoplay button'); - } - }); + // Only show tooltip for quick taps (not swipes) + if (touchDuration < 500) { + e.preventDefault(); + e.stopPropagation(); + + // Show tooltip + button.classList.add('touch-active'); + touchHandled = true; + + // Hide tooltip after delay + setTimeout(() => { + button.classList.remove('touch-active'); + }, 2000); + } + }, + { passive: false } + ); } } diff --git a/frontend-tools/video-js/src/components/controls/CustomChaptersOverlay.js b/frontend-tools/video-js/src/components/controls/CustomChaptersOverlay.js index ed8bf233..f3ed27e1 100644 --- a/frontend-tools/video-js/src/components/controls/CustomChaptersOverlay.js +++ b/frontend-tools/video-js/src/components/controls/CustomChaptersOverlay.js @@ -47,7 +47,6 @@ class CustomChaptersOverlay extends Component { createOverlay() { if (!this.chaptersData || this.chaptersData.length === 0) { - console.log('⚠ No chapters data available for overlay'); return; } @@ -232,8 +231,6 @@ class CustomChaptersOverlay extends Component { playerEl.appendChild(this.overlay); this.player().on('timeupdate', this.updateCurrentChapter); - - console.log('✓ Custom chapters overlay created'); } setupChaptersButton() { diff --git a/frontend-tools/video-js/src/components/controls/CustomRemainingTime.js b/frontend-tools/video-js/src/components/controls/CustomRemainingTime.js index bdb1a2e2..d64340c9 100644 --- a/frontend-tools/video-js/src/components/controls/CustomRemainingTime.js +++ b/frontend-tools/video-js/src/components/controls/CustomRemainingTime.js @@ -79,15 +79,6 @@ class CustomRemainingTime extends Component { return `${customPrefix}${timeString}${customSuffix}`; } - /** - * Add click handler for additional functionality - */ - handleClick() { - // Example: Toggle between different time formats - console.log('Time display clicked'); - // Could toggle between current/duration vs remaining time - } - /** * Component disposal cleanup */ diff --git a/frontend-tools/video-js/src/components/controls/CustomSettingsMenu.js b/frontend-tools/video-js/src/components/controls/CustomSettingsMenu.js index bf2f3559..7e198ce1 100644 --- a/frontend-tools/video-js/src/components/controls/CustomSettingsMenu.js +++ b/frontend-tools/video-js/src/components/controls/CustomSettingsMenu.js @@ -363,32 +363,19 @@ class CustomSettingsMenu extends Component { const player = this.player(); const tracks = player.textTracks(); let currentSubtitleLabel = 'Off'; - let activeTrack = null; // Find the active subtitle track for (let i = 0; i < tracks.length; i++) { const t = tracks[i]; if (t.kind === 'subtitles' && t.mode === 'showing') { currentSubtitleLabel = t.label || t.language || 'Subtitles'; - activeTrack = t; break; } } const currentSubtitlesDisplay = this.settingsOverlay.querySelector('.current-subtitles'); if (currentSubtitlesDisplay) { - const oldValue = currentSubtitlesDisplay.textContent; currentSubtitlesDisplay.textContent = currentSubtitleLabel; - - // Only log if the value actually changed - if (oldValue !== currentSubtitleLabel) { - console.log(`Updated current subtitle display: "${oldValue}" → "${currentSubtitleLabel}"`); - if (activeTrack) { - console.log( - `Active track details: language="${activeTrack.language}", label="${activeTrack.label}", mode="${activeTrack.mode}"` - ); - } - } } } catch (error) { console.error('Error updating current subtitle display:', error); @@ -402,7 +389,6 @@ class CustomSettingsMenu extends Component { // Listen for real-time subtitle changes this.player().on('texttrackchange', () => { - console.log('Text track changed - updating subtitle display'); this.updateCurrentSubtitleDisplay(); // Also refresh the subtitle submenu to show correct selection this.refreshSubtitlesSubmenu(); @@ -516,7 +502,6 @@ class CustomSettingsMenu extends Component { const fullscreenIndex = controlBar.children().indexOf(fullscreenToggle); controlBar.removeChild(this.settingsButton); controlBar.addChild(this.settingsButton, {}, fullscreenIndex + 1); - console.log('✓ Settings button positioned after fullscreen toggle'); }, 50); } } @@ -872,8 +857,6 @@ class CustomSettingsMenu extends Component { // Close only the speed submenu (keep overlay open) this.speedSubmenu.style.display = 'none'; - - console.log('Playback speed preference saved:', speed); } handleQualityChange(value, qualityOption) { @@ -1063,8 +1046,6 @@ class CustomSettingsMenu extends Component { // Close only the quality submenu (keep overlay open) if (this.qualitySubmenu) this.qualitySubmenu.style.display = 'none'; - - console.log('Quality preference saved:', value); } handleSubtitleChange(lang, optionEl) { diff --git a/frontend-tools/video-js/src/components/controls/NextVideoButton.js b/frontend-tools/video-js/src/components/controls/NextVideoButton.js index f83b9e0e..6e7c0e1c 100644 --- a/frontend-tools/video-js/src/components/controls/NextVideoButton.js +++ b/frontend-tools/video-js/src/components/controls/NextVideoButton.js @@ -24,7 +24,7 @@ class NextVideoButton extends Button { // Create SVG that matches Video.js icon dimensions iconSpan.innerHTML = ` - + @@ -44,7 +44,6 @@ class NextVideoButton extends Button { } handleClick() { - // console.log('NextVideoButton handleClick', this.nextLink); this.player().trigger('nextVideo'); } } diff --git a/frontend-tools/video-js/src/components/markers/ChapterMarkers.js b/frontend-tools/video-js/src/components/markers/ChapterMarkers.js index cf89eb67..d41a11b2 100644 --- a/frontend-tools/video-js/src/components/markers/ChapterMarkers.js +++ b/frontend-tools/video-js/src/components/markers/ChapterMarkers.js @@ -49,7 +49,7 @@ class ChapterMarkers extends Component { this.chaptersData.push({ startTime: cue.startTime, endTime: cue.endTime, - chapterTitle: cue.chapterTitle, + chapterTitle: cue.text, }); } @@ -217,17 +217,17 @@ class ChapterMarkers extends Component { // Update text content without rebuilding DOM this.chapterTitle.textContent = currentChapter.chapterTitle; - this.chapterInfo.textContent = `Chapter: ${startTime} - ${endTime}`; + this.chapterInfo.textContent = `${startTime} - ${endTime}`; // this.positionInfo.textContent = `Position: ${timeAtPosition}`; // Update sprite thumbnail this.updateSpriteThumbnail(currentTime); this.chapterImage.style.display = 'block'; } else { - const timeAtPosition = this.formatTime(currentTime); - this.chapterTitle.textContent = 'No Chapter'; + // const timeAtPosition = this.formatTime(currentTime); + this.chapterTitle.textContent = ''; this.chapterInfo.textContent = ''; - this.positionInfo.textContent = `Position: ${timeAtPosition}`; + // this.positionInfo.textContent = `Position: ${timeAtPosition}`; // Still show sprite thumbnail even when not in a chapter this.updateSpriteThumbnail(currentTime); @@ -274,7 +274,6 @@ class ChapterMarkers extends Component { if (!this.previewSprite || !this.previewSprite.url) { // Hide image if no sprite data available this.chapterImage.style.display = 'none'; - console.log('No sprite data available:', this.previewSprite); return; } @@ -304,10 +303,6 @@ class ChapterMarkers extends Component { const xPos = -(frameCol * width); const yPos = -(frameRow * height); - console.log( - `Time: ${currentTime}s, Duration: ${this.player().duration()}s, Interval: ${frameInterval}s, Frame: ${frameIndex}/${maxFrames - 1}, Row: ${frameRow}, Col: ${frameCol}, Pos: ${xPos}px ${yPos}px, URL: ${url}` - ); - // Apply sprite background this.chapterImage.style.backgroundImage = `url("${url}")`; this.chapterImage.style.backgroundPosition = `${xPos}px ${yPos}px`; @@ -321,7 +316,6 @@ class ChapterMarkers extends Component { if (frameIndex >= 3 && currentTime > 30) { const fallbackYPos = -(2 * height); // Frame 2 (20-30s range) this.chapterImage.style.backgroundPosition = `${xPos}px ${fallbackYPos}px`; - console.log(`Fallback: Using frame 2 instead of frame ${frameIndex} for time ${currentTime}s`); } } diff --git a/frontend-tools/video-js/src/components/markers/SpritePreview.js b/frontend-tools/video-js/src/components/markers/SpritePreview.js index 5d29a02d..282b874d 100644 --- a/frontend-tools/video-js/src/components/markers/SpritePreview.js +++ b/frontend-tools/video-js/src/components/markers/SpritePreview.js @@ -33,7 +33,6 @@ class SpritePreview extends Component { // Only setup if we have sprite data if (!this.previewSprite || !this.previewSprite.url) { - console.log('No sprite data available for preview:', this.previewSprite); return; } @@ -46,23 +45,23 @@ class SpritePreview extends Component { // Style the floating tooltip Object.assign(this.tooltip.style, { - position: 'absolute', + position: 'absolute', zIndex: '1000', bottom: '45px', transform: 'translateX(-50%)', display: 'none', minWidth: '172px', // Accommodate 166px image + 3px border on each side maxWidth: '172px', - width: '172px', + width: '172px', }); // Create stable DOM structure this.spriteImage = videojs.dom.createEl('div', { className: 'sprite-image-preview', }); - Object.assign(this.spriteImage.style, { + Object.assign(this.spriteImage.style, { display: 'block', - overflow: 'hidden', + overflow: 'hidden', }); // Append sprite image to tooltip (no time info) @@ -161,7 +160,6 @@ class SpritePreview extends Component { if (!this.previewSprite || !this.previewSprite.url) { // Hide image if no sprite data available this.spriteImage.style.display = 'none'; - console.log('No sprite data available:', this.previewSprite); return; } @@ -191,10 +189,6 @@ class SpritePreview extends Component { const xPos = -(frameCol * width); const yPos = -(frameRow * height); - console.log( - `Sprite Preview - Time: ${currentTime}s, Duration: ${this.player().duration()}s, Interval: ${frameInterval}s, Frame: ${frameIndex}/${maxFrames - 1}, Row: ${frameRow}, Col: ${frameCol}, Pos: ${xPos}px ${yPos}px, URL: ${url}` - ); - // Apply sprite background this.spriteImage.style.backgroundImage = `url("${url}")`; this.spriteImage.style.backgroundPosition = `${xPos}px ${yPos}px`; @@ -211,7 +205,6 @@ class SpritePreview extends Component { if (frameIndex >= 3 && currentTime > 30) { const fallbackYPos = -(2 * height); // Frame 2 (20-30s range) this.spriteImage.style.backgroundPosition = `${xPos}px ${fallbackYPos}px`; - console.log(`Fallback: Using frame 2 instead of frame ${frameIndex} for time ${currentTime}s`); } } diff --git a/frontend-tools/video-js/src/components/overlays/AutoplayCountdownOverlay.js b/frontend-tools/video-js/src/components/overlays/AutoplayCountdownOverlay.js index 67337829..74a37d30 100644 --- a/frontend-tools/video-js/src/components/overlays/AutoplayCountdownOverlay.js +++ b/frontend-tools/video-js/src/components/overlays/AutoplayCountdownOverlay.js @@ -118,8 +118,6 @@ class AutoplayCountdownOverlay extends Component { this.handlePlayNext(); } }, 1000); - - console.log('Autoplay countdown started:', this.countdownSeconds, 'seconds'); } stopCountdown() { @@ -129,7 +127,6 @@ class AutoplayCountdownOverlay extends Component { this.countdownInterval = null; } this.hide(); - console.log('Autoplay countdown stopped'); } updateCountdownDisplay() { @@ -140,7 +137,6 @@ class AutoplayCountdownOverlay extends Component { } handlePlayNext() { - console.log('Autoplay: Playing next video immediately'); try { this.stopCountdown(); this.onPlayNext(); @@ -150,7 +146,6 @@ class AutoplayCountdownOverlay extends Component { } handleCancel() { - console.log('Autoplay: Cancelled by user'); try { this.stopCountdown(); this.onCancel(); diff --git a/frontend-tools/video-js/src/components/overlays/EndScreenOverlay.js b/frontend-tools/video-js/src/components/overlays/EndScreenOverlay.js index 1c083296..43be397b 100644 --- a/frontend-tools/video-js/src/components/overlays/EndScreenOverlay.js +++ b/frontend-tools/video-js/src/components/overlays/EndScreenOverlay.js @@ -14,12 +14,6 @@ class EndScreenOverlay extends Component { // Now set the instance property after super() completes this.relatedVideos = options && options.relatedVideos ? options.relatedVideos : []; - - // console.log( - // 'EndScreenOverlay created with', - // this.relatedVideos.length, - // 'related videos' - // ); } createEl() { @@ -30,12 +24,6 @@ class EndScreenOverlay extends Component { const maxVideos = this.getMaxVideosForScreen(); const videosToShow = relatedVideos.slice(0, maxVideos); - // console.log( - // 'Creating end screen with', - // videosToShow.length, - // 'related videos' - // ); - const overlay = super.createEl('div', { className: 'vjs-end-screen-overlay', }); @@ -79,7 +67,7 @@ class EndScreenOverlay extends Component { // Use real YouTube thumbnail or fallback to placeholder const thumbnailSrc = video.thumbnail || this.getPlaceholderImage(video.title); - + const thumbnail = videojs.dom.createEl('img', { className: 'vjs-related-video-thumbnail', src: thumbnailSrc, @@ -88,7 +76,7 @@ class EndScreenOverlay extends Component { onerror: () => { // Fallback to placeholder if image fails to load thumbnail.src = this.getPlaceholderImage(video.title); - } + }, }); const overlay = videojs.dom.createEl('div', { @@ -158,10 +146,18 @@ class EndScreenOverlay extends Component { // Generate a placeholder image using a service or create a data URL // For now, we'll use a simple colored placeholder based on the title const colors = [ - '#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4', '#FFEAA7', - '#DDA0DD', '#98D8C8', '#F7DC6F', '#BB8FCE', '#85C1E9' + '#FF6B6B', + '#4ECDC4', + '#45B7D1', + '#96CEB4', + '#FFEAA7', + '#DDA0DD', + '#98D8C8', + '#F7DC6F', + '#BB8FCE', + '#85C1E9', ]; - + // Use title hash to consistently assign colors let hash = 0; for (let i = 0; i < title.length; i++) { @@ -169,47 +165,47 @@ class EndScreenOverlay extends Component { } const colorIndex = Math.abs(hash) % colors.length; const color = colors[colorIndex]; - + // Create a simple placeholder with the first letter of the title const firstLetter = title.charAt(0).toUpperCase(); - + // Create a data URL for a simple placeholder image const canvas = document.createElement('canvas'); canvas.width = 320; canvas.height = 180; const ctx = canvas.getContext('2d'); - + // Background ctx.fillStyle = color; ctx.fillRect(0, 0, 320, 180); - + // Add a subtle pattern ctx.fillStyle = 'rgba(255, 255, 255, 0.1)'; for (let i = 0; i < 20; i++) { ctx.fillRect(Math.random() * 320, Math.random() * 180, 2, 2); } - + // Add the first letter ctx.fillStyle = 'white'; ctx.font = 'bold 48px Arial'; ctx.textAlign = 'center'; ctx.textBaseline = 'middle'; ctx.fillText(firstLetter, 160, 90); - + return canvas.toDataURL(); } getMaxVideosForScreen() { const width = window.innerWidth; - + if (width >= 1200) { return 12; // 4x3 grid for large desktop } else if (width >= 1024) { - return 9; // 3x3 grid for desktop + return 9; // 3x3 grid for desktop } else if (width >= 768) { - return 6; // 3x2 grid for tablet + return 6; // 3x2 grid for tablet } else { - return 4; // 2x2 grid for mobile + return 4; // 2x2 grid for mobile } } @@ -221,7 +217,7 @@ class EndScreenOverlay extends Component { author: 'Bro Code', views: '2.1M views', duration: 1800, - thumbnail: 'https://img.youtube.com/vi/dGcsHMXbSOA/maxresdefault.jpg' + thumbnail: 'https://img.youtube.com/vi/dGcsHMXbSOA/maxresdefault.jpg', }, { id: 'sample2', @@ -229,7 +225,7 @@ class EndScreenOverlay extends Component { author: 'Tech Tutorials', views: '850K views', duration: 1200, - thumbnail: 'https://img.youtube.com/vi/WZQc7RUAg18/maxresdefault.jpg' + thumbnail: 'https://img.youtube.com/vi/WZQc7RUAg18/maxresdefault.jpg', }, { id: 'sample3', @@ -237,7 +233,7 @@ class EndScreenOverlay extends Component { author: 'Web Dev Academy', views: '1.2M views', duration: 2400, - thumbnail: 'https://img.youtube.com/vi/0xMQfnTU6oo/maxresdefault.jpg' + thumbnail: 'https://img.youtube.com/vi/0xMQfnTU6oo/maxresdefault.jpg', }, { id: 'sample4', @@ -245,7 +241,7 @@ class EndScreenOverlay extends Component { author: 'Code Master', views: '650K views', duration: 3600, - thumbnail: 'https://img.youtube.com/vi/fBNz6F-Cowg/maxresdefault.jpg' + thumbnail: 'https://img.youtube.com/vi/fBNz6F-Cowg/maxresdefault.jpg', }, { id: 'sample5', @@ -253,7 +249,7 @@ class EndScreenOverlay extends Component { author: 'Frontend Pro', views: '980K views', duration: 2800, - thumbnail: 'https://img.youtube.com/vi/qZXt1Aom3Cs/maxresdefault.jpg' + thumbnail: 'https://img.youtube.com/vi/qZXt1Aom3Cs/maxresdefault.jpg', }, { id: 'sample6', @@ -261,7 +257,7 @@ class EndScreenOverlay extends Component { author: 'Data Academy', views: '1.5M views', duration: 4200, - thumbnail: 'https://img.youtube.com/vi/ua-CiDNNj30/maxresdefault.jpg' + thumbnail: 'https://img.youtube.com/vi/ua-CiDNNj30/maxresdefault.jpg', }, { id: 'sample7', @@ -269,7 +265,7 @@ class EndScreenOverlay extends Component { author: 'TypeScript Expert', views: '720K views', duration: 2100, - thumbnail: 'https://img.youtube.com/vi/BwuLxPH8IDs/maxresdefault.jpg' + thumbnail: 'https://img.youtube.com/vi/BwuLxPH8IDs/maxresdefault.jpg', }, { id: 'sample8', @@ -277,7 +273,7 @@ class EndScreenOverlay extends Component { author: 'Database Pro', views: '890K views', duration: 1800, - thumbnail: 'https://img.youtube.com/vi/-56x56UppqQ/maxresdefault.jpg' + thumbnail: 'https://img.youtube.com/vi/-56x56UppqQ/maxresdefault.jpg', }, { id: 'sample9', @@ -285,7 +281,7 @@ class EndScreenOverlay extends Component { author: 'DevOps Master', views: '1.1M views', duration: 3200, - thumbnail: 'https://img.youtube.com/vi/pTFZFxd4hOI/maxresdefault.jpg' + thumbnail: 'https://img.youtube.com/vi/pTFZFxd4hOI/maxresdefault.jpg', }, { id: 'sample10', @@ -293,7 +289,7 @@ class EndScreenOverlay extends Component { author: 'Cloud Expert', views: '1.3M views', duration: 4500, - thumbnail: 'https://img.youtube.com/vi/ITcXLS3h2qU/maxresdefault.jpg' + thumbnail: 'https://img.youtube.com/vi/ITcXLS3h2qU/maxresdefault.jpg', }, { id: 'sample11', @@ -301,7 +297,7 @@ class EndScreenOverlay extends Component { author: 'API Specialist', views: '680K views', duration: 2600, - thumbnail: 'https://img.youtube.com/vi/ed8SzALpx1Q/maxresdefault.jpg' + thumbnail: 'https://img.youtube.com/vi/ed8SzALpx1Q/maxresdefault.jpg', }, { id: 'sample12', @@ -309,8 +305,8 @@ class EndScreenOverlay extends Component { author: 'AI Academy', views: '2.3M views', duration: 5400, - thumbnail: 'https://img.youtube.com/vi/i_LwzRVP7bg/maxresdefault.jpg' - } + thumbnail: 'https://img.youtube.com/vi/i_LwzRVP7bg/maxresdefault.jpg', + }, ]; } diff --git a/frontend-tools/video-js/src/components/video-player/VideoJSPlayer.jsx b/frontend-tools/video-js/src/components/video-player/VideoJSPlayer.jsx index cfd17229..9d75e004 100644 --- a/frontend-tools/video-js/src/components/video-player/VideoJSPlayer.jsx +++ b/frontend-tools/video-js/src/components/video-player/VideoJSPlayer.jsx @@ -26,9 +26,6 @@ function VideoJSPlayer({ videoId = 'default-video' }) { // Environment-based development mode configuration const isDevMode = import.meta.env.VITE_DEV_MODE === 'true' || window.location.hostname.includes('vercel.app'); - console.log('isDevMode', isDevMode); - console.log('window.location.hostname', window.location.hostname); - // Safely access window.MEDIA_DATA with fallback using useMemo const mediaData = useMemo( () => @@ -40,7 +37,7 @@ function VideoJSPlayer({ videoId = 'default-video' }) { poster_url: 'https://demo.mediacms.io/media/original/thumbnails/user/markos/7dedcb56bde9463dbc0766768a99be0f_C8E5GFY.20250605_110647.mp4.jpg', chapter_data: [ - { startTime: '00:00:00.000', endTime: '00:00:24.295', chapterTitle: 'A1 test' }, + { startTime: '00:00:00.000', endTime: '00:00:08.295', chapterTitle: 'A1 test' }, { startTime: '00:00:24.295', endTime: '00:00:48.590', chapterTitle: 'A2 of Marine Life' }, { startTime: '00:00:48.590', @@ -1052,6 +1049,7 @@ function VideoJSPlayer({ videoId = 'default-video' }) { siteUrl: '', nextLink: 'https://demo.mediacms.io/view?m=YjGJafibO', urlAutoplay: true, + urlMuted: false, }, [] ); @@ -1083,14 +1081,6 @@ function VideoJSPlayer({ videoId = 'default-video' }) { return hours * 3600 + minutes * 60 + seconds; }; - // Test the conversion function - if (isDevMode) { - console.log('Testing time conversion:'); - console.log('00:00:24.295 ->', convertTimeStringToSeconds('00:00:24.295')); // Should be 24.295 - console.log('00:01:30.500 ->', convertTimeStringToSeconds('00:01:30.500')); // Should be 90.5 - console.log('01:00:00.000 ->', convertTimeStringToSeconds('01:00:00.000')); // Should be 3600 - } - // Convert chapters data from backend format to required format with memoization const convertChaptersData = useMemo(() => { return (rawChaptersData) => { @@ -1098,8 +1088,6 @@ function VideoJSPlayer({ videoId = 'default-video' }) { return []; } - console.log('Converting raw chapters data:', rawChaptersData); - const convertedData = rawChaptersData.map((chapter) => ({ startTime: convertTimeStringToSeconds(chapter.startTime), endTime: convertTimeStringToSeconds(chapter.endTime), @@ -1178,26 +1166,80 @@ function VideoJSPlayer({ videoId = 'default-video' }) { return 'video/mp4'; }; + // Get user's quality preference for dependency tracking + const userQualityPreference = userPreferences.current.getQualityPreference(); + // Get video data from mediaData const currentVideo = useMemo(() => { - // Get video sources based on available data + // Get video sources based on available data and user preferences const getVideoSources = () => { + // Use the extracted quality preference + const userQuality = userQualityPreference; + // Check if HLS info is available and not empty - if (mediaData.data?.hls_info && mediaData.data.hls_info.master_file) { - // Use master file as the primary source (auto quality) - return [ - { - src: mediaData.siteUrl + mediaData.data.hls_info.master_file, - type: 'application/x-mpegURL', // HLS MIME type - label: 'Auto', - }, - ]; + if (mediaData.data?.hls_info) { + // If user prefers auto quality or master file doesn't exist for specific quality + if (userQuality === 'auto' && mediaData.data.hls_info.master_file) { + return [ + { + src: mediaData.siteUrl + mediaData.data.hls_info.master_file, + type: 'application/x-mpegURL', // HLS MIME type + label: 'Auto', + }, + ]; + } + + // If user has selected a specific quality, try to use that playlist + if (userQuality !== 'auto') { + const qualityKey = `${userQuality.replace('p', '')}_playlist`; + if (mediaData.data.hls_info[qualityKey]) { + return [ + { + src: mediaData.data.hls_info[qualityKey], + type: 'application/x-mpegURL', // HLS MIME type + label: `${userQuality}p`, + }, + ]; + } + } + + // Fallback to master file if specific quality not available + if (mediaData.data.hls_info.master_file) { + return [ + { + src: mediaData.siteUrl + mediaData.data.hls_info.master_file, + type: 'application/x-mpegURL', // HLS MIME type + label: 'Auto', + }, + ]; + } } // Fallback to encoded qualities if available if (mediaData.data?.encodings_info) { - const sources = []; const encodings = mediaData.data.encodings_info; + const userQuality = userQualityPreference; + + // If user has selected a specific quality, try to use that encoding first + if (userQuality !== 'auto') { + const qualityNumber = userQuality.replace('p', ''); // Remove 'p' from '240p' -> '240' + if ( + encodings[qualityNumber] && + encodings[qualityNumber].h264 && + encodings[qualityNumber].h264.url + ) { + return [ + { + src: encodings[qualityNumber].h264.url, + type: getMimeType(encodings[qualityNumber].h264.url, mediaData.data?.media_type), + label: `${qualityNumber}p`, + }, + ]; + } + } + + // If auto quality or specific quality not available, return all available qualities + const sources = []; // Get available qualities dynamically from encodings_info const availableQualities = Object.keys(encodings) @@ -1231,14 +1273,14 @@ function VideoJSPlayer({ videoId = 'default-video' }) { // Default sample video return [ - /* { - src: '/videos/sample-video.mp4', - type: 'video/mp4', - }, */ { + src: '/videos/sample-video-white.mp4', + type: 'video/mp4', + }, + /* { src: '/videos/sample-video.mp3', type: 'audio/mpeg', - }, + }, */ ]; }; @@ -1250,9 +1292,10 @@ function VideoJSPlayer({ videoId = 'default-video' }) { related_media: mediaData.data?.related_media || [], nextLink: mediaData?.nextLink || null, urlAutoplay: mediaData?.urlAutoplay || true, + urlMuted: mediaData?.urlMuted || false, sources: getVideoSources(), }; - }, [mediaData]); + }, [mediaData, userQualityPreference]); // Compute available qualities. Prefer JSON (mediaData.data.qualities), otherwise build from encodings_info or current source. const availableQualities = useMemo(() => { @@ -1446,14 +1489,8 @@ function VideoJSPlayer({ videoId = 'default-video' }) { })) : []; - console.log('mediaData?.data?.thumbnail_time', mediaData?.data?.thumbnail_time); - console.log('mediaData?.data?.sprites_url', mediaData?.data?.sprites_url); - console.log('mediaData', mediaData); - // Function to navigate to next video const goToNextVideo = () => { - console.log('Next video functionality disabled for single video mode'); - if (mediaData.onClickNextCallback && typeof mediaData.onClickNextCallback === 'function') { mediaData.onClickNextCallback(); } @@ -1464,7 +1501,6 @@ function VideoJSPlayer({ videoId = 'default-video' }) { if (videoRef.current && !playerRef.current) { // Check if element is already a Video.js player if (videoRef.current.player) { - // console.log('Video.js already initialized on this element'); return; } @@ -1478,8 +1514,8 @@ function VideoJSPlayer({ videoId = 'default-video' }) { controls: true, // Player dimensions - removed for responsive design - // Autoplay behavior: Use 'muted' to comply with browser policies - autoplay: 'muted', // Auto-start muted to comply with browser policies (true/false, play, muted, any) + // Autoplay behavior: Try unmuted first, fallback to muted if needed + autoplay: true, // Try unmuted autoplay first (true/false, play, muted, any) // Start video over when it ends loop: false, @@ -1741,9 +1777,6 @@ function VideoJSPlayer({ videoId = 'default-video' }) { }); // Event listeners - /* playerRef.current.on('ready', () => { - console.log('Video.js player ready'); - }); */ playerRef.current.ready(() => { // Apply user preferences to player userPreferences.current.applyToPlayer(playerRef.current); @@ -1788,15 +1821,89 @@ function VideoJSPlayer({ videoId = 'default-video' }) { } } - // Handle URL autoplay parameter or auto-start on page load + // Detect if user has interacted with the page + const hasUserInteracted = () => { + // Check various indicators of user interaction + return ( + document.hasFocus() || + document.visibilityState === 'visible' || + sessionStorage.getItem('userInteracted') === 'true' + ); + }; + + // Handle autoplay while respecting user's saved preferences + const handleAutoplay = async () => { + const userInteracted = hasUserInteracted(); + const savedMuteState = userPreferences.current.getPreference('muted'); + + try { + // Respect user's saved mute preference, but try unmuted if user interacted and hasn't explicitly muted + if (!mediaData.urlMuted && userInteracted && savedMuteState !== true) { + playerRef.current.muted(false); + } + + // First attempt: try to play with current mute state + await playerRef.current.play(); + } catch (error) { + // Fallback to muted autoplay unless user explicitly wants to stay unmuted + if (!playerRef.current.muted()) { + try { + playerRef.current.muted(true); + await playerRef.current.play(); + + // Only try to restore sound if user hasn't explicitly saved mute=true + if (savedMuteState !== true) { + // Aggressively try to restore sound + const restoreSound = () => { + if (playerRef.current && !playerRef.current.isDisposed()) { + playerRef.current.muted(false); + playerRef.current.trigger('notify', '🔊 Sound enabled!'); + } + }; + + // Try to restore sound immediately if user has interacted + if (userInteracted) { + setTimeout(restoreSound, 100); + } else { + // Show notification for manual interaction + setTimeout(() => { + if (playerRef.current && !playerRef.current.isDisposed()) { + playerRef.current.trigger( + 'notify', + '🔇 Click anywhere to enable sound' + ); + } + }, 1000); + + // Set up interaction listeners + const enableSound = () => { + restoreSound(); + // Mark user interaction for future videos + sessionStorage.setItem('userInteracted', 'true'); + // Remove listeners + document.removeEventListener('click', enableSound); + document.removeEventListener('keydown', enableSound); + document.removeEventListener('touchstart', enableSound); + }; + + document.addEventListener('click', enableSound, { once: true }); + document.addEventListener('keydown', enableSound, { once: true }); + document.addEventListener('touchstart', enableSound, { once: true }); + } + } + } catch (mutedError) { + console.error('❌ Even muted autoplay was blocked:', mutedError.message); + } + } + } + }; + if (mediaData?.urlAutoplay) { - playerRef.current.play(); + // Explicit autoplay requested via URL parameter + handleAutoplay(); } else { - // Auto-start video on page load/reload (muted to comply with browser policies) - playerRef.current.play().catch((error) => { - console.log('ℹ️ Browser prevented autoplay (normal behavior):', error.message); - // Fallback: ensure video is ready to play when user interacts - }); + // Auto-start video on page load/reload with fallback strategy + handleAutoplay(); } const setupMobilePlayPause = () => { @@ -1857,18 +1964,28 @@ function VideoJSPlayer({ videoId = 'default-video' }) { const progressControl = controlBar.getChild('progressControl'); const seekBar = progressControl.getChild('seekBar'); const chaptersButton = controlBar.getChild('chaptersButton'); - const fullscreenToggle = controlBar.getChild('fullscreenToggle'); // Auto-play video when navigating from next button const urlParams = new URLSearchParams(window.location.search); const hasVideoParam = urlParams.get('m'); if (hasVideoParam) { // Small delay to ensure everything is loaded - setTimeout(() => { + setTimeout(async () => { if (playerRef.current && !playerRef.current.isDisposed()) { - playerRef.current.play().catch((error) => { - console.log('ℹ️ Browser prevented autoplay (normal behavior):', error.message); - }); + try { + await playerRef.current.play(); + } catch (error) { + console.error('ℹ️ Browser prevented play:', error.message); + // Try muted playback as fallback + if (!playerRef.current.muted()) { + try { + playerRef.current.muted(true); + await playerRef.current.play(); + } catch (mutedError) { + console.error('ℹ️ Even muted play was blocked:', mutedError.message); + } + } + } } }, 100); } @@ -1918,7 +2035,7 @@ function VideoJSPlayer({ videoId = 'default-video' }) { const cue = new (window.VTTCue || window.TextTrackCue)( chapter.startTime, chapter.endTime, - chapter.text + chapter.chapterTitle ); chaptersTrack.addCue(cue); }); @@ -1965,9 +2082,11 @@ function VideoJSPlayer({ videoId = 'default-video' }) { const autoplayToggleButton = new AutoplayToggleButton(playerRef.current, { userPreferences: userPreferences.current, }); - // Add it after the play button - const fullscreenToggleIndex = controlBar.children().indexOf(fullscreenToggle); - controlBar.addChild(autoplayToggleButton, {}, fullscreenToggleIndex - 1); + // Add it before the chapters button (or at a suitable position) + const chaptersButtonIndex = controlBar.children().indexOf(chaptersButton); + const insertIndex = + chaptersButtonIndex > 0 ? chaptersButtonIndex : controlBar.children().length - 3; + controlBar.addChild(autoplayToggleButton, {}, insertIndex); // Store reference for later use customComponents.current.autoplayToggleButton = autoplayToggleButton; @@ -1975,62 +2094,13 @@ function VideoJSPlayer({ videoId = 'default-video' }) { // Force update icon after adding to DOM to ensure correct display setTimeout(() => { autoplayToggleButton.updateIcon(); - console.log('✓ Autoplay toggle button icon updated after DOM insertion'); }, 100); - - console.log('✓ Autoplay toggle button added successfully'); } catch (error) { console.error('✗ Failed to add autoplay toggle button:', error); } } // END: Implement autoplay toggle button - // Remove duplicate captions button and move chapters to end - /* const cleanupControls = () => { - // Log all current children for debugging - const allChildren = controlBar.children(); - - // Try to find and remove captions/subs-caps button (but keep subtitles) - const possibleCaptionButtons = ['captionsButton', 'subsCapsButton']; - possibleCaptionButtons.forEach((buttonName) => { - const button = controlBar.getChild(buttonName); - if (button) { - try { - controlBar.removeChild(button); - console.log(`✓ Removed ${buttonName}`); - } catch (e) { - console.log(`✗ Failed to remove ${buttonName}:`, e); - } - } - }); - - // Alternative: hide buttons we can't remove - allChildren.forEach((child, index) => { - const name = (child.name_ || child.constructor.name || '').toLowerCase(); - if (name.includes('caption') && !name.includes('subtitle')) { - child.hide(); - console.log(`✓ Hidden button at index ${index}: ${name}`); - } - }); - - // Move chapters button to the very end - const chaptersButton = controlBar.getChild('chaptersButton'); - if (chaptersButton) { - try { - controlBar.removeChild(chaptersButton); - controlBar.addChild(chaptersButton); - console.log('✓ Chapters button moved to last position'); - } catch (e) { - console.log('✗ Failed to move chapters button:', e); - } - } - }; */ - - // Try multiple times with different delays - /* setTimeout(cleanupControls, 200); - setTimeout(cleanupControls, 500); - setTimeout(cleanupControls, 1000); */ - // Make menus clickable instead of hover-only setTimeout(() => { const setupClickableMenus = () => { @@ -2057,8 +2127,6 @@ function VideoJSPlayer({ videoId = 'default-video' }) { this.menu.show(); } }); - - console.log(`✓ Made ${buttonName} clickable`); } else if (button) { // For buttons without menuButton_ property const buttonEl = button.el(); @@ -2081,8 +2149,6 @@ function VideoJSPlayer({ videoId = 'default-video' }) { } } }); - - console.log(`✓ Added click handler to ${buttonName}`); } } }); @@ -2232,27 +2298,17 @@ function VideoJSPlayer({ videoId = 'default-video' }) { // BEGIN: Add chapter markers and sprite preview to progress control if (progressControl && seekBar) { - console.log('Setting up sprite preview and chapter markers...'); - console.log('mediaData.previewSprite:', mediaData.previewSprite); - console.log('chaptersData:', chaptersData); - // Check if we have chapters const hasChapters = chaptersData && chaptersData.length > 0; if (hasChapters) { // Use original ChapterMarkers with sprite functionality when chapters exist - console.log( - '✓ Adding ChapterMarkers component with sprite functionality (chapters exist)' - ); const chapterMarkers = new ChapterMarkers(playerRef.current, { previewSprite: mediaData.previewSprite, }); seekBar.addChild(chapterMarkers); } else if (mediaData.previewSprite) { // Use separate SpritePreview component only when no chapters but sprite data exists - console.log( - '✓ Adding SpritePreview component (no chapters, but sprite data available)' - ); const spritePreview = new SpritePreview(playerRef.current, { previewSprite: mediaData.previewSprite, }); @@ -2260,19 +2316,14 @@ function VideoJSPlayer({ videoId = 'default-video' }) { // Setup sprite preview hover functionality setTimeout(() => { - console.log('✓ Setting up sprite preview hover functionality'); spritePreview.setupProgressBarHover(); }, 100); - } else { - console.log('✗ No chapters and no sprite data available'); } } // END: Add chapter markers and sprite preview to progress control // BEGIN: Simple button layout fix - use CSS approach setTimeout(() => { - console.log('Setting up simplified button layout...'); - // Add a simple spacer div using DOM manipulation (simpler approach) const spacerDiv = document.createElement('div'); spacerDiv.className = 'vjs-spacer-control vjs-control'; @@ -2287,22 +2338,32 @@ function VideoJSPlayer({ videoId = 'default-video' }) { const durationEl = durationDisplay.el(); const nextSibling = durationEl.nextSibling; controlBarEl.insertBefore(spacerDiv, nextSibling); - console.log('✓ Simple spacer added after duration display'); } }, 300); // END: Simple button layout fix - // BEGIN: Move chapters button after fullscreen toggle - if (chaptersButton && fullscreenToggle) { + // BEGIN: Move Picture-in-Picture and Fullscreen buttons to the very end + setTimeout(() => { try { - const fullscreenIndex = controlBar.children().indexOf(fullscreenToggle); - controlBar.addChild(chaptersButton, {}, fullscreenIndex + 1); - console.log('✓ Chapters button moved after fullscreen toggle'); + const pictureInPictureToggle = controlBar.getChild('pictureInPictureToggle'); + const fullscreenToggle = controlBar.getChild('fullscreenToggle'); + + // Move Picture-in-Picture button to the very end (if it exists) + if (pictureInPictureToggle) { + controlBar.removeChild(pictureInPictureToggle); + controlBar.addChild(pictureInPictureToggle); + } + + // Move Fullscreen button to the very end (after PiP) + if (fullscreenToggle) { + controlBar.removeChild(fullscreenToggle); + controlBar.addChild(fullscreenToggle); + } } catch (e) { - console.log('✗ Failed to move chapters button:', e); + console.error('✗ Failed to move PiP/Fullscreen buttons to end:', e); } - } - // END: Move chapters button after fullscreen toggle + }, 100); + // END: Move Picture-in-Picture and Fullscreen buttons to the very end // BEGIN: Add Chapters Overlay Component if (chaptersData && chaptersData.length > 0) { @@ -2312,8 +2373,6 @@ function VideoJSPlayer({ videoId = 'default-video' }) { channelName: 'Chapter', thumbnail: mediaData?.data?.thumbnail_url || mediaData?.data?.author_thumbnail || '', }); - } else { - console.log('⚠ No chapters data available for overlay'); } // END: Add Chapters Overlay Component @@ -2399,199 +2458,14 @@ function VideoJSPlayer({ videoId = 'default-video' }) { }; // END: Add custom arrow key seek functionality - - // Log current user preferences - console.log('Current user preferences:', userPreferences.current.getPreferences()); - - window.debugSubtitles = { - showTracks: () => { - const textTracks = playerRef.current.textTracks(); - console.log('=== Available Text Tracks ==='); - for (let i = 0; i < textTracks.length; i++) { - const track = textTracks[i]; - console.log( - `${i}: ${track.kind} | ${track.language} | ${track.label} | mode: ${track.mode}` - ); - } - }, - enableEnglish: () => { - const textTracks = playerRef.current.textTracks(); - for (let i = 0; i < textTracks.length; i++) { - const track = textTracks[i]; - if (track.kind === 'subtitles' && track.language === 'en') { - track.mode = 'showing'; - console.log('Enabled English subtitles'); - break; - } - } - }, - enableGreek: () => { - const textTracks = playerRef.current.textTracks(); - for (let i = 0; i < textTracks.length; i++) { - const track = textTracks[i]; - if (track.kind === 'subtitles' && track.language === 'el') { - track.mode = 'showing'; - console.log('Enabled Greek subtitles'); - break; - } - } - }, - disableAll: () => { - const textTracks = playerRef.current.textTracks(); - for (let i = 0; i < textTracks.length; i++) { - const track = textTracks[i]; - if (track.kind === 'subtitles') { - track.mode = 'disabled'; - } - } - console.log('Disabled all subtitles'); - }, - getPrefs: () => { - console.log('Saved preferences:', userPreferences.current.getPreferences()); - }, - reapplyPrefs: () => { - userPreferences.current.applySubtitlePreference(playerRef.current); - }, - showMenu: () => { - const controlBar = playerRef.current.getChild('controlBar'); - - // Try different button names - const possibleNames = ['subtitlesButton', 'captionsButton', 'subsCapsButton']; - let subtitlesButton = null; - - for (const name of possibleNames) { - const button = controlBar.getChild(name); - if (button) { - console.log(`Found subtitle button: ${name}`); - subtitlesButton = button; - break; - } - } - - if (subtitlesButton && subtitlesButton.menu) { - console.log('=== Subtitle Menu Items ==='); - subtitlesButton.menu.children_.forEach((item, index) => { - if (item.track) { - console.log( - `${index}: ${item.track.label} (${item.track.language}) - selected: ${item.selected()}` - ); - } else { - console.log( - `${index}: ${item.label || 'Unknown'} - selected: ${item.selected()}` - ); - } - }); - } else { - console.log('No subtitle menu found, checking DOM...'); - - // Check DOM for subtitle menu items - const menuItems = playerRef.current.el().querySelectorAll('.vjs-menu-item'); - console.log(`Found ${menuItems.length} menu items in DOM`); - - menuItems.forEach((item, index) => { - if ( - item.textContent.toLowerCase().includes('subtitle') || - item.textContent.toLowerCase().includes('caption') || - item.textContent.toLowerCase().includes('off') - ) { - console.log( - `DOM item ${index}: ${item.textContent} - classes: ${item.className}` - ); - } - }); - } - }, - testMenuClick: (index) => { - const controlBar = playerRef.current.getChild('controlBar'); - const possibleNames = ['subtitlesButton', 'captionsButton', 'subsCapsButton']; - let subtitlesButton = null; - - for (const name of possibleNames) { - const button = controlBar.getChild(name); - if (button) { - subtitlesButton = button; - break; - } - } - - if (subtitlesButton && subtitlesButton.menu && subtitlesButton.menu.children_[index]) { - const menuItem = subtitlesButton.menu.children_[index]; - console.log('Simulating click on menu item:', index); - menuItem.handleClick(); - } else { - console.log('Menu item not found at index:', index, 'trying DOM approach...'); - - // Try DOM approach - const menuItems = playerRef.current.el().querySelectorAll('.vjs-menu-item'); - const subtitleItems = Array.from(menuItems).filter( - (item) => - item.textContent.toLowerCase().includes('subtitle') || - item.textContent.toLowerCase().includes('caption') || - item.textContent.toLowerCase().includes('off') - ); - - if (subtitleItems[index]) { - console.log('Clicking DOM element:', subtitleItems[index].textContent); - subtitleItems[index].click(); - } else { - console.log('No DOM subtitle item found at index:', index); - } - } - }, - forceEnableEnglish: () => { - console.log('Force enabling English subtitles...'); - const textTracks = playerRef.current.textTracks(); - for (let i = 0; i < textTracks.length; i++) { - const track = textTracks[i]; - if (track.kind === 'subtitles') { - track.mode = track.language === 'en' ? 'showing' : 'disabled'; - } - } - userPreferences.current.setPreference('subtitleLanguage', 'en'); - console.log('English subtitles enabled and saved'); - }, - watchSubtitleChanges: () => { - console.log('👀 Watching subtitle preference changes...'); - const originalSetPreference = userPreferences.current.setPreference; - userPreferences.current.setPreference = function (key, value) { - if (key === 'subtitleLanguage') { - console.log(`🎯 SUBTITLE CHANGE: ${value} at ${new Date().toISOString()}`); - console.trace('Change origin:'); - } - return originalSetPreference.call(this, key, value); - }; - console.log('Subtitle change monitoring activated'); - }, - checkRestorationFlag: () => { - console.log('Restoration flag:', userPreferences.current.isRestoringSubtitles); - console.log('Auto-save disabled:', userPreferences.current.subtitleAutoSaveDisabled); - }, - forceSaveGreek: () => { - console.log('🚀 Force saving Greek subtitle preference...'); - userPreferences.current.forceSetSubtitleLanguage('el'); - console.log('Check result:', userPreferences.current.getPreferences()); - }, - forceSaveEnglish: () => { - console.log('🚀 Force saving English subtitle preference...'); - userPreferences.current.forceSetSubtitleLanguage('en'); - console.log('Check result:', userPreferences.current.getPreferences()); - }, - forceSaveNull: () => { - console.log('🚀 Force saving null subtitle preference...'); - userPreferences.current.forceSetSubtitleLanguage(null); - console.log('Check result:', userPreferences.current.getPreferences()); - }, - }; }); // Listen for next video event playerRef.current.on('nextVideo', () => { - console.log('Next video requested'); goToNextVideo(); }); playerRef.current.on('play', () => { - console.log('Video started playing'); // Only show play indicator if not changing quality if (!playerRef.current.isChangingQuality && customComponents.current.seekIndicator) { customComponents.current.seekIndicator.show('play'); @@ -2599,7 +2473,6 @@ function VideoJSPlayer({ videoId = 'default-video' }) { }); playerRef.current.on('pause', () => { - console.log('Video paused'); // Only show pause indicator if not changing quality if (!playerRef.current.isChangingQuality && customComponents.current.seekIndicator) { customComponents.current.seekIndicator.show('pause'); @@ -2611,9 +2484,6 @@ function VideoJSPlayer({ videoId = 'default-video' }) { let autoplayCountdown = null; playerRef.current.on('ended', () => { - console.log('Video ended'); - console.log('Available relatedVideos:', relatedVideos); - // Keep controls active after video ends setTimeout(() => { if (playerRef.current && !playerRef.current.isDisposed()) { @@ -2631,18 +2501,10 @@ function VideoJSPlayer({ videoId = 'default-video' }) { } }, 50); - console.log('mediaData.previewSprite', mediaData.previewSprite); - console.log('mediaData.nextLink', mediaData.nextLink); - console.log('userPreferences', userPreferences); - // Check if autoplay is enabled and there's a next video const isAutoplayEnabled = userPreferences.current.getAutoplayPreference(); const hasNextVideo = mediaData.nextLink !== null; - console.log('isAutoplayEnabled', isAutoplayEnabled); - console.log('hasNextVideo', hasNextVideo); - console.log('isEmbedPlayer', isEmbedPlayer); - if (!isEmbedPlayer && isAutoplayEnabled && hasNextVideo) { // Get next video data for countdown display - find the next video in related videos let nextVideoData = { @@ -2680,11 +2542,9 @@ function VideoJSPlayer({ videoId = 'default-video' }) { nextVideoData: nextVideoData, countdownSeconds: 5, onPlayNext: () => { - console.log('Autoplay: Navigating to next video'); goToNextVideo(); }, onCancel: () => { - console.log('Autoplay: User cancelled, showing related videos'); // Hide countdown and show end screen instead if (autoplayCountdown) { playerRef.current.removeChild(autoplayCountdown); @@ -2705,7 +2565,6 @@ function VideoJSPlayer({ videoId = 'default-video' }) { function showEndScreen() { // Prevent creating multiple end screens if (endScreen) { - console.log('End screen already exists, removing previous one'); playerRef.current.removeChild(endScreen); endScreen = null; } @@ -2753,35 +2612,23 @@ function VideoJSPlayer({ videoId = 'default-video' }) { }); playerRef.current.on('error', (error) => { - console.error('Video.js error:', error); + // console.error('Video.js error:', error); }); playerRef.current.on('fullscreenchange', () => { - console.log('Fullscreen changed:', playerRef.current.isFullscreen()); + // console.log('Fullscreen changed:', playerRef.current.isFullscreen()); }); playerRef.current.on('volumechange', () => { - console.log('Volume changed:', playerRef.current.volume(), 'Muted:', playerRef.current.muted()); + // console.log('Volume changed:', playerRef.current.volume(), 'Muted:', playerRef.current.muted()); }); playerRef.current.on('ratechange', () => { - console.log('Playback rate changed:', playerRef.current.playbackRate()); + // console.log('Playback rate changed:', playerRef.current.playbackRate()); }); playerRef.current.on('texttrackchange', () => { - console.log('Text track changed'); - const textTracks = playerRef.current.textTracks(); - for (let i = 0; i < textTracks.length; i++) { - console.log( - 'Track', - i, - ':', - textTracks[i].kind, - textTracks[i].label, - 'Mode:', - textTracks[i].mode - ); - } + // console.log('Text track changed'); }); // Focus the player element so keyboard controls work @@ -2793,7 +2640,6 @@ function VideoJSPlayer({ videoId = 'default-video' }) { const videoElement = playerRef.current.el(); videoElement.setAttribute('tabindex', '0'); videoElement.focus(); - console.log('Video player focused for keyboard controls'); // Add custom keyboard event handler for space key const handleKeyPress = (event) => { @@ -2828,15 +2674,6 @@ function VideoJSPlayer({ videoId = 'default-video' }) { document.removeEventListener('keydown', handleKeyPress); }; } - - // Start playing the video immediately if autoplay is enabled - if (playerRef.current.autoplay()) { - playerRef.current.play().catch((error) => { - console.log('ℹ️ Browser prevented autoplay (normal behavior):', error.message); - // If autoplay fails, we can still focus the element - // so the user can manually start and use keyboard controls - }); - } }); } }, 0); @@ -2867,7 +2704,6 @@ function VideoJSPlayer({ videoId = 'default-video' }) { const videoElement = playerRef.current.el(); videoElement.setAttribute('tabindex', '0'); videoElement.focus(); - console.log('Video element focused for keyboard controls'); } }; diff --git a/frontend-tools/video-js/src/main.jsx b/frontend-tools/video-js/src/main.jsx index c225f3af..9aeaf3fe 100644 --- a/frontend-tools/video-js/src/main.jsx +++ b/frontend-tools/video-js/src/main.jsx @@ -3,7 +3,6 @@ import { createRoot } from 'react-dom/client'; import './VideoJS.css'; import VideoJS from './VideoJS.jsx'; -// import ChapterList from './components/chapter/ChapterList.jsx'; // Mount the components when the DOM is ready const mountComponents = () => { @@ -16,7 +15,6 @@ const mountComponents = () => { ); - console.log('Mounted main VideoJS player'); } // Mount embed video player @@ -28,7 +26,6 @@ const mountComponents = () => { ); - console.log('Mounted embed VideoJS player'); } }; @@ -37,7 +34,6 @@ window.triggerVideoJSMount = mountComponents; // Listen for custom events to trigger mounting document.addEventListener('triggerVideoJSMount', () => { - console.log('Received triggerVideoJSMount event, attempting to mount VideoJS components...'); mountComponents(); }); @@ -52,7 +48,6 @@ if (document.readyState === 'loading') { setInterval(() => { const embedContainer = document.getElementById('video-js-root-embed'); if (embedContainer && !embedContainer.hasChildNodes()) { - console.log('Found unmounted embed container during periodic check, mounting...'); mountComponents(); } }, 1000); diff --git a/frontend-tools/video-js/src/utils/UserPreferences.js b/frontend-tools/video-js/src/utils/UserPreferences.js index 70c6a325..9d45de02 100644 --- a/frontend-tools/video-js/src/utils/UserPreferences.js +++ b/frontend-tools/video-js/src/utils/UserPreferences.js @@ -12,7 +12,7 @@ class UserPreferences { subtitleLanguage: null, // No subtitles by default subtitleEnabled: false, // Subtitles off by default muted: false, - autoplay: false, // Autoplay disabled by default + autoplay: true, // Autoplay disabled by default }; } @@ -43,7 +43,6 @@ class UserPreferences { const currentPrefs = this.getPreferences(); const updatedPrefs = { ...currentPrefs, ...preferences }; localStorage.setItem(this.storageKey, JSON.stringify(updatedPrefs)); - console.log('User preferences saved:', updatedPrefs); } catch (error) { console.warn('Error saving user preferences to localStorage:', error); } @@ -68,21 +67,13 @@ class UserPreferences { setPreference(key, value, forceSet = false) { // Add special logging for subtitle language changes if (key === 'subtitleLanguage') { - console.log( - `🔄 Setting subtitleLanguage: ${value} (restoring: ${this.isRestoringSubtitles}, autoSaveDisabled: ${this.subtitleAutoSaveDisabled}, forceSet: ${forceSet})` - ); - // Block subtitle language changes during restoration, but allow forced sets if (this.isRestoringSubtitles) { - console.log('🚫 BLOCKED: Subtitle language change during restoration'); return; // Don't save during restoration } // Allow forced sets even if auto-save is disabled (for direct user clicks) if (this.subtitleAutoSaveDisabled && !forceSet) { - console.log( - '🚫 BLOCKED: Subtitle language change during auto-save disabled period (use forceSet=true to override)' - ); return; // Don't save if disabled unless forced } @@ -97,7 +88,6 @@ class UserPreferences { resetPreferences() { try { localStorage.removeItem(this.storageKey); - console.log('User preferences reset to defaults'); } catch (error) { console.warn('Error resetting user preferences:', error); } @@ -112,12 +102,10 @@ class UserPreferences { // DISABLE subtitle auto-save completely during initial load this.subtitleAutoSaveDisabled = true; - console.log('🔒 Subtitle auto-save DISABLED during initial load'); // Re-enable after 3 seconds to ensure everything has settled setTimeout(() => { this.subtitleAutoSaveDisabled = false; - console.log('🔓 Subtitle auto-save RE-ENABLED after initial load period'); }, 3000); // Apply volume and mute state @@ -133,11 +121,6 @@ class UserPreferences { if (typeof prefs.playbackRate === 'number' && prefs.playbackRate > 0) { player.playbackRate(prefs.playbackRate); } - - // Apply subtitle language (will be handled separately for text tracks) - // Quality setting will be handled by the settings menu component - - console.log('Applied user preferences to player:', prefs); } /** @@ -160,7 +143,6 @@ class UserPreferences { player.on('texttrackchange', () => { // Skip saving if we're currently restoring subtitles if (this.isRestoringSubtitles) { - console.log('Skipping subtitle save - currently restoring preferences'); return; } @@ -173,24 +155,16 @@ class UserPreferences { const track = textTracks[i]; if (track.kind === 'subtitles' && track.mode === 'showing') { activeLanguage = track.language; - console.log('Active subtitle language detected:', activeLanguage); break; } } - // If no subtitles are active, save null - if (!activeLanguage) { - console.log('No subtitles active, saving null'); - } - this.setPreference('subtitleLanguage', activeLanguage); }, 100); }); // Also hook into subtitle menu clicks directly this.setupSubtitleMenuListeners(player); - - console.log('Auto-save preferences listeners set up'); } /** @@ -201,7 +175,6 @@ class UserPreferences { // Wait for the control bar to be ready setTimeout(() => { const controlBar = player.getChild('controlBar'); - console.log('=== Searching for subtitle controls ==='); // Check all possible subtitle button names const possibleNames = ['subtitlesButton', 'captionsButton', 'subsCapsButton', 'textTrackButton']; @@ -210,7 +183,6 @@ class UserPreferences { for (const name of possibleNames) { const button = controlBar.getChild(name); if (button) { - console.log(`Found subtitle button: ${name}`); subtitlesButton = button; break; } @@ -218,26 +190,21 @@ class UserPreferences { // Also try to find by scanning all children if (!subtitlesButton) { - console.log('Scanning all control bar children...'); const children = controlBar.children(); - children.forEach((child, index) => { + children.forEach((child) => { const name = child.name_ || child.constructor.name || 'Unknown'; - console.log(`Child ${index}: ${name}`); if ( name.toLowerCase().includes('subtitle') || name.toLowerCase().includes('caption') || name.toLowerCase().includes('text') ) { - console.log(`Potential subtitle button found: ${name}`); subtitlesButton = child; } }); } if (subtitlesButton) { - console.log('Found subtitles button, setting up menu listeners'); - // Wait a bit more for the menu to be created setTimeout(() => { this.attachMenuItemListeners(player, subtitlesButton); @@ -248,8 +215,6 @@ class UserPreferences { this.attachMenuItemListeners(player, subtitlesButton); }, 2000); } else { - console.log('No subtitles button found after exhaustive search'); - // Try alternative approach - listen to DOM changes this.setupDOMBasedListeners(player); } @@ -261,8 +226,6 @@ class UserPreferences { * @param {Object} player - Video.js player instance */ setupDOMBasedListeners(player) { - console.log('Setting up DOM-based subtitle listeners as fallback'); - // Wait for DOM to be ready setTimeout(() => { const playerEl = player.el(); @@ -277,8 +240,6 @@ class UserPreferences { target.closest('.vjs-captions-menu-item') || (target.closest('.vjs-menu-item') && target.textContent.toLowerCase().includes('subtitle')) ) { - console.log('Subtitle menu item clicked via DOM listener:', target.textContent); - // Extract language from the clicked item setTimeout(() => { this.detectActiveSubtitleFromDOM(player, true); // Force set for user clicks @@ -287,14 +248,11 @@ class UserPreferences { // Also handle "captions off" clicks if (target.closest('.vjs-menu-item') && target.textContent.toLowerCase().includes('off')) { - console.log('Captions off clicked via DOM listener'); setTimeout(() => { this.setPreference('subtitleLanguage', null, true); // Force set for user clicks }, 200); } }); - - console.log('DOM-based subtitle listeners attached'); } }, 1500); } @@ -307,7 +265,6 @@ class UserPreferences { detectActiveSubtitleFromDOM(player, forceSet = false) { // Skip saving if we're currently restoring subtitles if (this.isRestoringSubtitles) { - console.log('Skipping DOM subtitle save - currently restoring preferences'); return; } @@ -318,7 +275,6 @@ class UserPreferences { const track = textTracks[i]; if (track.kind === 'subtitles' && track.mode === 'showing') { activeLanguage = track.language; - console.log('DOM detection - Active subtitle language:', activeLanguage, track.label); break; } } @@ -335,49 +291,37 @@ class UserPreferences { try { const menu = subtitlesButton.menu; if (menu && menu.children_) { - console.log('Found subtitle menu with', menu.children_.length, 'items'); - - menu.children_.forEach((menuItem, index) => { + menu.children_.forEach((menuItem) => { if (menuItem.track) { const track = menuItem.track; - console.log(`Menu item ${index}: ${track.label} (${track.language})`); // Override the handleClick method const originalHandleClick = menuItem.handleClick.bind(menuItem); menuItem.handleClick = () => { - console.log('Subtitle menu item clicked:', track.label, track.language); - // Call original click handler originalHandleClick(); // Save the preference after a short delay setTimeout(() => { if (track.mode === 'showing') { - console.log('Saving subtitle preference:', track.language); this.setPreference('subtitleLanguage', track.language, true); // Force set for user clicks } else { - console.log('Subtitle disabled, saving null'); this.setPreference('subtitleLanguage', null, true); // Force set for user clicks } }, 100); }; } else if (menuItem.label && menuItem.label.toLowerCase().includes('off')) { // Handle "captions off" option - console.log('Found captions off menu item'); const originalHandleClick = menuItem.handleClick.bind(menuItem); menuItem.handleClick = () => { - console.log('Captions off clicked'); originalHandleClick(); setTimeout(() => { - console.log('Saving subtitle preference: null (off)'); this.setPreference('subtitleLanguage', null, true); // Force set for user clicks }, 100); }; } }); - } else { - console.log('Could not find subtitle menu or menu items'); } } catch (error) { console.error('Error setting up subtitle menu listeners:', error); @@ -395,20 +339,9 @@ class UserPreferences { if (savedLanguage) { // Set flag to prevent auto-save during restoration this.isRestoringSubtitles = true; - console.log('isRestoringSubtitles', this.isRestoringSubtitles); - // Multiple attempts with increasing delays to ensure text tracks are loaded const attemptToApplySubtitles = (attempt = 1) => { const textTracks = player.textTracks(); - console.log(`Subtitle application attempt ${attempt}, found ${textTracks.length} text tracks`); - - // Log all available tracks for debugging - for (let i = 0; i < textTracks.length; i++) { - const track = textTracks[i]; - console.log( - `Track ${i}: kind=${track.kind}, language=${track.language}, label=${track.label}, mode=${track.mode}` - ); - } // First, disable all subtitle tracks for (let i = 0; i < textTracks.length; i++) { @@ -432,7 +365,6 @@ class UserPreferences { const track = textTracks[i]; if (track.kind === 'subtitles' && matchesLang(track, savedLanguage)) { track.mode = 'showing'; - console.log('✓ Applied saved subtitle language:', savedLanguage, track.label); found = true; // Also update the menu UI to reflect the selection @@ -452,10 +384,7 @@ class UserPreferences { const track = textTracks[i]; if (track.kind === 'subtitles') { track.mode = 'showing'; - console.log( - 'Fallback ✓ Enabled first available subtitles track:', - track.label || track.language || track.srclang - ); + // Save back the language we actually enabled for future precise matches const langToSave = track.language || track.srclang || null; if (langToSave) this.setPreference('subtitleLanguage', langToSave, true); @@ -472,12 +401,10 @@ class UserPreferences { // Clear the restoration flag after a longer delay to ensure all events have settled setTimeout(() => { this.isRestoringSubtitles = false; - console.log('✅ Subtitle restoration complete, auto-save re-enabled'); }, 600); // Increased to 3 seconds // If not found and we haven't tried too many times, try again if (!found && attempt < 5) { - console.log(`Subtitle language ${savedLanguage} not found, retrying in ${attempt * 50}ms...`); setTimeout(() => attemptToApplySubtitles(attempt + 1), attempt * 50); } else if (!found) { console.warn('Could not find subtitle track for language:', savedLanguage); @@ -518,8 +445,9 @@ class UserPreferences { // Update custom settings menu to show "Off" as selected this.updateCustomSettingsMenuUI(player); - } catch (e) {} - console.log('No subtitle auto-apply on load (disabled or no language).'); + } catch (e) { + console.error('Error applying subtitle preference:', e); + } } } @@ -538,13 +466,9 @@ class UserPreferences { if (enabled) { buttonEl.classList.add('vjs-subs-active'); - console.log('✓ Added vjs-subs-active class to subtitle button'); } else { buttonEl.classList.remove('vjs-subs-active'); - console.log('✓ Removed vjs-subs-active class from subtitle button'); } - } else { - console.log('Subtitle button not found for visual state update'); } } catch (error) { console.error('Error updating subtitle button visual state:', error); @@ -569,7 +493,6 @@ class UserPreferences { if (menuItem.track) { if (menuItem.track === activeTrack) { menuItem.selected(true); - console.log('Updated menu UI for:', menuItem.track.label); } else { menuItem.selected(false); } @@ -598,16 +521,11 @@ class UserPreferences { const customSettingsMenu = controlBar.getChild('CustomSettingsMenu'); if (customSettingsMenu && customSettingsMenu.refreshSubtitlesSubmenu) { - console.log('Updating custom settings menu UI...'); customSettingsMenu.refreshSubtitlesSubmenu(); } else if (attempt < 5) { // Retry after a short delay if menu not found - console.log( - `Custom settings menu not found, retrying in ${attempt * 200}ms... (attempt ${attempt})` - ); + setTimeout(() => attemptUpdate(attempt + 1), attempt * 200); - } else { - console.log('Custom settings menu not found after multiple attempts'); } } catch (error) { console.error('Error updating custom settings menu UI:', error); @@ -639,12 +557,10 @@ class UserPreferences { * @param {string} language - Subtitle language code */ forceSetSubtitleLanguage(language) { - console.log(`🚀 FORCE SAVING subtitle language: ${language}`); const currentPrefs = this.getPreferences(); const updatedPrefs = { ...currentPrefs, subtitleLanguage: language }; try { localStorage.setItem(this.storageKey, JSON.stringify(updatedPrefs)); - console.log('✅ Force saved subtitle language:', language); } catch (error) { console.error('❌ Error force saving subtitle language:', error); } @@ -664,7 +580,6 @@ class UserPreferences { */ setAutoplayPreference(autoplay) { this.setPreference('autoplay', autoplay); - console.log('Autoplay preference saved:', autoplay); } } diff --git a/static/video_js/video-js.css b/static/video_js/video-js.css index c94eaa15..fe13097f 100644 --- a/static/video_js/video-js.css +++ b/static/video_js/video-js.css @@ -1 +1 @@ -html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}.playlist-items a{text-decoration:none!important}.video-js video{outline:none!important}.video-js .vjs-poster{border-radius:12px!important}.video-js video{border-radius:12px!important}#page-embed .video-js-root-embed .video-js video{width:100vw!important;height:100vh!important;object-fit:cover!important;border-radius:0!important}#page-embed .video-js-root-embed .video-js .vjs-poster{border-radius:0!important;width:100vw!important;height:100vh!important;object-fit:cover!important}.video-js div.vjs-control-bar{background:transparent!important;background-color:transparent!important;background-image:none!important;display:flex!important;flex-direction:row!important;align-items:center!important;justify-content:flex-start!important;padding:0 12px;height:48px}.video-container{width:100%;max-width:1200px;margin:0 auto;padding:0 20px;box-sizing:border-box}#page-embed .video-js-root-embed .video-container{width:100vw;height:100vh;max-width:none;margin:0;padding:0;box-sizing:border-box;position:fixed;top:0;left:0;z-index:1000}.video-js.vjs-fluid{width:100%!important;max-width:100%!important}#page-embed .video-js-root-embed .video-js.vjs-fluid{width:100vw!important;height:100vh!important;max-width:none!important;max-height:none!important}.vjs-next-video-control .vjs-icon-placeholder{width:1.2em;height:1.2em;display:flex;align-items:center;justify-content:center;margin:auto}.vjs-next-video-control .vjs-icon-placeholder svg{width:100%;height:100%;display:block}.vjs-end-screen-overlay{position:absolute;top:0;left:0;width:100%;background:rgba(0,0,0,.5);display:none;flex-direction:column;justify-content:center;align-items:center;height:calc(100% - 46px);box-sizing:border-box;padding:20px;gap:10px;z-index:4}.vjs-related-videos-title{color:#fff;font-size:24px;line-height:24px;padding:0;margin:0;text-align:center;font-weight:700;flex-shrink:0}.vjs-related-videos-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:3px;width:100%;max-width:100%;margin:0;box-sizing:border-box;justify-items:center;overflow:hidden;align-self:center;flex-shrink:0;height:calc(100% - 44px)}.vjs-related-video-item{position:relative;cursor:pointer;border-radius:5px;overflow:hidden;transition:transform .2s ease,box-shadow .2s ease;background:#1a1a1a;border:1px solid #333;width:100%;max-width:100%;box-shadow:0 2px 8px #0000001a}.vjs-related-video-item:hover{transform:translateY(-2px);box-shadow:0 8px 25px #0000004d}.vjs-related-video-thumbnail{width:100%;height:100%;object-fit:cover;display:block;background:#1a1a1a;transition:transform .2s ease}.vjs-related-video-item:hover .vjs-related-video-thumbnail{transform:scale(1.02)}.vjs-related-video-overlay{position:absolute;top:0;left:0;right:0;bottom:0;background:linear-gradient(transparent,rgba(0,0,0,.9));color:#fff;padding:12px;opacity:0;transition:opacity .3s ease;display:flex;flex-direction:column;justify-content:flex-start;height:100%}.vjs-related-video-item:hover .vjs-related-video-overlay{opacity:1}.vjs-related-video-title{font-size:14px;font-weight:700;line-height:1.3;color:#fff;margin-bottom:4px}.vjs-related-video-meta{display:flex;flex-direction:row;gap:8px;align-items:center}.vjs-related-video-author{font-size:12px;color:#ccc}.vjs-related-video-views{font-size:12px;color:#aaa}.vjs-related-video-author:after{content:"•";margin-left:8px;color:#666}.vjs-related-video-duration{position:absolute;bottom:8px;right:8px;background:rgba(0,0,0,.8);color:#fff;padding:2px 6px;font-size:11px;font-weight:700;border-radius:2px;opacity:0;transition:opacity .3s ease}.vjs-related-video-item:hover .vjs-related-video-duration{opacity:1}.video-js.vjs-ended .vjs-control-bar{opacity:1!important;pointer-events:auto!important}.video-js.vjs-ended .vjs-control-bar .vjs-control,.video-js.vjs-ended .vjs-control-bar button{opacity:1!important;pointer-events:auto!important;cursor:pointer!important}.video-js.vjs-ended .vjs-control-bar .vjs-control.vjs-volume-control{opacity:0!important}.video-js.vjs-ended .vjs-control-bar .vjs-volume-panel.vjs-hover .vjs-volume-control{opacity:1!important}.video-js.vjs-ended .vjs-play-control{opacity:1!important;pointer-events:auto!important;cursor:pointer!important}.video-js.vjs-ended .vjs-progress-control,.video-js.vjs-ended .vjs-volume-panel{opacity:1!important;pointer-events:auto!important}.vjs-chapter-markers-track{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;overflow:hidden}.vjs-chapter-marker{position:absolute;top:0;width:2px;height:100%;background:rgba(255,255,255,.6);pointer-events:auto;cursor:pointer;transition:background .2s ease}.vjs-chapter-marker:hover{background:rgba(255,255,255,.9);width:3px}.vjs-chapter-marker-tooltip{position:absolute;bottom:8px;left:50%;transform:translate(-50%);background:rgba(0,0,0,.8);color:#fff;padding:4px 8px;border-radius:4px;font-size:11px;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .2s ease;z-index:1001}.vjs-chapter-marker:hover .vjs-chapter-marker-tooltip{opacity:1}.vjs-chapter-floating-tooltip{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif!important;line-height:1.4!important;animation:fadeIn .2s ease-in-out}@keyframes fadeIn{0%{opacity:0;transform:translate(-50%) translateY(5px)}to{opacity:1;transform:translate(-50%) translateY(0)}}.video-js .vjs-menu-button:not(.vjs-disabled) .vjs-menu{display:none!important}.video-js .vjs-menu-button:not(.vjs-disabled).vjs-lock-showing .vjs-menu,.video-js .vjs-menu-button:not(.vjs-disabled) .vjs-menu.vjs-lock-showing{display:block!important}.video-js .vjs-menu-button:hover .vjs-menu{display:none!important}.video-js .vjs-menu-button.vjs-lock-showing:hover .vjs-menu{display:block!important}.video-js .vjs-menu.vjs-lock-showing{display:block!important;opacity:1!important;visibility:visible!important}.video-js.chapters-open .vjs-menu,.video-js.chapters-open .vjs-menu.vjs-lock-showing,.video-js.chapters-open .vjs-hover-display,.video-js.chapters-open .vjs-time-tooltip,.video-js.chapters-open .vjs-progress-holder .vjs-mouse-display{display:none!important;opacity:0!important;visibility:hidden!important}.video-js .vjs-volume-panel.vjs-hover{transition:ease-in-out .5s!important;width:auto!important}.video-js .vjs-captions-button,.video-js .vjs-subs-caps-button{display:none!important}.video-js .vjs-subtitles-button .vjs-menu,.video-js .vjs-subtitles-button .vjs-menu.vjs-lock-showing{display:none!important;visibility:hidden!important;opacity:0!important;pointer-events:none!important}.video-js .vjs-text-track-display{position:absolute!important;bottom:6em!important;left:0!important;right:0!important;top:0!important;pointer-events:none!important;z-index:10!important}.video-js .vjs-text-track-cue{position:absolute!important;bottom:0!important;left:0!important;right:0!important;text-align:center!important;padding:0!important;background:transparent!important;border:none!important;font-size:1.2em!important;line-height:1.4!important;color:#fff!important;text-shadow:2px 2px 4px rgba(0,0,0,.8)!important;font-family:Arial,sans-serif!important;font-weight:600!important;white-space:pre-line!important;word-wrap:break-word!important;max-width:90%!important;margin:0 auto!important;z-index:11!important}.video-js .vjs-text-track-cue>div{background:rgba(0,0,0,.7)!important;padding:8px 12px!important;border-radius:4px!important;display:inline-block!important;margin:2px 0!important;max-width:100%!important;box-sizing:border-box!important}.video-js.vjs-fullscreen .vjs-text-track-display{bottom:8em!important}.video-js.vjs-fullscreen .vjs-text-track-cue{font-size:1.4em!important;max-width:85%!important}.video-js.vjs-fullscreen .vjs-text-track-cue>div{padding:10px 16px!important;font-size:1em!important}.video-js .vjs-subtitles-button .vjs-menu.vjs-lock-showing .vjs-menu-content{display:none!important;visibility:hidden!important;opacity:0!important;pointer-events:none!important}.video-js .vjs-chapters-button .vjs-menu,.video-js .vjs-chapters-button .vjs-menu.vjs-lock-showing,.video-js .vjs-chapters-button .vjs-menu.vjs-lock-showing .vjs-menu-content{display:none!important}.video-js .vjs-chapters-button .vjs-menu{display:none!important;visibility:hidden!important;opacity:0!important;pointer-events:none!important}.video-js .vjs-subtitles-button{position:relative;cursor:pointer!important;pointer-events:auto!important}.video-js button.vjs-subtitles-button{cursor:pointer!important;pointer-events:auto!important;touch-action:manipulation!important;-webkit-tap-highlight-color:transparent!important}.video-js button.vjs-subtitles-button:before{content:"";position:absolute;left:50%;transform:translate(-50%);bottom:6px;height:3px;background:#e1002d;border-radius:2px;width:0;padding:0;transition:none!important;animation:none!important;-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important}.video-js .vjs-subs-active button.vjs-subtitles-button:before{width:24px;transition:none!important;animation:none!important;-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important}.video-js button.vjs-subtitles-button{transition:none!important;animation:none!important;-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important}.video-js .vjs-autoplay-toggle .vjs-hover-display,.video-js .vjs-autoplay-toggle .vjs-tooltip,.video-js .vjs-autoplay-toggle .vjs-tooltip-text{display:none!important;visibility:hidden!important;opacity:0!important;pointer-events:none!important}.video-js .vjs-autoplay-toggle{position:relative}.video-js .vjs-autoplay-toggle:after{content:attr(title);position:absolute;bottom:100%;left:50%;transform:translate(-50%);background:rgba(0,0,0,.9);color:#fff;padding:6px 10px;border-radius:4px;font-size:12px;white-space:nowrap;pointer-events:none;opacity:0;visibility:hidden;transition:opacity .2s ease,visibility .2s ease;z-index:1000;margin-bottom:8px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;box-shadow:0 2px 8px #0000004d;border:1px solid rgba(255,255,255,.1)}.video-js .vjs-autoplay-toggle:hover:after,.video-js .vjs-autoplay-toggle:focus:after{opacity:1;visibility:visible}.video-js .vjs-settings-button{cursor:pointer!important;pointer-events:auto!important;position:relative!important;display:flex!important;align-items:center!important;justify-content:center!important;min-width:32px!important;height:32px!important;padding:0!important;margin:0 2px!important;border:none!important;background:transparent!important;color:inherit!important;font-size:inherit!important;line-height:inherit!important;text-align:center!important;vertical-align:middle!important;touch-action:manipulation!important;-webkit-tap-highlight-color:transparent!important;-webkit-touch-callout:none!important;-webkit-user-select:none!important;user-select:none!important}.video-js .vjs-settings-button:hover{background-color:#ffffff1a!important}.video-js .vjs-settings-button:focus{outline:2px solid #fff!important;outline-offset:2px!important}.video-js .vjs-settings-button .vjs-icon-cog{font-size:18px!important;width:18px!important;height:18px!important;display:flex!important;align-items:center!important;justify-content:center!important}.vjs-play-progress{background-color:#019932!important}.vjs-load-progress,.vjs-progress-holder{background:rgba(255,255,255,.5)!important}.video-js .vjs-progress-control{position:absolute!important;bottom:46px!important;left:0!important;right:0!important;width:100%!important;height:0!important;z-index:3!important;padding:0!important;margin:0 auto!important}.video-js .vjs-control-bar .vjs-progress-control{display:none!important}.video-js .vjs-progress-control.vjs-control{display:block!important}.video-js .vjs-control-bar .vjs-icon-placeholder,.video-js .vjs-control-bar .vjs-button .vjs-icon-placeholder,.video-js .vjs-control-bar [class*=vjs-icon-]{font-size:1.5em!important}.vjs-control-bar .custom-remaining-time .vjs-remaining-time-display{font-size:14px!important;font-weight:500;line-height:1;display:flex;align-items:center;justify-content:center;height:100%;color:#fff}.vjs-mouse-display{z-index:4!important}.vjs-slider-horizontal{top:-5px}.video-js .vjs-spacer-control{flex:1!important;min-width:1px!important;height:100%!important}.video-js .vjs-control-bar .vjs-control{flex:none!important}.video-js .vjs-autoplay-toggle{margin-right:10px!important}.video-js .vjs-picture-in-picture-control{margin-left:6px!important}.vjs-seek-indicator{position:absolute!important;top:50%!important;left:50%!important;transform:translate(-50%,-50%)!important;z-index:9999!important;pointer-events:none!important;display:none!important;align-items:center!important;justify-content:center!important;opacity:0!important;visibility:hidden!important;transition:opacity .2s ease-in-out!important}.vjs-seek-indicator-content{background:transparent!important;flex-direction:column!important;align-items:center!important;justify-content:center!important}.vjs-seek-indicator-icon{position:relative!important;display:flex!important;align-items:center!important;justify-content:center!important;margin-bottom:4px!important}.seek-icon-container{display:flex!important;flex-direction:column!important;align-items:center!important;justify-content:center!important;animation:seekPulse .3s ease-out!important}.youtube-seek-container{display:flex!important;align-items:center!important;justify-content:center!important;animation:youtubeSeekPulse .3s ease-out!important}.youtube-seek-circle{width:80px!important;height:80px!important;border-radius:50%!important;-webkit-border-radius:50%!important;-moz-border-radius:50%!important;background:rgba(0,0,0,.8)!important;backdrop-filter:blur(10px)!important;-webkit-backdrop-filter:blur(10px)!important;display:flex!important;flex-direction:column!important;align-items:center!important;justify-content:center!important;padding:0!important;box-shadow:0 4px 20px #0000004d!important;border:1px solid rgba(255,255,255,.15)!important;box-sizing:border-box!important;overflow:hidden!important}.youtube-seek-icon{display:flex!important;align-items:center!important;justify-content:center!important;margin-bottom:4px!important}.youtube-seek-icon svg{filter:drop-shadow(0 1px 2px rgba(0,0,0,.5))!important}.youtube-seek-time{color:#fff!important;font-size:10px!important;font-weight:500!important;text-align:center!important;line-height:1.2!important;opacity:.9!important;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif!important}@keyframes youtubeSeekPulse{0%{transform:scale(.7);opacity:.5}50%{transform:scale(1.05);opacity:.9}to{transform:scale(1);opacity:1}}.seek-seconds{color:#fff!important;font-size:16px!important;font-weight:700!important;text-shadow:0 2px 4px rgba(0,0,0,.7)!important;line-height:1!important}.vjs-seek-indicator-text{color:#fff!important;font-size:16px!important;font-weight:500!important;text-align:center!important;text-shadow:0 1px 2px rgba(0,0,0,.8)!important}button{cursor:pointer}.video-js{padding:0;height:100%!important;border-radius:12px;outline:none}.video-js:focus{box-shadow:0 0 0 3px #19993280;border-radius:12px}.video-js[tabindex]{outline:none}#page-embed .video-js-root-embed .video-js{width:100vw!important;height:100vh!important;border-radius:0;position:relative}#page-embed .video-js-root-embed{position:fixed;top:0;left:0;width:100vw;height:100vh;z-index:9999;background:#000}.video-chapter{position:absolute;top:auto;bottom:60px;width:min(360px,calc(100% - 20px));border:1px solid rgba(255,255,255,.12);border-radius:12px;height:calc(100% - 80px);background:rgba(18,18,18,.96);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);overflow:hidden;box-shadow:0 12px 30px #00000073;right:10px}.chapter-head{padding:12px 8px 10px 16px;position:sticky;top:0;left:0;background:linear-gradient(180deg,rgba(28,28,28,.95),rgba(18,18,18,.95));border-bottom:1px solid rgba(255,255,255,.08);z-index:2}.playlist-title{display:flex;align-items:center;gap:10px}.chapter-title{width:auto;flex:1;min-width:0}.chapter-title h3{margin:0;padding:0}.chapter-title h3 a{color:#fff;font-size:18px;line-height:26px;font-weight:700;text-decoration:none;white-space:nowrap;text-overflow:ellipsis;height:28px;overflow:hidden;display:block}.chapter-title p{margin:4px 0 0;padding:0;color:#fff;font-size:12px;font-weight:400;line-height:15px}.chapter-title p a{color:#fff;font-size:12px;font-weight:400;line-height:15px;text-decoration:none}.chapter-close{width:40px;margin-left:auto;display:flex;align-items:center;justify-content:flex-end}.chapter-close button{background:transparent;color:#fff;border:0;width:40px;height:40px;padding:0;display:flex;align-items:center;justify-content:center;border-radius:8px}.chapter-close button:hover{background:rgba(255,255,255,.1)}.settings-header{display:flex;align-items:center;justify-content:space-between;position:relative}.settings-close-btn{background:transparent;color:#fff;border:0;width:32px;height:32px;padding:0;display:flex;align-items:center;justify-content:center;border-radius:6px;cursor:pointer}.settings-close-btn:hover{background:rgba(255,255,255,.1)}.playlist-action-menu{display:none;justify-content:space-between;gap:10px}.playlist-action-menu button{background:transparent;border:0;width:40px;height:40px;padding:0;display:flex;justify-content:center;align-items:center;border-radius:100px}.playlist-action-menu button:hover{background:rgba(0,0,0,.1)}.start-action{display:flex}.chapter-body{height:calc(100% - 80px);overflow:auto;-webkit-overflow-scrolling:touch;touch-action:pan-y;overscroll-behavior:contain;scroll-behavior:smooth}.chapter-body ul{margin:0;padding:0}.playlist-items a{padding:12px;display:flex;align-items:center;text-decoration:none;gap:12px;width:100%;box-sizing:border-box;color:#fff}.playlist-items a:hover{background:rgba(255,255,255,.06)}.playlist-items.selected a{background:rgba(255,255,255,.14)}.playlist-drag-handle{width:24px;display:flex;justify-content:center;color:#e0e0e0;font-size:12px}.thumbnail-meta{flex:1;min-width:0;padding:0}.thumbnail-meta h4{margin:0 2px 4px 0;font-size:14px;line-height:20px;font-weight:600;overflow:hidden;text-overflow:ellipsis;color:#fff;white-space:normal;max-height:40px;-webkit-line-clamp:2;line-clamp:2;display:-webkit-box;-webkit-box-orient:vertical}.thumbnail-meta .meta-sub{display:flex;gap:8px;align-items:center}.thumbnail-meta .meta-sub .meta-dynamic{color:#bdbdbd;font-size:12px;line-height:18px}.thumbnail-action button{border:0;background:transparent;color:#fff;opacity:0}.playlist-items a:hover .thumbnail-action button{opacity:1}.chapter-body::-webkit-scrollbar{width:10px}.chapter-body::-webkit-scrollbar-thumb{background:rgba(255,255,255,.18);border-radius:8px}.chapter-body::-webkit-scrollbar-track{background:transparent}@media (max-width: 767px){.chapter-body{-webkit-overflow-scrolling:touch;touch-action:pan-y;overscroll-behavior:contain}.chapter-body::-webkit-scrollbar{width:0px}}.video-js .vjs-control-bar .vjs-spacer-control{margin-left:auto}.video-js .vjs-control-bar .settings-item-svg{display:flex}.video-js .vjs-control-bar .settings-item-svg svg{width:auto!important;height:auto!important;transform:inherit!important}.video-js div.vjs-control{width:auto}.vjs-chapters-button button.vjs-button,.vjs-subtitles-button button.vjs-button,.video-js button.vjs-control{width:48px;height:48px;display:flex;align-items:center;justify-content:center}button.vjs-button>.vjs-icon-placeholder:before{line-height:48px;transition:ease-in-out .5s}.video-js .vjs-volume-panel div.vjs-volume-control{height:100%!important;display:flex;align-items:center;justify-content:center;margin:0;width:0;transition:ease-in-out .5s!important;opacity:0}.video-js .vjs-volume-panel div.vjs-volume-control .vjs-volume-bar{margin:0;top:0}.vjs-settings-button svg{transition:ease-in-out .3s}.vjs-settings-button.settings-clicked svg{transform:rotate(30deg)}.video-js span.vjs-control-text{position:absolute!important;bottom:125%;left:50%;transform:translate(-50%);background:rgba(0,0,0,.75);color:#fff;padding:6px 8px!important;border-radius:3px;font-size:13px;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .3s ease;z-index:1000;box-shadow:0 0 5px #0000004d;height:auto!important;width:auto!important;overflow:visible!important;clip:initial!important}.video-js button.vjs-button:hover span.vjs-control-text{opacity:1}.video-js .vjs-control:focus:before,.video-js .vjs-control:hover:before,.video-js .vjs-control:focus{text-shadow:none!important}.vjs-volume-panel{gap:5px}.video-js .vjs-play-progress.vjs-slider-bar+.vjs-time-tooltip{padding:0}.vjs-chapter-floating-tooltip{text-align:center;width:160px!important;max-width:100%!important;height:auto}.chapter-image-sprite{width:166px!important;max-width:100%!important;height:96px;margin:0 auto 10px;border-radius:6px;border:3px solid #fff}.vjs-chapter-floating-tooltip .chapter-title{font-size:16px;margin:0 0 10px;font-weight:700;word-break:break-all;line-height:20px}.vjs-chapter-floating-tooltip .position-info,.vjs-chapter-floating-tooltip .chapter-info{font-size:15px;display:inline-block;margin:0 0 2px;line-height:normal;vertical-align:top;line-height:20px}.vjs-sprite-preview-tooltip{text-align:center;width:172px!important;max-width:100%!important;height:auto}.vjs-sprite-preview-tooltip .sprite-image-preview{width:166px!important;max-width:100%!important;height:96px;margin:0 auto;border-radius:6px;border:3px solid #fff}@media (pointer: coarse){.video-js .vjs-volume-panel div.vjs-volume-control{width:auto;opacity:1}}@media (min-width: 1200px){.vjs-related-videos-grid{grid-template-columns:repeat(4,1fr)}}@media (max-width: 1199px){.vjs-related-video-item:nth-child(n+10){display:none}}@media (max-width: 1139px){.vjs-related-video-item:nth-child(n+7){display:none}}@media (min-width: 1024px) and (max-width: 1199px){.vjs-related-videos-grid{grid-template-columns:repeat(3,1fr)}}@media (min-width: 1025px){.video-js .vjs-text-track-display{bottom:6em!important}.video-js .vjs-autoplay-toggle{margin-right:12px!important}.video-js .vjs-picture-in-picture-control{margin-left:12px!important}.video-js .vjs-text-track-cue{font-size:1.2em!important;max-width:90%!important}.video-js .vjs-text-track-cue>div{padding:8px 12px!important;font-size:1em!important}.video-js.vjs-fullscreen .vjs-text-track-display{bottom:8em!important}}@media (min-width: 768px) and (max-width: 1024px){.video-js .vjs-text-track-display{bottom:7em!important}.video-js .vjs-text-track-cue{font-size:1.15em!important;max-width:88%!important}.video-js .vjs-text-track-cue>div{padding:7px 11px!important;font-size:.95em!important}.video-js.vjs-fullscreen .vjs-text-track-display{bottom:9em!important}.vjs-related-videos-grid{grid-template-columns:repeat(3,1fr)}.video-js .vjs-control:hover:after,.video-js .vjs-control:focus:after,.video-js .vjs-control:active:after{display:none!important;opacity:0!important;visibility:hidden!important}.video-js .vjs-play-control:hover:after,.video-js .vjs-mute-control:hover:after,.video-js .vjs-volume-panel:hover:after,.video-js .vjs-fullscreen-control:hover:after,.video-js .vjs-picture-in-picture-control:hover:after,.video-js .vjs-settings-control:hover:after,.video-js .vjs-chapters-control:hover:after,.video-js .vjs-autoplay-toggle:hover:after,.video-js .vjs-next-video-control:hover:after,.video-js .vjs-remaining-time:hover:after{display:none!important;opacity:0!important;visibility:hidden!important}}@media (max-width: 1024px){body div.custom-settings-overlay{height:calc(100% - 40px);max-height:300px}}@media (max-width: 767px){.vjs-related-vdeo-item:nth-child(n+5){display:none}.vjs-chapters-button button.vjs-button,.vjs-subtitles-button button.vjs-button,.video-js button.vjs-control{width:32px;height:32px}button.vjs-button>.vjs-icon-placeholder:before{line-height:32px}.vjs-next-video-control svg{width:32px;height:32px}.video-js div.vjs-control{height:32px}.vjs-button>.vjs-icon-placeholder:before{font-size:1.4em!important}.video-js .vjs-subs-active button.vjs-subtitles-button:before{width:20px}.video-js button.vjs-subtitles-button:before{bottom:2px}.video-js div.vjs-control-bar{padding:0 2px}.video-js .vjs-autoplay-toggle{margin-right:6px!important}.video-js .vjs-picture-in-picture-control{margin-left:6px!important}.video-js .vjs-text-track-display{bottom:8em!important}.video-js .vjs-text-track-cue{font-size:1.1em!important;max-width:95%!important}.video-js .vjs-text-track-cue>div{padding:6px 10px!important;font-size:.9em!important;background:rgba(0,0,0,.8)!important}.video-js.vjs-fullscreen .vjs-text-track-display{bottom:10em!important}.video-js.vjs-fullscreen .vjs-text-track-cue{font-size:1.3em!important;max-width:90%!important}.video-js.vjs-fullscreen .vjs-text-track-cue>div{padding:8px 12px!important;font-size:.95em!important}.video-js .vjs-subtitles-button button.vjs-button{min-width:32px!important;min-height:32px!important;touch-action:manipulation!important;-webkit-tap-highlight-color:transparent!important;-webkit-touch-callout:none!important;-webkit-user-select:none!important;user-select:none!important}.chapter-body{height:calc(100% - 70px)}.subtitles-submenu,.quality-submenu,.speed-submenu{height:100%;overflow:auto}body div.custom-settings-overlay{bottom:40px}div.chapter-close button{width:30px;height:30px}.vjs-related-videos-grid{grid-template-columns:repeat(2,1fr)}.video-js .vjs-control:hover:after,.video-js .vjs-control:focus:after,.video-js .vjs-control:active:after{display:none!important;opacity:0!important;visibility:hidden!important}.video-js .vjs-play-control:hover:after,.video-js .vjs-mute-control:hover:after,.video-js .vjs-volume-panel:hover:after,.video-js .vjs-fullscreen-control:hover:after,.video-js .vjs-picture-in-picture-control:hover:after,.video-js .vjs-settings-control:hover:after,.video-js .vjs-chapters-control:hover:after,.video-js .vjs-autoplay-toggle:hover:after,.video-js .vjs-next-video-control:hover:after,.video-js .vjs-remaining-time:hover:after{display:none!important;opacity:0!important;visibility:hidden!important}.video-js .vjs-autoplay-toggle.touch-active:after{opacity:1;visibility:visible}.video-js .vjs-autoplay-toggle:after{font-size:11px;padding:5px 8px;margin-bottom:6px}.video-container{padding:0 15px}.vjs-related-video-thumbnail{height:100%}.vjs-chapter-floating-tooltip{font-size:11px!important}.custom-chapters-overlay .video-chapter{right:10px;left:auto;width:100%;max-width:280px;height:calc(100% - 40px);max-height:calc(100% - 40px);overflow:hidden;bottom:40px}.video-js .vjs-settings-button{min-width:44px!important;height:44px!important;padding:0!important;margin:0 2px!important;display:flex!important;align-items:center!important;justify-content:center!important;touch-action:manipulation!important;-webkit-tap-highlight-color:transparent!important;cursor:pointer!important;z-index:1000!important;pointer-events:auto!important;position:relative!important}.video-js .vjs-settings-button .vjs-icon-cog{font-size:20px!important;width:20px!important;height:20px!important;display:flex!important;align-items:center!important;justify-content:center!important}.video-js .vjs-control-bar .vjs-button{touch-action:manipulation!important;-webkit-tap-highlight-color:transparent!important;-webkit-touch-callout:none!important;-webkit-user-select:none!important;user-select:none!important}.custom-settings-overlay .settings-item{padding:6px 16px;font-size:15px;touch-action:manipulation;line-height:18px}.custom-settings-overlay .settings-header{padding:10px 16px;font-size:18px;line-height:20px}.chapter-head{padding:10px 15px}.chapter-title h3 a{font-size:15px!important;line-height:20px!important;height:20px!important}.chapter-title p{font-size:11px!important;line-height:14px!important}.playlist-items a{padding:10px 16px!important;min-height:58px!important}.thumbnail-meta h4{font-size:13px!important;line-height:18px!important}.thumbnail-meta .meta-sub .meta-dynamic{font-size:11px!important;line-height:16px!important}}@media (max-width: 574px){.vjs-related-video-item:nth-child(n+3){display:none}}@media (max-width: 480px){.video-container{padding:0 10px}.video-js .vjs-control:hover:after,.video-js .vjs-control:focus:after,.video-js .vjs-control:active:after{display:none!important;opacity:0!important;visibility:hidden!important}.video-js .vjs-play-control:hover:after,.video-js .vjs-mute-control:hover:after,.video-js .vjs-volume-panel:hover:after,.video-js .vjs-fullscreen-control:hover:after,.video-js .vjs-picture-in-picture-control:hover:after,.video-js .vjs-settings-control:hover:after,.video-js .vjs-chapters-control:hover:after,.video-js .vjs-autoplay-toggle:hover:after,.video-js .vjs-next-video-control:hover:after,.video-js .vjs-remaining-time:hover:after{display:none!important;opacity:0!important;visibility:hidden!important}.vjs-related-video-thumbnail{height:100%}.video-js .vjs-settings-button .vjs-icon-cog{font-size:22px!important;width:22px!important;height:22px!important}}@media (max-width: 439px){.vjs-related-video-item:nth-child(n+2){display:none}.vjs-related-videos-grid{grid-template-columns:repeat(1,1fr)}}@media (max-width: 399px){.vjs-chapters-button button.vjs-button,.vjs-subtitles-button button.vjs-button,.video-js button.vjs-control{width:28px;height:28px}button.vjs-button>.vjs-icon-placeholder:before{line-height:28px}.vjs-next-video-control svg{width:28px;height:28px}.video-js div.vjs-control{height:28px}.video-js .vjs-autoplay-toggle{margin-right:4px!important}.video-js .vjs-picture-in-picture-control{margin-left:4px!important}.video-js .vjs-text-track-display{bottom:7em!important}.video-js .vjs-text-track-cue{font-size:1em!important;max-width:98%!important}.video-js .vjs-text-track-cue>div{padding:4px 8px!important;font-size:.85em!important;background:rgba(0,0,0,.85)!important}.video-js.vjs-fullscreen .vjs-text-track-display{bottom:9em!important}.video-js.vjs-fullscreen .vjs-text-track-cue{font-size:1.2em!important;max-width:95%!important}.video-js.vjs-fullscreen .vjs-text-track-cue>div{padding:6px 10px!important;font-size:.9em!important}.vjs-button>.vjs-icon-placeholder:before{font-size:1.4em!important}}.vjs-svg-icon{display:inline-block;background-repeat:no-repeat;background-position:center;fill:currentColor;height:1.8em;width:1.8em}.vjs-svg-icon:before{content:none!important}.vjs-svg-icon:hover,.vjs-control:focus .vjs-svg-icon{filter:drop-shadow(0 0 .25em #fff)}.vjs-modal-dialog .vjs-modal-dialog-content,.video-js .vjs-modal-dialog,.vjs-button>.vjs-icon-placeholder:before,.video-js .vjs-big-play-button .vjs-icon-placeholder:before{position:absolute;top:0;left:0;width:100%;height:100%}.vjs-button>.vjs-icon-placeholder:before,.video-js .vjs-big-play-button .vjs-icon-placeholder:before{text-align:center}@font-face{font-family:VideoJS;src:url(data:application/font-woff;charset=utf-8;base64,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) format("woff");font-weight:400;font-style:normal}.vjs-icon-play,.video-js .vjs-play-control .vjs-icon-placeholder,.video-js .vjs-big-play-button .vjs-icon-placeholder:before{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-play:before,.video-js .vjs-play-control .vjs-icon-placeholder:before,.video-js .vjs-big-play-button .vjs-icon-placeholder:before{content:""}.vjs-icon-play-circle{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-play-circle:before{content:""}.vjs-icon-pause,.video-js .vjs-play-control.vjs-playing .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-pause:before,.video-js .vjs-play-control.vjs-playing .vjs-icon-placeholder:before{content:""}.vjs-icon-volume-mute,.video-js .vjs-mute-control.vjs-vol-0 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-volume-mute:before,.video-js .vjs-mute-control.vjs-vol-0 .vjs-icon-placeholder:before{content:""}.vjs-icon-volume-low,.video-js .vjs-mute-control.vjs-vol-1 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-volume-low:before,.video-js .vjs-mute-control.vjs-vol-1 .vjs-icon-placeholder:before{content:""}.vjs-icon-volume-mid,.video-js .vjs-mute-control.vjs-vol-2 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-volume-mid:before,.video-js .vjs-mute-control.vjs-vol-2 .vjs-icon-placeholder:before{content:""}.vjs-icon-volume-high,.video-js .vjs-mute-control .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-volume-high:before,.video-js .vjs-mute-control .vjs-icon-placeholder:before{content:""}.vjs-icon-fullscreen-enter,.video-js .vjs-fullscreen-control .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-fullscreen-enter:before,.video-js .vjs-fullscreen-control .vjs-icon-placeholder:before{content:""}.vjs-icon-fullscreen-exit,.video-js.vjs-fullscreen .vjs-fullscreen-control .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-fullscreen-exit:before,.video-js.vjs-fullscreen .vjs-fullscreen-control .vjs-icon-placeholder:before{content:""}.vjs-icon-spinner{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-spinner:before{content:""}.vjs-icon-subtitles,.video-js .vjs-subs-caps-button .vjs-icon-placeholder,.video-js.video-js:lang(en-GB) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js.video-js:lang(en-IE) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js.video-js:lang(en-AU) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js.video-js:lang(en-NZ) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js .vjs-subtitles-button .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-subtitles:before,.video-js .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js.video-js:lang(en-GB) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js.video-js:lang(en-IE) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js.video-js:lang(en-AU) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js.video-js:lang(en-NZ) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js .vjs-subtitles-button .vjs-icon-placeholder:before{content:""}.vjs-icon-captions,.video-js:lang(en) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js:lang(fr-CA) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js .vjs-captions-button .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-captions:before,.video-js:lang(en) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js:lang(fr-CA) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js .vjs-captions-button .vjs-icon-placeholder:before{content:""}.vjs-icon-hd{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-hd:before{content:""}.vjs-icon-chapters,.video-js .vjs-chapters-button .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-chapters:before,.video-js .vjs-chapters-button .vjs-icon-placeholder:before{content:""}.vjs-icon-downloading{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-downloading:before{content:""}.vjs-icon-file-download{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-file-download:before{content:""}.vjs-icon-file-download-done{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-file-download-done:before{content:""}.vjs-icon-file-download-off{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-file-download-off:before{content:""}.vjs-icon-share{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-share:before{content:""}.vjs-icon-cog{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-cog:before{content:""}.vjs-icon-square{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-square:before{content:""}.vjs-icon-circle,.vjs-seek-to-live-control .vjs-icon-placeholder,.video-js .vjs-volume-level,.video-js .vjs-play-progress{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-circle:before,.vjs-seek-to-live-control .vjs-icon-placeholder:before,.video-js .vjs-volume-level:before,.video-js .vjs-play-progress:before{content:""}.vjs-icon-circle-outline{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-circle-outline:before{content:""}.vjs-icon-circle-inner-circle{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-circle-inner-circle:before{content:""}.vjs-icon-cancel,.video-js .vjs-control.vjs-close-button .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-cancel:before,.video-js .vjs-control.vjs-close-button .vjs-icon-placeholder:before{content:""}.vjs-icon-repeat{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-repeat:before{content:""}.vjs-icon-replay,.video-js .vjs-play-control.vjs-ended .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-replay:before,.video-js .vjs-play-control.vjs-ended .vjs-icon-placeholder:before{content:""}.vjs-icon-replay-5,.video-js .vjs-skip-backward-5 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-replay-5:before,.video-js .vjs-skip-backward-5 .vjs-icon-placeholder:before{content:""}.vjs-icon-replay-10,.video-js .vjs-skip-backward-10 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-replay-10:before,.video-js .vjs-skip-backward-10 .vjs-icon-placeholder:before{content:""}.vjs-icon-replay-30,.video-js .vjs-skip-backward-30 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-replay-30:before,.video-js .vjs-skip-backward-30 .vjs-icon-placeholder:before{content:""}.vjs-icon-forward-5,.video-js .vjs-skip-forward-5 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-forward-5:before,.video-js .vjs-skip-forward-5 .vjs-icon-placeholder:before{content:""}.vjs-icon-forward-10,.video-js .vjs-skip-forward-10 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-forward-10:before,.video-js .vjs-skip-forward-10 .vjs-icon-placeholder:before{content:""}.vjs-icon-forward-30,.video-js .vjs-skip-forward-30 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-forward-30:before,.video-js .vjs-skip-forward-30 .vjs-icon-placeholder:before{content:""}.vjs-icon-audio,.video-js .vjs-audio-button .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-audio:before,.video-js .vjs-audio-button .vjs-icon-placeholder:before{content:""}.vjs-icon-next-item{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-next-item:before{content:""}.vjs-icon-previous-item{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-previous-item:before{content:""}.vjs-icon-shuffle{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-shuffle:before{content:""}.vjs-icon-cast{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-cast:before{content:""}.vjs-icon-picture-in-picture-enter,.video-js .vjs-picture-in-picture-control .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-picture-in-picture-enter:before,.video-js .vjs-picture-in-picture-control .vjs-icon-placeholder:before{content:""}.vjs-icon-picture-in-picture-exit,.video-js.vjs-picture-in-picture .vjs-picture-in-picture-control .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-picture-in-picture-exit:before,.video-js.vjs-picture-in-picture .vjs-picture-in-picture-control .vjs-icon-placeholder:before{content:""}.vjs-icon-facebook{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-facebook:before{content:""}.vjs-icon-linkedin{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-linkedin:before{content:""}.vjs-icon-twitter{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-twitter:before{content:""}.vjs-icon-tumblr{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-tumblr:before{content:""}.vjs-icon-pinterest{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-pinterest:before{content:""}.vjs-icon-audio-description,.video-js .vjs-descriptions-button .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-audio-description:before,.video-js .vjs-descriptions-button .vjs-icon-placeholder:before{content:""}.video-js{display:inline-block;vertical-align:top;box-sizing:border-box;color:#fff;background-color:#000;position:relative;padding:0;font-size:10px;line-height:1;font-weight:400;font-style:normal;font-family:Arial,Helvetica,sans-serif;word-break:initial}.video-js:-moz-full-screen{position:absolute}.video-js:-webkit-full-screen{width:100%!important;height:100%!important}.video-js[tabindex="-1"]{outline:none}.video-js *,.video-js *:before,.video-js *:after{box-sizing:inherit}.video-js ul{font-family:inherit;font-size:inherit;line-height:inherit;list-style-position:outside;margin:0}.video-js.vjs-fluid,.video-js.vjs-16-9,.video-js.vjs-4-3,.video-js.vjs-9-16,.video-js.vjs-1-1{width:100%;max-width:100%}.video-js.vjs-fluid:not(.vjs-audio-only-mode),.video-js.vjs-16-9:not(.vjs-audio-only-mode),.video-js.vjs-4-3:not(.vjs-audio-only-mode),.video-js.vjs-9-16:not(.vjs-audio-only-mode),.video-js.vjs-1-1:not(.vjs-audio-only-mode){height:0}.video-js.vjs-16-9:not(.vjs-audio-only-mode){padding-top:56.25%}.video-js.vjs-4-3:not(.vjs-audio-only-mode){padding-top:75%}.video-js.vjs-9-16:not(.vjs-audio-only-mode){padding-top:177.7777777778%}.video-js.vjs-1-1:not(.vjs-audio-only-mode){padding-top:100%}.video-js.vjs-fill:not(.vjs-audio-only-mode){width:100%;height:100%}.video-js .vjs-tech{position:absolute;top:0;left:0;width:100%;height:100%}.video-js.vjs-audio-only-mode .vjs-tech{display:none}body.vjs-full-window,body.vjs-pip-window{padding:0;margin:0;height:100%}.vjs-full-window .video-js.vjs-fullscreen,body.vjs-pip-window .video-js{position:fixed;overflow:hidden;z-index:1000;left:0;top:0;bottom:0;right:0}.video-js.vjs-fullscreen:not(.vjs-ios-native-fs),body.vjs-pip-window .video-js{width:100%!important;height:100%!important;padding-top:0!important;display:block}.video-js.vjs-fullscreen.vjs-user-inactive{cursor:none}.vjs-pip-container .vjs-pip-text{position:absolute;bottom:10%;font-size:2em;background-color:#000000b3;padding:.5em;text-align:center;width:100%}.vjs-layout-tiny.vjs-pip-container .vjs-pip-text,.vjs-layout-x-small.vjs-pip-container .vjs-pip-text,.vjs-layout-small.vjs-pip-container .vjs-pip-text{bottom:0;font-size:1.4em}.vjs-hidden{display:none!important}.vjs-disabled{opacity:.5;cursor:default}.video-js .vjs-offscreen{height:1px;left:-9999px;position:absolute;top:0;width:1px}.vjs-lock-showing{display:block!important;opacity:1!important;visibility:visible!important}.vjs-no-js{padding:20px;color:#fff;background-color:#000;font-size:18px;font-family:Arial,Helvetica,sans-serif;text-align:center;width:300px;height:150px;margin:0 auto}.vjs-no-js a,.vjs-no-js a:visited{color:#66a8cc}.video-js .vjs-big-play-button{font-size:3em;line-height:1.5em;height:1.63332em;width:3em;display:block;position:absolute;top:50%;left:50%;padding:0;margin-top:-.81666em;margin-left:-1.5em;cursor:pointer;opacity:1;border:.06666em solid #fff;background-color:#2b333f;background-color:#2b333fb3;border-radius:.3em;transition:all .4s}.vjs-big-play-button .vjs-svg-icon{width:1em;height:1em;position:absolute;top:50%;left:50%;line-height:1;transform:translate(-50%,-50%)}.video-js:hover .vjs-big-play-button,.video-js .vjs-big-play-button:focus{border-color:#fff;background-color:#73859f;background-color:#73859f80;transition:all 0s}.vjs-controls-disabled .vjs-big-play-button,.vjs-has-started .vjs-big-play-button,.vjs-using-native-controls .vjs-big-play-button,.vjs-error .vjs-big-play-button{display:none}.vjs-has-started.vjs-paused.vjs-show-big-play-button-on-pause:not(.vjs-seeking,.vjs-scrubbing,.vjs-error) .vjs-big-play-button{display:block}.video-js button{background:none;border:none;color:inherit;display:inline-block;font-size:inherit;line-height:inherit;text-transform:none;text-decoration:none;transition:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.video-js.vjs-spatial-navigation-enabled .vjs-button:focus{outline:.0625em solid white;box-shadow:none}.vjs-control .vjs-button{width:100%;height:100%}.video-js .vjs-control.vjs-close-button{cursor:pointer;height:3em;position:absolute;right:0;top:.5em;z-index:2}.video-js .vjs-modal-dialog{background:rgba(0,0,0,.8);background:linear-gradient(180deg,rgba(0,0,0,.8),rgba(255,255,255,0));overflow:auto}.video-js .vjs-modal-dialog>*{box-sizing:border-box}.vjs-modal-dialog .vjs-modal-dialog-content{font-size:1.2em;line-height:1.5;padding:20px 24px;z-index:1}.vjs-menu-button{cursor:pointer}.vjs-menu-button.vjs-disabled{cursor:default}.vjs-workinghover .vjs-menu-button.vjs-disabled:hover .vjs-menu{display:none}.vjs-menu .vjs-menu-content{display:block;padding:0;margin:0;font-family:Arial,Helvetica,sans-serif;overflow:auto}.vjs-menu .vjs-menu-content>*{box-sizing:border-box}.vjs-scrubbing .vjs-control.vjs-menu-button:hover .vjs-menu{display:none}.vjs-menu li{display:flex;justify-content:center;list-style:none;margin:0;padding:.2em 0;line-height:1.4em;font-size:1.2em;text-align:center;text-transform:lowercase}.vjs-menu li.vjs-menu-item:focus,.vjs-menu li.vjs-menu-item:hover,.js-focus-visible .vjs-menu li.vjs-menu-item:hover{background-color:#73859f;background-color:#73859f80}.vjs-menu li.vjs-selected,.vjs-menu li.vjs-selected:focus,.vjs-menu li.vjs-selected:hover,.js-focus-visible .vjs-menu li.vjs-selected:hover{background-color:#fff;color:#2b333f}.vjs-menu li.vjs-selected .vjs-svg-icon,.vjs-menu li.vjs-selected:focus .vjs-svg-icon,.vjs-menu li.vjs-selected:hover .vjs-svg-icon,.js-focus-visible .vjs-menu li.vjs-selected:hover .vjs-svg-icon{fill:#000}.video-js .vjs-menu *:not(.vjs-selected):focus:not(:focus-visible),.js-focus-visible .vjs-menu *:not(.vjs-selected):focus:not(.focus-visible){background:none}.vjs-menu li.vjs-menu-title{text-align:center;text-transform:uppercase;font-size:1em;line-height:2em;padding:0;margin:0 0 .3em;font-weight:700;cursor:default}.vjs-menu-button-popup .vjs-menu{display:none;position:absolute;bottom:0;width:10em;left:-3em;height:0em;margin-bottom:1.5em;border-top-color:#2b333fb3}.vjs-pip-window .vjs-menu-button-popup .vjs-menu{left:unset;right:1em}.vjs-menu-button-popup .vjs-menu .vjs-menu-content{background-color:#2b333f;background-color:#2b333fb3;position:absolute;width:100%;bottom:1.5em;max-height:15em}.vjs-layout-tiny .vjs-menu-button-popup .vjs-menu .vjs-menu-content,.vjs-layout-x-small .vjs-menu-button-popup .vjs-menu .vjs-menu-content{max-height:5em}.vjs-layout-small .vjs-menu-button-popup .vjs-menu .vjs-menu-content{max-height:10em}.vjs-layout-medium .vjs-menu-button-popup .vjs-menu .vjs-menu-content{max-height:14em}.vjs-layout-large .vjs-menu-button-popup .vjs-menu .vjs-menu-content,.vjs-layout-x-large .vjs-menu-button-popup .vjs-menu .vjs-menu-content,.vjs-layout-huge .vjs-menu-button-popup .vjs-menu .vjs-menu-content{max-height:25em}.vjs-workinghover .vjs-menu-button-popup.vjs-hover .vjs-menu,.vjs-menu-button-popup .vjs-menu.vjs-lock-showing{display:block}.video-js .vjs-menu-button-inline{transition:all .4s;overflow:hidden}.video-js .vjs-menu-button-inline:before{width:2.222222222em}.video-js .vjs-menu-button-inline:hover,.video-js .vjs-menu-button-inline:focus,.video-js .vjs-menu-button-inline.vjs-slider-active{width:12em}.vjs-menu-button-inline .vjs-menu{opacity:0;height:100%;width:auto;position:absolute;left:4em;top:0;padding:0;margin:0;transition:all .4s}.vjs-menu-button-inline:hover .vjs-menu,.vjs-menu-button-inline:focus .vjs-menu,.vjs-menu-button-inline.vjs-slider-active .vjs-menu{display:block;opacity:1}.vjs-menu-button-inline .vjs-menu-content{width:auto;height:100%;margin:0;overflow:hidden}.video-js .vjs-control-bar{display:none;width:100%;position:absolute;bottom:0;left:0;right:0;height:3em;background-color:#2b333f;background-color:#2b333fb3}.video-js.vjs-spatial-navigation-enabled .vjs-control-bar{gap:1px}.video-js:not(.vjs-controls-disabled,.vjs-using-native-controls,.vjs-error) .vjs-control-bar.vjs-lock-showing{display:flex!important}.vjs-has-started .vjs-control-bar,.vjs-audio-only-mode .vjs-control-bar{display:flex;visibility:visible;opacity:1;transition:visibility .1s,opacity .1s}.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{visibility:visible;opacity:0;pointer-events:none;transition:visibility 1s,opacity 1s}.vjs-controls-disabled .vjs-control-bar,.vjs-using-native-controls .vjs-control-bar,.vjs-error .vjs-control-bar{display:none!important}.vjs-audio.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar,.vjs-audio-only-mode.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{opacity:1;visibility:visible;pointer-events:auto}.video-js .vjs-control{position:relative;text-align:center;margin:0;padding:0;height:100%;width:4em;flex:none}.video-js .vjs-control.vjs-visible-text{width:auto;padding-left:1em;padding-right:1em}.vjs-button>.vjs-icon-placeholder:before{font-size:1.8em;line-height:1.67}.vjs-button>.vjs-icon-placeholder{display:block}.vjs-button>.vjs-svg-icon{display:inline-block}.video-js .vjs-control:focus:before,.video-js .vjs-control:hover:before,.video-js .vjs-control:focus{text-shadow:0em 0em 1em white}.video-js *:not(.vjs-visible-text)>.vjs-control-text{border:0;clip:rect(0 0 0 0);height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.video-js .vjs-custom-control-spacer{display:none}.video-js .vjs-progress-control{cursor:pointer;flex:auto;display:flex;align-items:center;min-width:4em;touch-action:none}.video-js .vjs-progress-control.disabled{cursor:default}.vjs-live .vjs-progress-control{display:none}.vjs-liveui .vjs-progress-control{display:flex;align-items:center}.video-js .vjs-progress-holder{flex:auto;transition:all .2s;height:.3em}.video-js .vjs-progress-control .vjs-progress-holder{margin:0 10px}.video-js .vjs-progress-control:hover .vjs-progress-holder,.video-js.vjs-scrubbing.vjs-touch-enabled .vjs-progress-control .vjs-progress-holder{font-size:1.6666666667em}.video-js .vjs-progress-control:hover .vjs-progress-holder.disabled{font-size:1em}.video-js .vjs-progress-holder .vjs-play-progress,.video-js .vjs-progress-holder .vjs-load-progress,.video-js .vjs-progress-holder .vjs-load-progress div{position:absolute;display:block;height:100%;margin:0;padding:0;width:0}.video-js .vjs-play-progress{background-color:#fff}.video-js .vjs-play-progress:before{font-size:.9em;position:absolute;right:-.5em;line-height:.35em;z-index:1}.vjs-svg-icons-enabled .vjs-play-progress:before{content:none!important}.vjs-play-progress .vjs-svg-icon{position:absolute;top:-.35em;right:-.4em;width:.9em;height:.9em;pointer-events:none;line-height:.15em;z-index:1}.video-js .vjs-load-progress{background:rgba(114.9141509434,132.7028301887,159.3858490566,.5)}.video-js .vjs-load-progress div{background:rgba(114.9141509434,132.7028301887,159.3858490566,.75)}.video-js .vjs-time-tooltip{background-color:#fff;background-color:#fffc;border-radius:.3em;color:#000;float:right;font-family:Arial,Helvetica,sans-serif;font-size:1em;padding:6px 8px 8px;pointer-events:none;position:absolute;top:-3.4em;visibility:hidden;z-index:1}.video-js .vjs-progress-holder:focus .vjs-time-tooltip{display:none}.video-js .vjs-progress-control:hover .vjs-time-tooltip,.video-js .vjs-progress-control:hover .vjs-progress-holder:focus .vjs-time-tooltip,.video-js.vjs-scrubbing.vjs-touch-enabled .vjs-progress-control .vjs-time-tooltip{display:block;font-size:.6em;visibility:visible}.video-js .vjs-progress-control.disabled:hover .vjs-time-tooltip{font-size:1em}.video-js .vjs-progress-control .vjs-mouse-display{display:none;position:absolute;width:1px;height:100%;background-color:#000;z-index:1}.video-js .vjs-progress-control:hover .vjs-mouse-display,.video-js.vjs-scrubbing.vjs-touch-enabled .vjs-progress-control .vjs-mouse-display{display:block}.video-js.vjs-user-inactive .vjs-progress-control .vjs-mouse-display,.video-js.vjs-touch-enabled:not(.vjs-scrubbing) .vjs-progress-control .vjs-mouse-display{visibility:hidden;opacity:0;transition:visibility 1s,opacity 1s}.vjs-mouse-display .vjs-time-tooltip{color:#fff;background-color:#000;background-color:#000c}.video-js .vjs-slider{position:relative;cursor:pointer;padding:0;margin:0 .45em;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:#73859f;background-color:#73859f80}.video-js .vjs-slider.disabled{cursor:default}.video-js .vjs-slider:focus{text-shadow:0em 0em 1em white;box-shadow:0 0 1em #fff}.video-js.vjs-spatial-navigation-enabled .vjs-slider:focus{outline:.0625em solid white}.video-js .vjs-mute-control{cursor:pointer;flex:none}.video-js .vjs-volume-control{cursor:pointer;margin-right:1em;display:flex}.video-js .vjs-volume-control.vjs-volume-horizontal{width:5em}.video-js .vjs-volume-panel .vjs-volume-control{visibility:visible;opacity:0;width:1px;height:1px;margin-left:-1px}.video-js .vjs-volume-panel{transition:width 1s}.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control,.video-js .vjs-volume-panel:active .vjs-volume-control,.video-js .vjs-volume-panel:focus .vjs-volume-control,.video-js .vjs-volume-panel .vjs-volume-control:active,.video-js .vjs-volume-panel.vjs-hover .vjs-mute-control~.vjs-volume-control,.video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active{visibility:visible;opacity:1;position:relative;transition:visibility .1s,opacity .1s,height .1s,width .1s,left 0s,top 0s}.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control.vjs-volume-horizontal,.video-js .vjs-volume-panel:active .vjs-volume-control.vjs-volume-horizontal,.video-js .vjs-volume-panel:focus .vjs-volume-control.vjs-volume-horizontal,.video-js .vjs-volume-panel .vjs-volume-control:active.vjs-volume-horizontal,.video-js .vjs-volume-panel.vjs-hover .vjs-mute-control~.vjs-volume-control.vjs-volume-horizontal,.video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active.vjs-volume-horizontal{width:5em;height:3em;margin-right:0}.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control.vjs-volume-vertical,.video-js .vjs-volume-panel:active .vjs-volume-control.vjs-volume-vertical,.video-js .vjs-volume-panel:focus .vjs-volume-control.vjs-volume-vertical,.video-js .vjs-volume-panel .vjs-volume-control:active.vjs-volume-vertical,.video-js .vjs-volume-panel.vjs-hover .vjs-mute-control~.vjs-volume-control.vjs-volume-vertical,.video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active.vjs-volume-vertical{left:-3.5em;transition:left 0s}.video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover,.video-js .vjs-volume-panel.vjs-volume-panel-horizontal:active,.video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active{width:10em;transition:width .1s}.video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-mute-toggle-only{width:4em}.video-js .vjs-volume-panel .vjs-volume-control.vjs-volume-vertical{height:8em;width:3em;left:-3000em;transition:visibility 1s,opacity 1s,height 1s 1s,width 1s 1s,left 1s 1s,top 1s 1s}.video-js .vjs-volume-panel .vjs-volume-control.vjs-volume-horizontal{transition:visibility 1s,opacity 1s,height 1s 1s,width 1s,left 1s 1s,top 1s 1s}.video-js .vjs-volume-panel{display:flex}.video-js .vjs-volume-bar{margin:1.35em .45em}.vjs-volume-bar.vjs-slider-horizontal{width:5em;height:.3em}.vjs-volume-bar.vjs-slider-vertical{width:.3em;height:5em;margin:1.35em auto}.video-js .vjs-volume-level{position:absolute;bottom:0;left:0;background-color:#fff}.video-js .vjs-volume-level:before{position:absolute;font-size:.9em;z-index:1}.vjs-slider-vertical .vjs-volume-level{width:.3em}.vjs-slider-vertical .vjs-volume-level:before{top:-.5em;left:-.3em;z-index:1}.vjs-svg-icons-enabled .vjs-volume-level:before{content:none}.vjs-volume-level .vjs-svg-icon{position:absolute;width:.9em;height:.9em;pointer-events:none;z-index:1}.vjs-slider-horizontal .vjs-volume-level{height:.3em}.vjs-slider-horizontal .vjs-volume-level:before{line-height:.35em;right:-.5em}.vjs-slider-horizontal .vjs-volume-level .vjs-svg-icon{right:-.3em;transform:translateY(-50%)}.vjs-slider-vertical .vjs-volume-level .vjs-svg-icon{top:-.55em;transform:translate(-50%)}.video-js .vjs-volume-panel.vjs-volume-panel-vertical{width:4em}.vjs-volume-bar.vjs-slider-vertical .vjs-volume-level{height:100%}.vjs-volume-bar.vjs-slider-horizontal .vjs-volume-level{width:100%}.video-js .vjs-volume-vertical{width:3em;height:8em;bottom:8em;background-color:#2b333f;background-color:#2b333fb3}.video-js .vjs-volume-horizontal .vjs-menu{left:-2em}.video-js .vjs-volume-tooltip{background-color:#fff;background-color:#fffc;border-radius:.3em;color:#000;float:right;font-family:Arial,Helvetica,sans-serif;font-size:1em;padding:6px 8px 8px;pointer-events:none;position:absolute;top:-3.4em;visibility:hidden;z-index:1}.video-js .vjs-volume-control:hover .vjs-volume-tooltip,.video-js .vjs-volume-control:hover .vjs-progress-holder:focus .vjs-volume-tooltip{display:block;font-size:1em;visibility:visible}.video-js .vjs-volume-vertical:hover .vjs-volume-tooltip,.video-js .vjs-volume-vertical:hover .vjs-progress-holder:focus .vjs-volume-tooltip{left:1em;top:-12px}.video-js .vjs-volume-control.disabled:hover .vjs-volume-tooltip{font-size:1em}.video-js .vjs-volume-control .vjs-mouse-display{display:none;position:absolute;width:100%;height:1px;background-color:#000;z-index:1}.video-js .vjs-volume-horizontal .vjs-mouse-display{width:1px;height:100%}.video-js .vjs-volume-control:hover .vjs-mouse-display{display:block}.video-js.vjs-user-inactive .vjs-volume-control .vjs-mouse-display{visibility:hidden;opacity:0;transition:visibility 1s,opacity 1s}.vjs-mouse-display .vjs-volume-tooltip{color:#fff;background-color:#000;background-color:#000c}.vjs-poster{display:inline-block;vertical-align:middle;cursor:pointer;margin:0;padding:0;position:absolute;top:0;right:0;bottom:0;left:0;height:100%}.vjs-has-started .vjs-poster,.vjs-using-native-controls .vjs-poster{display:none}.vjs-audio.vjs-has-started .vjs-poster,.vjs-has-started.vjs-audio-poster-mode .vjs-poster,.vjs-pip-container.vjs-has-started .vjs-poster{display:block}.vjs-poster img{width:100%;height:100%;object-fit:contain}.video-js .vjs-live-control{display:flex;align-items:flex-start;flex:auto;font-size:1em;line-height:3em}.video-js:not(.vjs-live) .vjs-live-control,.video-js.vjs-liveui .vjs-live-control{display:none}.video-js .vjs-seek-to-live-control{align-items:center;cursor:pointer;flex:none;display:inline-flex;height:100%;padding-left:.5em;padding-right:.5em;font-size:1em;line-height:3em;width:auto;min-width:4em}.video-js.vjs-live:not(.vjs-liveui) .vjs-seek-to-live-control,.video-js:not(.vjs-live) .vjs-seek-to-live-control{display:none}.vjs-seek-to-live-control.vjs-control.vjs-at-live-edge{cursor:auto}.vjs-seek-to-live-control .vjs-icon-placeholder{margin-right:.5em;color:#888}.vjs-svg-icons-enabled .vjs-seek-to-live-control{line-height:0}.vjs-seek-to-live-control .vjs-svg-icon{width:1em;height:1em;pointer-events:none;fill:#888}.vjs-seek-to-live-control.vjs-control.vjs-at-live-edge .vjs-icon-placeholder{color:red}.vjs-seek-to-live-control.vjs-control.vjs-at-live-edge .vjs-svg-icon{fill:red}.video-js .vjs-time-control{flex:none;font-size:1em;line-height:3em;min-width:2em;width:auto;padding-left:1em;padding-right:1em}.vjs-live .vjs-time-control,.vjs-live .vjs-time-divider,.video-js .vjs-current-time,.video-js .vjs-duration{display:none}.vjs-time-divider{display:none;line-height:3em}.vjs-normalise-time-controls:not(.vjs-live) .vjs-time-control{display:flex}.video-js .vjs-play-control{cursor:pointer}.video-js .vjs-play-control .vjs-icon-placeholder{flex:none}.vjs-text-track-display{position:absolute;bottom:3em;left:0;right:0;top:0;pointer-events:none}.vjs-error .vjs-text-track-display{display:none}.video-js.vjs-controls-disabled .vjs-text-track-display,.video-js.vjs-user-inactive.vjs-playing .vjs-text-track-display{bottom:1em}.video-js .vjs-text-track{font-size:1.4em;text-align:center;margin-bottom:.1em}.vjs-subtitles{color:#fff}.vjs-captions{color:#fc6}.vjs-tt-cue{display:block}video::-webkit-media-text-track-display{transform:translateY(-3em)}.video-js.vjs-controls-disabled video::-webkit-media-text-track-display,.video-js.vjs-user-inactive.vjs-playing video::-webkit-media-text-track-display{transform:translateY(-1.5em)}.video-js.vjs-force-center-align-cues .vjs-text-track-cue{text-align:center!important;width:80%!important}@supports not (inset: 10px){.video-js .vjs-text-track-display>div{top:0;right:0;bottom:0;left:0}}.video-js .vjs-picture-in-picture-control{cursor:pointer;flex:none}.video-js.vjs-audio-only-mode .vjs-picture-in-picture-control,.vjs-pip-window .vjs-picture-in-picture-control{display:none}.video-js .vjs-fullscreen-control{cursor:pointer;flex:none}.video-js.vjs-audio-only-mode .vjs-fullscreen-control,.vjs-pip-window .vjs-fullscreen-control{display:none}.vjs-playback-rate>.vjs-menu-button,.vjs-playback-rate .vjs-playback-rate-value{position:absolute;top:0;left:0;width:100%;height:100%}.vjs-playback-rate .vjs-playback-rate-value{pointer-events:none;font-size:1.5em;line-height:2;text-align:center}.vjs-playback-rate .vjs-menu{width:4em;left:0}.vjs-error .vjs-error-display .vjs-modal-dialog-content{font-size:1.4em;text-align:center}.vjs-loading-spinner{display:none;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);opacity:.85;text-align:left;border:.6em solid rgba(43,51,63,.7);box-sizing:border-box;background-clip:padding-box;width:5em;height:5em;border-radius:50%;visibility:hidden}.vjs-seeking .vjs-loading-spinner,.vjs-waiting .vjs-loading-spinner{display:flex;justify-content:center;align-items:center;animation:vjs-spinner-show 0s linear .3s forwards}.vjs-error .vjs-loading-spinner{display:none}.vjs-loading-spinner:before,.vjs-loading-spinner:after{content:"";position:absolute;box-sizing:inherit;width:inherit;height:inherit;border-radius:inherit;opacity:1;border:inherit;border-color:transparent;border-top-color:#fff}.vjs-seeking .vjs-loading-spinner:before,.vjs-seeking .vjs-loading-spinner:after,.vjs-waiting .vjs-loading-spinner:before,.vjs-waiting .vjs-loading-spinner:after{animation:vjs-spinner-spin 1.1s cubic-bezier(.6,.2,0,.8) infinite,vjs-spinner-fade 1.1s linear infinite}.vjs-seeking .vjs-loading-spinner:before,.vjs-waiting .vjs-loading-spinner:before{border-top-color:#fff}.vjs-seeking .vjs-loading-spinner:after,.vjs-waiting .vjs-loading-spinner:after{border-top-color:#fff;animation-delay:.44s}@keyframes vjs-spinner-show{to{visibility:visible}}@keyframes vjs-spinner-spin{to{transform:rotate(360deg)}}@keyframes vjs-spinner-fade{0%{border-top-color:#73859f}20%{border-top-color:#73859f}35%{border-top-color:#fff}60%{border-top-color:#73859f}to{border-top-color:#73859f}}.video-js.vjs-audio-only-mode .vjs-captions-button{display:none}.vjs-chapters-button .vjs-menu ul{width:24em}.video-js.vjs-audio-only-mode .vjs-descriptions-button{display:none}.vjs-subs-caps-button+.vjs-menu .vjs-captions-menu-item .vjs-svg-icon{width:1.5em;height:1.5em}.video-js .vjs-subs-caps-button+.vjs-menu .vjs-captions-menu-item .vjs-menu-item-text .vjs-icon-placeholder{vertical-align:middle;display:inline-block;margin-bottom:-.1em}.video-js .vjs-subs-caps-button+.vjs-menu .vjs-captions-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before{font-family:VideoJS;content:"";font-size:1.5em;line-height:inherit}.video-js.vjs-audio-only-mode .vjs-subs-caps-button{display:none}.video-js .vjs-audio-button+.vjs-menu .vjs-descriptions-menu-item .vjs-menu-item-text .vjs-icon-placeholder,.video-js .vjs-audio-button+.vjs-menu .vjs-main-desc-menu-item .vjs-menu-item-text .vjs-icon-placeholder{vertical-align:middle;display:inline-block;margin-bottom:-.1em}.video-js .vjs-audio-button+.vjs-menu .vjs-descriptions-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before,.video-js .vjs-audio-button+.vjs-menu .vjs-main-desc-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before{font-family:VideoJS;content:" ";font-size:1.5em;line-height:inherit}.video-js.vjs-layout-small .vjs-current-time,.video-js.vjs-layout-small .vjs-time-divider,.video-js.vjs-layout-small .vjs-duration,.video-js.vjs-layout-small .vjs-remaining-time,.video-js.vjs-layout-small .vjs-playback-rate,.video-js.vjs-layout-small .vjs-volume-control,.video-js.vjs-layout-x-small .vjs-current-time,.video-js.vjs-layout-x-small .vjs-time-divider,.video-js.vjs-layout-x-small .vjs-duration,.video-js.vjs-layout-x-small .vjs-remaining-time,.video-js.vjs-layout-x-small .vjs-playback-rate,.video-js.vjs-layout-x-small .vjs-volume-control,.video-js.vjs-layout-tiny .vjs-current-time,.video-js.vjs-layout-tiny .vjs-time-divider,.video-js.vjs-layout-tiny .vjs-duration,.video-js.vjs-layout-tiny .vjs-remaining-time,.video-js.vjs-layout-tiny .vjs-playback-rate,.video-js.vjs-layout-tiny .vjs-volume-control{display:none}.video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal:hover,.video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal:active,.video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active,.video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover,.video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal:hover,.video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal:active,.video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active,.video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover,.video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal:hover,.video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal:active,.video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active,.video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover{width:auto;width:initial}.video-js.vjs-layout-x-small .vjs-progress-control,.video-js.vjs-layout-tiny .vjs-progress-control{display:none}.video-js.vjs-layout-x-small .vjs-custom-control-spacer{flex:auto;display:block}.vjs-modal-dialog.vjs-text-track-settings{background-color:#2b333f;background-color:#2b333fbf;color:#fff;height:70%}.vjs-spatial-navigation-enabled .vjs-modal-dialog.vjs-text-track-settings{height:80%}.vjs-error .vjs-text-track-settings{display:none}.vjs-text-track-settings .vjs-modal-dialog-content{display:table}.vjs-text-track-settings .vjs-track-settings-colors,.vjs-text-track-settings .vjs-track-settings-font,.vjs-text-track-settings .vjs-track-settings-controls{display:table-cell}.vjs-text-track-settings .vjs-track-settings-controls{text-align:right;vertical-align:bottom}@supports (display: grid){.vjs-text-track-settings .vjs-modal-dialog-content{display:grid;grid-template-columns:1fr 1fr;grid-template-rows:1fr;padding:20px 24px 0}.vjs-track-settings-controls .vjs-default-button{margin-bottom:20px}.vjs-text-track-settings .vjs-track-settings-controls{grid-column:1/-1}.vjs-layout-small .vjs-text-track-settings .vjs-modal-dialog-content,.vjs-layout-x-small .vjs-text-track-settings .vjs-modal-dialog-content,.vjs-layout-tiny .vjs-text-track-settings .vjs-modal-dialog-content{grid-template-columns:1fr}}.vjs-text-track-settings select{font-size:inherit}.vjs-track-setting>select{margin-right:1em;margin-bottom:.5em}.vjs-text-track-settings fieldset{margin:10px;border:none}.vjs-text-track-settings fieldset span{display:inline-block;padding:0 .6em .8em}.vjs-text-track-settings fieldset span>select{max-width:7.3em}.vjs-text-track-settings legend{color:#fff;font-weight:700;font-size:1.2em}.vjs-text-track-settings .vjs-label{margin:0 .5em .5em 0}.vjs-track-settings-controls button:focus,.vjs-track-settings-controls button:active{outline-style:solid;outline-width:medium;background-image:linear-gradient(0deg,#fff 88%,rgb(114.9141509434,132.7028301887,159.3858490566) 100%)}.vjs-track-settings-controls button:hover{color:#2b333fbf}.vjs-track-settings-controls button{background-color:#fff;background-image:linear-gradient(-180deg,#fff 88%,rgb(114.9141509434,132.7028301887,159.3858490566) 100%);color:#2b333f;cursor:pointer;border-radius:2px}.vjs-track-settings-controls .vjs-default-button{margin-right:1em}.vjs-title-bar{background:rgba(0,0,0,.9);background:linear-gradient(180deg,rgba(0,0,0,.9) 0%,rgba(0,0,0,.7) 60%,rgba(0,0,0,0) 100%);font-size:1.2em;line-height:1.5;transition:opacity .1s;padding:.666em 1.333em 4em;pointer-events:none;position:absolute;top:0;width:100%}.vjs-error .vjs-title-bar{display:none}.vjs-title-bar-title,.vjs-title-bar-description{margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vjs-title-bar-title{font-weight:700;margin-bottom:.333em}.vjs-playing.vjs-user-inactive .vjs-title-bar{opacity:0;transition:opacity 1s}.video-js .vjs-skip-forward-5,.video-js .vjs-skip-forward-10,.video-js .vjs-skip-forward-30,.video-js .vjs-skip-backward-5,.video-js .vjs-skip-backward-10,.video-js .vjs-skip-backward-30{cursor:pointer}.video-js .vjs-transient-button{position:absolute;height:3em;display:flex;align-items:center;justify-content:center;background-color:#32323280;cursor:pointer;opacity:1;transition:opacity 1s}.video-js:not(.vjs-has-started) .vjs-transient-button{display:none}.video-js.not-hover .vjs-transient-button:not(.force-display),.video-js.vjs-user-inactive .vjs-transient-button:not(.force-display){opacity:0}.video-js .vjs-transient-button span{padding:0 .5em}.video-js .vjs-transient-button.vjs-left{left:1em}.video-js .vjs-transient-button.vjs-right{right:1em}.video-js .vjs-transient-button.vjs-top{top:1em}.video-js .vjs-transient-button.vjs-near-top{top:4em}.video-js .vjs-transient-button.vjs-bottom{bottom:4em}.video-js .vjs-transient-button:hover{background-color:#323232e6}@media print{.video-js>*:not(.vjs-tech):not(.vjs-poster){visibility:hidden}}.vjs-resize-manager{position:absolute;top:0;left:0;width:100%;height:100%;border:none;z-index:-1000}.js-focus-visible .video-js *:focus:not(.focus-visible){outline:none}.video-js *:focus:not(:focus-visible){outline:none}.vjs-autoplay-countdown-overlay{position:absolute;top:0;left:0;width:100%;height:calc(100% - 46px);background:rgba(0,0,0,.85);display:none;flex-direction:column;justify-content:center;align-items:center;z-index:100000;padding:20px;box-sizing:border-box;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);opacity:0;transition:opacity .3s ease-in-out}.vjs-autoplay-countdown-overlay.autoplay-countdown-show{opacity:1}.autoplay-countdown-content{background:linear-gradient(135deg,rgba(0,0,0,.95),rgba(20,20,20,.9));border-radius:20px;padding:50px;max-width:480px;width:100%;text-align:center;box-shadow:0 20px 60px #0006,0 8px 32px #0003,inset 0 1px #ffffff1a;border:1px solid rgba(255,255,255,.15);-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);position:relative;overflow:hidden}.autoplay-countdown-content:before{content:"";position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(255,255,255,.3),transparent)}.autoplay-countdown-content:after{content:"";position:absolute;top:-50%;left:-50%;width:200%;height:200%;background:radial-gradient(circle,rgba(255,0,0,.05) 0%,transparent 70%);animation:backgroundPulse 4s ease-in-out infinite;pointer-events:none}@keyframes backgroundPulse{0%,to{opacity:.3;transform:scale(1)}50%{opacity:.6;transform:scale(1.1)}}.autoplay-countdown-header{position:relative;z-index:2}.autoplay-countdown-header h3{color:#fff;font-size:26px;font-weight:400;margin:0 0 10px;line-height:1.3;text-shadow:0 2px 4px rgba(0,0,0,.3)}.autoplay-countdown-header h3 span{font-weight:700}.autoplay-countdown-video-info{display:flex;flex-direction:column;align-items:center;gap:20px;text-align:center;position:relative;z-index:2;margin:0 0 50px}.next-video-thumbnail{flex-shrink:0;width:180px;height:101px;border-radius:12px;overflow:hidden;background:#333;position:relative;box-shadow:0 12px 32px #0006,0 4px 16px #0003;border:2px solid rgba(255,255,255,.1);transition:transform .3s ease,box-shadow .3s ease}.next-video-thumbnail:hover{transform:translateY(-4px) scale(1.02);box-shadow:0 16px 40px #00000080,0 8px 24px #0000004d}.next-video-thumbnail img{width:100%;height:100%;object-fit:cover;display:block}.play-overlay{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background:rgba(0,0,0,.8);border-radius:50%;width:64px;height:64px;display:flex;align-items:center;justify-content:center;color:#fff;transition:all .3s ease;box-shadow:0 8px 24px #00000080,0 4px 16px #0000004d;border:3px solid rgba(255,255,255,.2);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.play-overlay:hover{background:rgba(0,0,0,.9);transform:translate(-50%,-50%) scale(1.1);box-shadow:0 12px 32px #0009,0 6px 20px #0006}.play-overlay svg{margin-left:4px;width:28px;height:28px}.next-video-details{flex-grow:1;min-width:0;text-align:center}.next-video-title{color:#999;font-size:18px;font-weight:500;margin:0;line-height:1.4;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;text-shadow:0 2px 4px rgba(0,0,0,.3);letter-spacing:.5px}.next-video-author{color:#bbb;font-size:16px;margin:0 0 8px;line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}.next-video-duration{color:#999;font-size:14px;margin:0;line-height:1.2;font-weight:500}.autoplay-countdown-actions{display:flex;gap:24px;justify-content:center;align-items:center;position:relative;z-index:2;padding:0;margin-top:8px}button.autoplay-play-button,button.autoplay-cancel-button{display:flex;align-items:center;justify-content:center;gap:8px;padding:10px 20px;border:none;border-radius:8px;font-size:13px;font-weight:600;cursor:pointer;transition:all .3s cubic-bezier(.4,0,.2,1);min-width:140px;height:48px;position:relative;overflow:hidden;text-transform:uppercase;letter-spacing:.3px;line-height:1;white-space:nowrap;box-shadow:0 6px 20px #0000004d,inset 0 1px #ffffff1a;text-align:center}button.autoplay-play-button{background:linear-gradient(135deg,#ff0000,#e60000);color:#fff;border:1px solid rgba(255,255,255,.1)}.autoplay-play-button:before{content:"";position:absolute;top:0;left:-100%;width:100%;height:100%;background:linear-gradient(90deg,transparent,rgba(255,255,255,.2),transparent);transition:left .5s ease}.autoplay-play-button:hover{background:linear-gradient(135deg,#ff1a1a,#cc0000);transform:translateY(-2px);box-shadow:0 8px 25px #f006,inset 0 1px #ffffff4d}.autoplay-play-button:hover:before{left:100%}.autoplay-play-button:active{transform:translateY(-1px);box-shadow:0 4px 15px #ff00004d,inset 0 1px #fff3}.autoplay-cancel-button{background:linear-gradient(135deg,#404040,#2a2a2a);color:#fff;border:1px solid rgba(255,255,255,.1);box-shadow:0 6px 20px #0000004d,inset 0 1px #ffffff1a}.autoplay-cancel-button:hover{background:linear-gradient(135deg,#505050,#3a3a3a);transform:translateY(-2px);box-shadow:0 8px 25px #0006,inset 0 1px #fff3}.autoplay-cancel-button:active{transform:translateY(-1px);box-shadow:0 4px 15px #0000004d,inset 0 1px #ffffff1a}.autoplay-play-button svg,.autoplay-cancel-button svg{width:18px;height:18px;flex-shrink:0;filter:drop-shadow(0 1px 2px rgba(0,0,0,.3));transition:transform .3s ease;position:relative;z-index:1;display:block;margin:0;padding:0;vertical-align:middle}.autoplay-play-button:hover svg{transform:scale(1.05);filter:drop-shadow(0 2px 4px rgba(0,0,0,.4))}.autoplay-cancel-button svg{width:16px;height:16px}.autoplay-cancel-button:hover svg{transform:scale(1.05) rotate(90deg);filter:drop-shadow(0 2px 4px rgba(0,0,0,.4))}.autoplay-play-button span,.autoplay-cancel-button span{display:inline-block;vertical-align:middle;line-height:1;font-size:inherit;font-weight:inherit;letter-spacing:inherit;text-transform:inherit;position:relative;z-index:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;margin:0;padding:0;height:auto;align-self:center}.autoplay-play-button>*,.autoplay-cancel-button>*{vertical-align:middle;display:inline-block}.autoplay-play-button,.autoplay-cancel-button{align-items:center;justify-content:center}.autoplay-play-button svg,.autoplay-cancel-button svg{vertical-align:middle;display:inline-block}.vjs-autoplay-toggle .vjs-autoplay-icon svg{width:100%;height:100%;display:block}@media (max-width: 767px){.autoplay-countdown-video-info{margin-bottom:20px}.autoplay-countdown-content{padding:24px;max-width:400px}.autoplay-countdown-header h3{font-size:20px}.next-video-thumbnail{width:140px;height:78px}.play-overlay{width:48px;height:48px}.play-overlay svg{width:20px;height:20px}.next-video-title{font-size:18px}.next-video-author{font-size:14px}.autoplay-play-button,.autoplay-cancel-button{padding:12px 24px;font-size:14px;min-width:120px;height:44px;gap:6px;align-items:center;justify-content:center}.autoplay-play-button svg{width:16px;height:16px;vertical-align:middle}.autoplay-cancel-button svg{width:14px;height:14px;vertical-align:middle}}@media (max-width: 480px){.autoplay-countdown-content{padding:20px;max-width:350px}.autoplay-countdown-header h3{font-size:18px}.countdown-timer{font-size:24px;padding:10px 16px}.autoplay-countdown-video-info{gap:16px}.next-video-thumbnail{width:120px;height:68px}.play-overlay{width:40px;height:40px}.play-overlay svg{width:16px;height:16px}.next-video-title{font-size:16px}.next-video-author{font-size:13px}.autoplay-countdown-actions{gap:5px;padding:0}button.autoplay-play-button,button.autoplay-cancel-button{padding:10px 20px;width:120px;height:40px;min-width:120px}.autoplay-play-button,.autoplay-cancel-button{width:100%;min-width:100%;height:46px;gap:6px;padding:10px 20px;font-size:13px;align-items:center;justify-content:center}.autoplay-play-button svg{width:14px;height:14px;vertical-align:middle}.autoplay-cancel-button svg{width:12px;height:12px;vertical-align:middle}}.vjs-settings-button{width:3em;height:3em;display:flex;align-items:center;justify-content:center;padding:0;margin:0}.vjs-icon-cog1{font-size:30px!important;position:relative;top:-8px!important;display:flex;align-items:center;justify-content:center;width:100%;height:100%;line-height:1}.custom-settings-overlay{border:0;position:absolute;bottom:60px;right:20px;width:280px;height:350px;background:rgba(28,28,28,.95);color:#fff;border-radius:7px;box-shadow:0 4px 12px #00000080;display:none;z-index:1000;font-size:14px;overflow:auto}.settings-header{padding:12px 16px;border-bottom:1px solid rgba(255,255,255,.1);font-weight:700}.settings-item{padding:12px 16px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid rgba(255,255,255,.1);transition:background .2s ease;gap:10px}.settings-item .settings-left span{display:flex}.custom-settings-overlay .settings-left span.vjs-icon-placeholder{transform:inherit!important}.settings-item:last-child{border-bottom:none}.settings-item:hover{background:rgba(255,255,255,.05)}.speed-submenu,.quality-submenu,.subtitles-submenu{position:absolute;top:0;left:0;right:0;bottom:0;background:rgba(28,28,28,.95);display:none;flex-direction:column;overflow:auto;-webkit-overflow-scrolling:touch;touch-action:pan-y;overscroll-behavior:contain}.subtitle-option{padding:12px 16px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;transition:background .2s ease}.subtitle-option:hover{background:rgba(255,255,255,.05)}.subtitle-option.active{background:rgba(255,255,255,.1)}.submenu-header{padding:12px 16px;border-bottom:1px solid rgba(255,255,255,.1);display:flex;align-items:center;cursor:pointer;position:sticky;top:0;background:rgba(28,28,28,.95);z-index:1}.submenu-header:hover{background:rgba(28,28,28,1)}.speed-option{padding:12px 16px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;transition:background .2s ease}.speed-option:hover{background:rgba(255,255,255,.05)}.speed-option.active{background:rgba(255,255,255,.1)}.quality-option{padding:12px 16px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;transition:background .2s ease}.quality-option:hover{background:rgba(255,255,255,.05)}.quality-option.active{background:rgba(255,255,255,.1)}.settings-left{display:inline-flex;align-items:center;gap:8px}.settings-right{display:inline-flex;align-items:center;text-align:right}sup.hd-badge{font-size:10px;line-height:1;margin-left:6px;background:#e53935;color:#fff;padding:1px 4px;border-radius:3px} +html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}.playlist-items a{text-decoration:none!important}.video-js video{outline:none!important}.video-js .vjs-poster{border-radius:12px!important}.video-js video{border-radius:12px!important}#page-embed .video-js-root-embed .video-js video{width:100vw!important;height:100vh!important;object-fit:cover!important;border-radius:0!important}#page-embed .video-js-root-embed .video-js .vjs-poster{border-radius:0!important;width:100vw!important;height:100vh!important;object-fit:cover!important}.video-js div.vjs-control-bar{background:transparent!important;background-color:transparent!important;background-image:none!important;display:flex!important;flex-direction:row!important;align-items:center!important;justify-content:flex-start!important;padding:0 12px;height:48px}.video-js:after{content:"";position:absolute;bottom:0;left:0;right:0;height:120px;background:linear-gradient(to top,rgba(0,0,0,.8) 0%,rgba(0,0,0,.6) 25%,rgba(0,0,0,.4) 50%,rgba(0,0,0,.2) 75%,transparent 100%);pointer-events:none;opacity:0;transition:opacity .3s ease;z-index:2}.video-js.vjs-user-active:after,.video-js.vjs-paused:after,.video-js.vjs-ended:after{opacity:1}.video-js .vjs-control-bar{z-index:6!important}.video-js .vjs-progress-control.vjs-control{z-index:7!important}.video-js .vjs-control-bar .vjs-button .vjs-icon-placeholder:before{color:#fff!important;text-shadow:0 1px 2px rgba(0,0,0,.6)!important}.video-js .vjs-control-bar .vjs-time-control{color:#fff!important;text-shadow:0 1px 2px rgba(0,0,0,.6)!important;font-weight:500!important}.video-js .vjs-volume-control .vjs-volume-bar{background:rgba(255,255,255,.3)!important}.video-js .vjs-volume-control .vjs-volume-level{background:#ffffff!important}.video-container{width:100%;max-width:1200px;margin:0 auto;padding:0 20px;box-sizing:border-box}#page-embed .video-js-root-embed .video-container{width:100vw;height:100vh;max-width:none;margin:0;padding:0;box-sizing:border-box;position:fixed;top:0;left:0;z-index:1000}.video-js.vjs-fluid{width:100%!important;max-width:100%!important}#page-embed .video-js-root-embed .video-js.vjs-fluid{width:100vw!important;height:100vh!important;max-width:none!important;max-height:none!important}.vjs-next-video-control .vjs-icon-placeholder{width:1.2em;height:1.2em;display:flex;align-items:center;justify-content:center;margin:auto;display:none!important}.vjs-next-video-control .vjs-icon-placeholder svg{width:100%;height:100%;display:block}.vjs-end-screen-overlay{position:absolute;top:0;left:0;width:100%;background:rgba(0,0,0,.5);display:none;flex-direction:column;justify-content:center;align-items:center;height:calc(100% - 46px);box-sizing:border-box;padding:20px;gap:10px;z-index:4}.vjs-related-videos-title{color:#fff;font-size:24px;line-height:24px;padding:0;margin:0;text-align:center;font-weight:700;flex-shrink:0}.vjs-related-videos-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:3px;width:100%;max-width:100%;margin:0;box-sizing:border-box;justify-items:center;overflow:hidden;align-self:center;flex-shrink:0;height:calc(100% - 44px)}.vjs-related-video-item{position:relative;cursor:pointer;border-radius:5px;overflow:hidden;transition:transform .2s ease,box-shadow .2s ease;background:#1a1a1a;border:1px solid #333;width:100%;max-width:100%;box-shadow:0 2px 8px #0000001a}.vjs-related-video-item:hover{transform:translateY(-2px);box-shadow:0 8px 25px #0000004d}.vjs-related-video-thumbnail{width:100%;height:100%;object-fit:cover;display:block;background:#1a1a1a;transition:transform .2s ease}.vjs-related-video-item:hover .vjs-related-video-thumbnail{transform:scale(1.02)}.vjs-related-video-overlay{position:absolute;top:0;left:0;right:0;bottom:0;background:linear-gradient(transparent,rgba(0,0,0,.9));color:#fff;padding:12px;opacity:0;transition:opacity .3s ease;display:flex;flex-direction:column;justify-content:flex-start;height:100%}.vjs-related-video-item:hover .vjs-related-video-overlay{opacity:1}.vjs-related-video-title{font-size:14px;font-weight:700;line-height:1.3;color:#fff;margin-bottom:4px}.vjs-related-video-meta{display:flex;flex-direction:row;gap:8px;align-items:center}.vjs-related-video-author{font-size:12px;color:#ccc}.vjs-related-video-views{font-size:12px;color:#aaa}.vjs-related-video-author:after{content:"•";margin-left:8px;color:#666}.vjs-related-video-duration{position:absolute;bottom:8px;right:8px;background:rgba(0,0,0,.8);color:#fff;padding:2px 6px;font-size:11px;font-weight:700;border-radius:2px;opacity:0;transition:opacity .3s ease}.vjs-related-video-item:hover .vjs-related-video-duration{opacity:1}.video-js.vjs-ended .vjs-control-bar{opacity:1!important;pointer-events:auto!important}.video-js.vjs-ended .vjs-control-bar .vjs-control,.video-js.vjs-ended .vjs-control-bar button{opacity:1!important;pointer-events:auto!important;cursor:pointer!important}.video-js.vjs-ended .vjs-control-bar .vjs-control.vjs-volume-control{opacity:0!important}.video-js.vjs-ended .vjs-control-bar .vjs-volume-panel.vjs-hover .vjs-volume-control{opacity:1!important}.video-js.vjs-ended .vjs-play-control{opacity:1!important;pointer-events:auto!important;cursor:pointer!important}.video-js.vjs-ended .vjs-progress-control,.video-js.vjs-ended .vjs-volume-panel{opacity:1!important;pointer-events:auto!important}.vjs-chapter-markers-track{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;overflow:hidden}.vjs-chapter-marker{position:absolute;top:0;width:2px;height:100%;background:rgba(255,255,255,.6);pointer-events:auto;cursor:pointer;transition:background .2s ease}.vjs-chapter-marker:hover{background:rgba(255,255,255,.9);width:3px}.vjs-chapter-marker-tooltip{position:absolute;bottom:8px;left:50%;transform:translate(-50%);background:rgba(0,0,0,.8);color:#fff;padding:4px 8px;border-radius:4px;font-size:11px;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .2s ease;z-index:1001}.vjs-chapter-marker:hover .vjs-chapter-marker-tooltip{opacity:1}.vjs-chapter-floating-tooltip{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif!important;line-height:1.4!important;animation:fadeIn .2s ease-in-out}@keyframes fadeIn{0%{opacity:0;transform:translate(-50%) translateY(5px)}to{opacity:1;transform:translate(-50%) translateY(0)}}.video-js .vjs-menu-button:not(.vjs-disabled) .vjs-menu{display:none!important}.video-js .vjs-menu-button:not(.vjs-disabled).vjs-lock-showing .vjs-menu,.video-js .vjs-menu-button:not(.vjs-disabled) .vjs-menu.vjs-lock-showing{display:block!important}.video-js .vjs-menu-button:hover .vjs-menu{display:none!important}.video-js .vjs-menu-button.vjs-lock-showing:hover .vjs-menu{display:block!important}.video-js .vjs-menu.vjs-lock-showing{display:block!important;opacity:1!important;visibility:visible!important}.video-js.chapters-open .vjs-menu,.video-js.chapters-open .vjs-menu.vjs-lock-showing,.video-js.chapters-open .vjs-hover-display,.video-js.chapters-open .vjs-time-tooltip,.video-js.chapters-open .vjs-progress-holder .vjs-mouse-display{display:none!important;opacity:0!important;visibility:hidden!important}.video-js .vjs-volume-panel.vjs-hover{transition:ease-in-out .5s!important;width:auto!important}.video-js .vjs-captions-button,.video-js .vjs-subs-caps-button{display:none!important}.video-js .vjs-subtitles-button .vjs-menu,.video-js .vjs-subtitles-button .vjs-menu.vjs-lock-showing{display:none!important;visibility:hidden!important;opacity:0!important;pointer-events:none!important}.video-js .vjs-text-track-display{position:absolute!important;bottom:6em!important;left:0!important;right:0!important;top:0!important;pointer-events:none!important;z-index:10!important}.video-js .vjs-text-track-cue{position:absolute!important;bottom:0!important;left:0!important;right:0!important;text-align:center!important;padding:0!important;background:transparent!important;border:none!important;font-size:1.2em!important;line-height:1.4!important;color:#fff!important;text-shadow:2px 2px 4px rgba(0,0,0,.8)!important;font-family:Arial,sans-serif!important;font-weight:600!important;white-space:pre-line!important;word-wrap:break-word!important;max-width:90%!important;margin:0 auto!important;z-index:11!important}.video-js .vjs-text-track-cue>div{background:rgba(0,0,0,.7)!important;padding:8px 12px!important;border-radius:4px!important;display:inline-block!important;margin:2px 0!important;max-width:100%!important;box-sizing:border-box!important}.video-js.vjs-fullscreen .vjs-text-track-display{bottom:8em!important}.video-js.vjs-fullscreen .vjs-text-track-cue{font-size:1.4em!important;max-width:85%!important}.video-js.vjs-fullscreen .vjs-text-track-cue>div{padding:10px 16px!important;font-size:1em!important}.video-js .vjs-subtitles-button .vjs-menu.vjs-lock-showing .vjs-menu-content{display:none!important;visibility:hidden!important;opacity:0!important;pointer-events:none!important}.video-js .vjs-chapters-button .vjs-menu,.video-js .vjs-chapters-button .vjs-menu.vjs-lock-showing,.video-js .vjs-chapters-button .vjs-menu.vjs-lock-showing .vjs-menu-content{display:none!important}.video-js .vjs-chapters-button .vjs-menu{display:none!important;visibility:hidden!important;opacity:0!important;pointer-events:none!important}.video-js .vjs-subtitles-button{position:relative;cursor:pointer!important;pointer-events:auto!important}.video-js button.vjs-subtitles-button{cursor:pointer!important;pointer-events:auto!important;touch-action:manipulation!important;-webkit-tap-highlight-color:transparent!important}.video-js button.vjs-subtitles-button:before{content:"";position:absolute;left:50%;transform:translate(-50%);bottom:6px;height:3px;background:#e1002d;border-radius:2px;width:0;padding:0;transition:none!important;animation:none!important;-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important}.video-js .vjs-subs-active button.vjs-subtitles-button:before{width:24px;transition:none!important;animation:none!important;-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important}.video-js button.vjs-subtitles-button{transition:none!important;animation:none!important;-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important}.video-js .vjs-autoplay-toggle .vjs-hover-display,.video-js .vjs-autoplay-toggle .vjs-tooltip,.video-js .vjs-autoplay-toggle .vjs-tooltip-text{display:none!important;visibility:hidden!important;opacity:0!important;pointer-events:none!important}.video-js .vjs-autoplay-toggle{position:relative}.video-js .vjs-autoplay-toggle:after{content:attr(title);position:absolute;bottom:100%;left:50%;transform:translate(-50%);background:rgba(0,0,0,.9);color:#fff;padding:6px 10px;border-radius:4px;font-size:12px;white-space:nowrap;pointer-events:none;opacity:0;visibility:hidden;transition:opacity .2s ease,visibility .2s ease;z-index:1000;margin-bottom:8px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;box-shadow:0 2px 8px #0000004d;border:1px solid rgba(255,255,255,.1)}.video-js .vjs-autoplay-toggle:hover:after,.video-js .vjs-autoplay-toggle:focus:after{opacity:1;visibility:visible}.video-js .vjs-settings-button{cursor:pointer!important;pointer-events:auto!important;position:relative!important;display:flex!important;align-items:center!important;justify-content:center!important;min-width:32px!important;height:32px!important;padding:0!important;margin:0 2px!important;border:none!important;background:transparent!important;color:inherit!important;font-size:inherit!important;line-height:inherit!important;text-align:center!important;vertical-align:middle!important;touch-action:manipulation!important;-webkit-tap-highlight-color:transparent!important;-webkit-touch-callout:none!important;-webkit-user-select:none!important;user-select:none!important}.video-js .vjs-settings-button:hover{background-color:#ffffff1a!important}.video-js .vjs-settings-button:focus{outline:none!important}.video-js .vjs-settings-button .vjs-icon-cog{font-size:18px!important;width:18px!important;height:18px!important;display:flex!important;align-items:center!important;justify-content:center!important}.vjs-play-progress{background-color:#019932!important}.vjs-load-progress,.vjs-progress-holder{background:rgba(255,255,255,.5)!important}.video-js .vjs-progress-control{position:absolute!important;bottom:46px!important;left:0!important;right:0!important;width:100%!important;height:0!important;z-index:3!important;padding:0!important;margin:0 auto!important}.video-js .vjs-control-bar .vjs-progress-control{display:none!important}.video-js .vjs-progress-control.vjs-control{display:block!important}.video-js .vjs-control-bar .vjs-icon-placeholder,.video-js .vjs-control-bar .vjs-button .vjs-icon-placeholder,.video-js .vjs-control-bar [class*=vjs-icon-]{font-size:1.5em!important}.vjs-control-bar .custom-remaining-time .vjs-remaining-time-display{font-size:14px!important;font-weight:500;line-height:1;display:flex;align-items:center;justify-content:center;height:100%;color:#fff}.vjs-mouse-display{z-index:4!important}.vjs-slider-horizontal{top:-5px}.video-js .vjs-spacer-control{flex:1!important;min-width:1px!important;height:100%!important}.video-js .vjs-control-bar .vjs-control{flex:none!important}.video-js .vjs-autoplay-toggle{margin-right:10px!important}.video-js .vjs-picture-in-picture-control{margin-left:6px!important}.vjs-seek-indicator{position:absolute!important;top:50%!important;left:50%!important;transform:translate(-50%,-50%)!important;z-index:9999!important;pointer-events:none!important;display:none!important;align-items:center!important;justify-content:center!important;opacity:0!important;visibility:hidden!important;transition:opacity .2s ease-in-out!important}.vjs-seek-indicator-content{background:transparent!important;flex-direction:column!important;align-items:center!important;justify-content:center!important}.vjs-seek-indicator-icon{position:relative!important;display:flex!important;align-items:center!important;justify-content:center!important;margin-bottom:4px!important}.seek-icon-container{display:flex!important;flex-direction:column!important;align-items:center!important;justify-content:center!important;animation:seekPulse .3s ease-out!important}.youtube-seek-container{display:flex!important;align-items:center!important;justify-content:center!important;animation:youtubeSeekPulse .3s ease-out!important}.youtube-seek-circle{width:80px!important;height:80px!important;border-radius:50%!important;-webkit-border-radius:50%!important;-moz-border-radius:50%!important;background:rgba(0,0,0,.8)!important;backdrop-filter:blur(10px)!important;-webkit-backdrop-filter:blur(10px)!important;display:flex!important;flex-direction:column!important;align-items:center!important;justify-content:center!important;padding:0!important;box-shadow:0 4px 20px #0000004d!important;border:1px solid rgba(255,255,255,.15)!important;box-sizing:border-box!important;overflow:hidden!important}.youtube-seek-icon{display:flex!important;align-items:center!important;justify-content:center!important;margin-bottom:4px!important}.youtube-seek-icon svg{filter:drop-shadow(0 1px 2px rgba(0,0,0,.5))!important}.youtube-seek-time{color:#fff!important;font-size:10px!important;font-weight:500!important;text-align:center!important;line-height:1.2!important;opacity:.9!important;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif!important}@keyframes youtubeSeekPulse{0%{transform:scale(.7);opacity:.5}50%{transform:scale(1.05);opacity:.9}to{transform:scale(1);opacity:1}}.seek-seconds{color:#fff!important;font-size:16px!important;font-weight:700!important;text-shadow:0 2px 4px rgba(0,0,0,.7)!important;line-height:1!important}.vjs-seek-indicator-text{color:#fff!important;font-size:16px!important;font-weight:500!important;text-align:center!important;text-shadow:0 1px 2px rgba(0,0,0,.8)!important}button{cursor:pointer}.video-js{padding:0;height:100%!important;border-radius:12px;outline:none}.video-js:focus{box-shadow:0 0 0 3px #19993280;border-radius:12px}.video-js[tabindex]{outline:none}#page-embed .video-js-root-embed .video-js{width:100vw!important;height:100vh!important;border-radius:0;position:relative}#page-embed .video-js-root-embed{position:fixed;top:0;left:0;width:100vw;height:100vh;z-index:9999;background:#000}.video-chapter{position:absolute;top:auto;bottom:60px;width:min(360px,calc(100% - 20px));border:1px solid rgba(255,255,255,.12);border-radius:12px;height:calc(100% - 80px);background:rgba(18,18,18,.96);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);overflow:hidden;box-shadow:0 12px 30px #00000073;right:10px}.chapter-head{padding:12px 8px 10px 16px;position:sticky;top:0;left:0;background:linear-gradient(180deg,rgba(28,28,28,.95),rgba(18,18,18,.95));border-bottom:1px solid rgba(255,255,255,.08);z-index:2}.playlist-title{display:flex;align-items:center;gap:10px}.chapter-title{width:auto;flex:1;min-width:0}.chapter-title h3{margin:0;padding:0}.chapter-title h3 a{color:#fff;font-size:18px;line-height:26px;font-weight:700;text-decoration:none;white-space:nowrap;text-overflow:ellipsis;height:28px;overflow:hidden;display:block}.chapter-title p{margin:4px 0 0;padding:0;color:#fff;font-size:12px;font-weight:400;line-height:15px}.chapter-title p a{color:#fff;font-size:12px;font-weight:400;line-height:15px;text-decoration:none}.chapter-close{width:40px;margin-left:auto;display:flex;align-items:center;justify-content:flex-end}.chapter-close button{background:transparent;color:#fff;border:0;width:40px;height:40px;padding:0;display:flex;align-items:center;justify-content:center;border-radius:8px}.chapter-close button:hover{background:rgba(255,255,255,.1)}.settings-header{display:flex;align-items:center;justify-content:space-between;position:relative}.settings-close-btn{background:transparent;color:#fff;border:0;width:32px;height:32px;padding:0;display:flex;align-items:center;justify-content:center;border-radius:6px;cursor:pointer}.settings-close-btn:hover{background:rgba(255,255,255,.1)}.playlist-action-menu{display:none;justify-content:space-between;gap:10px}.playlist-action-menu button{background:transparent;border:0;width:40px;height:40px;padding:0;display:flex;justify-content:center;align-items:center;border-radius:100px}.playlist-action-menu button:hover{background:rgba(0,0,0,.1)}.start-action{display:flex}.chapter-body{height:calc(100% - 80px);overflow:auto;-webkit-overflow-scrolling:touch;touch-action:pan-y;overscroll-behavior:contain;scroll-behavior:smooth}.chapter-body ul{margin:0;padding:0}.playlist-items a{padding:12px;display:flex;align-items:center;text-decoration:none;gap:12px;width:100%;box-sizing:border-box;color:#fff}.playlist-items a:hover{background:rgba(255,255,255,.06)}.playlist-items.selected a{background:rgba(255,255,255,.14)}.playlist-drag-handle{width:24px;display:flex;justify-content:center;color:#e0e0e0;font-size:12px}.thumbnail-meta{flex:1;min-width:0;padding:0}.thumbnail-meta h4{margin:0 2px 4px 0;font-size:14px;line-height:20px;font-weight:600;overflow:hidden;text-overflow:ellipsis;color:#fff;white-space:normal;max-height:40px;-webkit-line-clamp:2;line-clamp:2;display:-webkit-box;-webkit-box-orient:vertical}.thumbnail-meta .meta-sub{display:flex;gap:8px;align-items:center}.thumbnail-meta .meta-sub .meta-dynamic{color:#bdbdbd;font-size:12px;line-height:18px}.thumbnail-action button{border:0;background:transparent;color:#fff;opacity:0}.playlist-items a:hover .thumbnail-action button{opacity:1}.chapter-body::-webkit-scrollbar{width:10px}.chapter-body::-webkit-scrollbar-thumb{background:rgba(255,255,255,.18);border-radius:8px}.chapter-body::-webkit-scrollbar-track{background:transparent}@media (max-width: 767px){.chapter-body{-webkit-overflow-scrolling:touch;touch-action:pan-y;overscroll-behavior:contain}.chapter-body::-webkit-scrollbar{width:0px}}.video-js .vjs-control-bar .vjs-spacer-control{margin-left:auto}.video-js .vjs-control-bar .settings-item-svg{display:flex}.video-js .vjs-control-bar .settings-item-svg svg{width:auto!important;height:auto!important;transform:inherit!important}.video-js div.vjs-control{width:auto}.vjs-chapters-button button.vjs-button,.vjs-subtitles-button button.vjs-button,.video-js button.vjs-control{width:48px;height:48px;display:flex;align-items:center;justify-content:center}button.vjs-button>.vjs-icon-placeholder:before{line-height:48px;transition:ease-in-out .5s}.video-js .vjs-volume-panel div.vjs-volume-control{height:100%!important;display:flex;align-items:center;justify-content:center;margin:0;width:0;transition:ease-in-out .5s!important;opacity:0}.video-js .vjs-volume-panel div.vjs-volume-control .vjs-volume-bar{margin:0;top:0}.vjs-settings-button svg{transition:ease-in-out .3s}.vjs-settings-button.settings-clicked svg{transform:rotate(30deg)}.video-js span.vjs-control-text{position:absolute!important;bottom:125%;left:50%;transform:translate(-50%);background:rgba(0,0,0,.75);color:#fff;padding:6px 8px!important;border-radius:3px;font-size:13px;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .3s ease;z-index:1000;box-shadow:0 0 5px #0000004d;height:auto!important;width:auto!important;overflow:visible!important;clip:initial!important}.video-js button.vjs-button:hover span.vjs-control-text{opacity:1}.video-js .vjs-control:focus:before,.video-js .vjs-control:hover:before,.video-js .vjs-control:focus{text-shadow:none!important}.vjs-volume-panel{gap:5px}.video-js .vjs-play-progress.vjs-slider-bar+.vjs-time-tooltip{padding:0}.vjs-chapter-floating-tooltip{text-align:center;width:160px!important;max-width:100%!important;height:auto}.chapter-image-sprite{width:166px!important;max-width:100%!important;height:96px;margin:0 auto 10px;border-radius:6px;border:3px solid #fff}.vjs-chapter-floating-tooltip .chapter-title{font-size:16px;margin:0 0 10px;font-weight:700;word-break:break-all;line-height:20px}.vjs-chapter-floating-tooltip .position-info,.vjs-chapter-floating-tooltip .chapter-info{font-size:15px;display:inline-block;margin:0 0 2px;line-height:normal;vertical-align:top;line-height:20px}.vjs-sprite-preview-tooltip{text-align:center;width:172px!important;max-width:100%!important;height:auto}.vjs-sprite-preview-tooltip .sprite-image-preview{width:166px!important;max-width:100%!important;height:96px;margin:0 auto;border-radius:6px;border:3px solid #fff}@media (pointer: coarse){.video-js .vjs-volume-panel div.vjs-volume-control{width:auto;opacity:1}}@media (min-width: 1200px){.vjs-related-videos-grid{grid-template-columns:repeat(4,1fr)}}@media (max-width: 1199px){.vjs-related-video-item:nth-child(n+10){display:none}}@media (max-width: 1139px){.vjs-related-video-item:nth-child(n+7){display:none}}@media (min-width: 1024px) and (max-width: 1199px){.vjs-related-videos-grid{grid-template-columns:repeat(3,1fr)}}@media (min-width: 1025px){.video-js .vjs-text-track-display{bottom:6em!important}.video-js .vjs-autoplay-toggle{margin-right:12px!important}.video-js .vjs-picture-in-picture-control{margin-left:12px!important}.video-js .vjs-text-track-cue{font-size:1.2em!important;max-width:90%!important}.video-js .vjs-text-track-cue>div{padding:8px 12px!important;font-size:1em!important}.video-js.vjs-fullscreen .vjs-text-track-display{bottom:8em!important}}@media (min-width: 768px) and (max-width: 1024px){.video-js .vjs-text-track-display{bottom:7em!important}.video-js .vjs-text-track-cue{font-size:1.15em!important;max-width:88%!important}.video-js .vjs-text-track-cue>div{padding:7px 11px!important;font-size:.95em!important}.video-js.vjs-fullscreen .vjs-text-track-display{bottom:9em!important}.vjs-related-videos-grid{grid-template-columns:repeat(3,1fr)}.video-js .vjs-control:hover:after,.video-js .vjs-control:focus:after,.video-js .vjs-control:active:after{display:none!important;opacity:0!important;visibility:hidden!important}.video-js .vjs-play-control:hover:after,.video-js .vjs-mute-control:hover:after,.video-js .vjs-volume-panel:hover:after,.video-js .vjs-fullscreen-control:hover:after,.video-js .vjs-picture-in-picture-control:hover:after,.video-js .vjs-settings-control:hover:after,.video-js .vjs-chapters-control:hover:after,.video-js .vjs-autoplay-toggle:hover:after,.video-js .vjs-next-video-control:hover:after,.video-js .vjs-remaining-time:hover:after{display:none!important;opacity:0!important;visibility:hidden!important}}@media (max-width: 1024px){body div.custom-settings-overlay{height:calc(100% - 40px);max-height:300px}}@media (max-width: 767px){.vjs-related-vdeo-item:nth-child(n+5){display:none}.vjs-chapters-button button.vjs-button,.vjs-subtitles-button button.vjs-button,.video-js button.vjs-control{width:32px;height:32px}button.vjs-button>.vjs-icon-placeholder:before{line-height:32px}.vjs-next-video-control svg{width:32px;height:32px}.video-js div.vjs-control{height:32px}.vjs-button>.vjs-icon-placeholder:before{font-size:1.4em!important}.video-js .vjs-subs-active button.vjs-subtitles-button:before{width:20px}.video-js button.vjs-subtitles-button:before{bottom:2px}.video-js div.vjs-control-bar{padding:0 2px}.video-js .vjs-autoplay-toggle{margin-right:6px!important}.video-js .vjs-picture-in-picture-control{margin-left:6px!important}.video-js .vjs-text-track-display{bottom:8em!important}.video-js .vjs-text-track-cue{font-size:1.1em!important;max-width:95%!important}.video-js .vjs-text-track-cue>div{padding:6px 10px!important;font-size:.9em!important;background:rgba(0,0,0,.8)!important}.video-js.vjs-fullscreen .vjs-text-track-display{bottom:10em!important}.video-js.vjs-fullscreen .vjs-text-track-cue{font-size:1.3em!important;max-width:90%!important}.video-js.vjs-fullscreen .vjs-text-track-cue>div{padding:8px 12px!important;font-size:.95em!important}.video-js .vjs-subtitles-button button.vjs-button{min-width:32px!important;min-height:32px!important;touch-action:manipulation!important;-webkit-tap-highlight-color:transparent!important;-webkit-touch-callout:none!important;-webkit-user-select:none!important;user-select:none!important}.chapter-body{height:calc(100% - 70px)}.subtitles-submenu,.quality-submenu,.speed-submenu{height:100%;overflow:auto}body div.custom-settings-overlay{bottom:40px}div.chapter-close button{width:30px;height:30px}.vjs-related-videos-grid{grid-template-columns:repeat(2,1fr)}.video-js .vjs-control:hover:after,.video-js .vjs-control:focus:after,.video-js .vjs-control:active:after{display:none!important;opacity:0!important;visibility:hidden!important}.video-js .vjs-play-control:hover:after,.video-js .vjs-mute-control:hover:after,.video-js .vjs-volume-panel:hover:after,.video-js .vjs-fullscreen-control:hover:after,.video-js .vjs-picture-in-picture-control:hover:after,.video-js .vjs-settings-control:hover:after,.video-js .vjs-chapters-control:hover:after,.video-js .vjs-autoplay-toggle:hover:after,.video-js .vjs-next-video-control:hover:after,.video-js .vjs-remaining-time:hover:after{display:none!important;opacity:0!important;visibility:hidden!important}.video-js .vjs-autoplay-toggle.touch-active:after{opacity:1;visibility:visible}.video-js .vjs-autoplay-toggle:after{font-size:11px;padding:5px 8px;margin-bottom:6px}.video-container{padding:0 15px}.vjs-related-video-thumbnail{height:100%}.vjs-chapter-floating-tooltip{font-size:11px!important}.custom-chapters-overlay .video-chapter{right:10px;left:auto;width:100%;max-width:280px;height:calc(100% - 40px);max-height:calc(100% - 40px);overflow:hidden;bottom:40px}.video-js .vjs-settings-button{min-width:44px!important;height:44px!important;padding:0!important;margin:0 2px!important;display:flex!important;align-items:center!important;justify-content:center!important;touch-action:manipulation!important;-webkit-tap-highlight-color:transparent!important;cursor:pointer!important;z-index:1000!important;pointer-events:auto!important;position:relative!important}.video-js .vjs-settings-button .vjs-icon-cog{font-size:20px!important;width:20px!important;height:20px!important;display:flex!important;align-items:center!important;justify-content:center!important}.video-js .vjs-control-bar .vjs-button{touch-action:manipulation!important;-webkit-tap-highlight-color:transparent!important;-webkit-touch-callout:none!important;-webkit-user-select:none!important;user-select:none!important}.custom-settings-overlay .settings-item{padding:6px 16px;font-size:15px;touch-action:manipulation;line-height:18px}.custom-settings-overlay .settings-header{padding:10px 16px;font-size:18px;line-height:20px}.chapter-head{padding:10px 15px}.chapter-title h3 a{font-size:15px!important;line-height:20px!important;height:20px!important}.chapter-title p{font-size:11px!important;line-height:14px!important}.playlist-items a{padding:10px 16px!important;min-height:58px!important}.thumbnail-meta h4{font-size:13px!important;line-height:18px!important}.thumbnail-meta .meta-sub .meta-dynamic{font-size:11px!important;line-height:16px!important}}@media (max-width: 574px){.vjs-related-video-item:nth-child(n+3){display:none}}@media (max-width: 480px){.video-container{padding:0 10px}.video-js .vjs-control:hover:after,.video-js .vjs-control:focus:after,.video-js .vjs-control:active:after{display:none!important;opacity:0!important;visibility:hidden!important}.video-js .vjs-play-control:hover:after,.video-js .vjs-mute-control:hover:after,.video-js .vjs-volume-panel:hover:after,.video-js .vjs-fullscreen-control:hover:after,.video-js .vjs-picture-in-picture-control:hover:after,.video-js .vjs-settings-control:hover:after,.video-js .vjs-chapters-control:hover:after,.video-js .vjs-autoplay-toggle:hover:after,.video-js .vjs-next-video-control:hover:after,.video-js .vjs-remaining-time:hover:after{display:none!important;opacity:0!important;visibility:hidden!important}.vjs-related-video-thumbnail{height:100%}.video-js .vjs-settings-button .vjs-icon-cog{font-size:22px!important;width:22px!important;height:22px!important}}@media (max-width: 439px){.vjs-related-video-item:nth-child(n+2){display:none}.vjs-related-videos-grid{grid-template-columns:repeat(1,1fr)}}@media (max-width: 399px){.vjs-chapters-button button.vjs-button,.vjs-subtitles-button button.vjs-button,.video-js button.vjs-control{width:28px;height:28px}button.vjs-button>.vjs-icon-placeholder:before{line-height:28px}.vjs-next-video-control svg{width:28px;height:28px}.video-js div.vjs-control{height:28px}.video-js .vjs-autoplay-toggle{margin-right:4px!important}.video-js .vjs-picture-in-picture-control{margin-left:4px!important}.video-js .vjs-text-track-display{bottom:7em!important}.video-js .vjs-text-track-cue{font-size:1em!important;max-width:98%!important}.video-js .vjs-text-track-cue>div{padding:4px 8px!important;font-size:.85em!important;background:rgba(0,0,0,.85)!important}.video-js.vjs-fullscreen .vjs-text-track-display{bottom:9em!important}.video-js.vjs-fullscreen .vjs-text-track-cue{font-size:1.2em!important;max-width:95%!important}.video-js.vjs-fullscreen .vjs-text-track-cue>div{padding:6px 10px!important;font-size:.9em!important}.vjs-button>.vjs-icon-placeholder:before{font-size:1.4em!important}}.vjs-svg-icon{display:inline-block;background-repeat:no-repeat;background-position:center;fill:currentColor;height:1.8em;width:1.8em}.vjs-svg-icon:before{content:none!important}.vjs-svg-icon:hover,.vjs-control:focus .vjs-svg-icon{filter:drop-shadow(0 0 .25em #fff)}.vjs-modal-dialog .vjs-modal-dialog-content,.video-js .vjs-modal-dialog,.vjs-button>.vjs-icon-placeholder:before,.video-js .vjs-big-play-button .vjs-icon-placeholder:before{position:absolute;top:0;left:0;width:100%;height:100%}.vjs-button>.vjs-icon-placeholder:before,.video-js .vjs-big-play-button .vjs-icon-placeholder:before{text-align:center}@font-face{font-family:VideoJS;src:url(data:application/font-woff;charset=utf-8;base64,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) format("woff");font-weight:400;font-style:normal}.vjs-icon-play,.video-js .vjs-play-control .vjs-icon-placeholder,.video-js .vjs-big-play-button .vjs-icon-placeholder:before{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-play:before,.video-js .vjs-play-control .vjs-icon-placeholder:before,.video-js .vjs-big-play-button .vjs-icon-placeholder:before{content:""}.vjs-icon-play-circle{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-play-circle:before{content:""}.vjs-icon-pause,.video-js .vjs-play-control.vjs-playing .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-pause:before,.video-js .vjs-play-control.vjs-playing .vjs-icon-placeholder:before{content:""}.vjs-icon-volume-mute,.video-js .vjs-mute-control.vjs-vol-0 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-volume-mute:before,.video-js .vjs-mute-control.vjs-vol-0 .vjs-icon-placeholder:before{content:""}.vjs-icon-volume-low,.video-js .vjs-mute-control.vjs-vol-1 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-volume-low:before,.video-js .vjs-mute-control.vjs-vol-1 .vjs-icon-placeholder:before{content:""}.vjs-icon-volume-mid,.video-js .vjs-mute-control.vjs-vol-2 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-volume-mid:before,.video-js .vjs-mute-control.vjs-vol-2 .vjs-icon-placeholder:before{content:""}.vjs-icon-volume-high,.video-js .vjs-mute-control .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-volume-high:before,.video-js .vjs-mute-control .vjs-icon-placeholder:before{content:""}.vjs-icon-fullscreen-enter,.video-js .vjs-fullscreen-control .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-fullscreen-enter:before,.video-js .vjs-fullscreen-control .vjs-icon-placeholder:before{content:""}.vjs-icon-fullscreen-exit,.video-js.vjs-fullscreen .vjs-fullscreen-control .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-fullscreen-exit:before,.video-js.vjs-fullscreen .vjs-fullscreen-control .vjs-icon-placeholder:before{content:""}.vjs-icon-spinner{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-spinner:before{content:""}.vjs-icon-subtitles,.video-js .vjs-subs-caps-button .vjs-icon-placeholder,.video-js.video-js:lang(en-GB) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js.video-js:lang(en-IE) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js.video-js:lang(en-AU) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js.video-js:lang(en-NZ) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js .vjs-subtitles-button .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-subtitles:before,.video-js .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js.video-js:lang(en-GB) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js.video-js:lang(en-IE) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js.video-js:lang(en-AU) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js.video-js:lang(en-NZ) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js .vjs-subtitles-button .vjs-icon-placeholder:before{content:""}.vjs-icon-captions,.video-js:lang(en) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js:lang(fr-CA) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js .vjs-captions-button .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-captions:before,.video-js:lang(en) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js:lang(fr-CA) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js .vjs-captions-button .vjs-icon-placeholder:before{content:""}.vjs-icon-hd{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-hd:before{content:""}.vjs-icon-chapters,.video-js .vjs-chapters-button .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-chapters:before,.video-js .vjs-chapters-button .vjs-icon-placeholder:before{content:""}.vjs-icon-downloading{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-downloading:before{content:""}.vjs-icon-file-download{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-file-download:before{content:""}.vjs-icon-file-download-done{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-file-download-done:before{content:""}.vjs-icon-file-download-off{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-file-download-off:before{content:""}.vjs-icon-share{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-share:before{content:""}.vjs-icon-cog{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-cog:before{content:""}.vjs-icon-square{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-square:before{content:""}.vjs-icon-circle,.vjs-seek-to-live-control .vjs-icon-placeholder,.video-js .vjs-volume-level,.video-js .vjs-play-progress{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-circle:before,.vjs-seek-to-live-control .vjs-icon-placeholder:before,.video-js .vjs-volume-level:before,.video-js .vjs-play-progress:before{content:""}.vjs-icon-circle-outline{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-circle-outline:before{content:""}.vjs-icon-circle-inner-circle{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-circle-inner-circle:before{content:""}.vjs-icon-cancel,.video-js .vjs-control.vjs-close-button .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-cancel:before,.video-js .vjs-control.vjs-close-button .vjs-icon-placeholder:before{content:""}.vjs-icon-repeat{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-repeat:before{content:""}.vjs-icon-replay,.video-js .vjs-play-control.vjs-ended .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-replay:before,.video-js .vjs-play-control.vjs-ended .vjs-icon-placeholder:before{content:""}.vjs-icon-replay-5,.video-js .vjs-skip-backward-5 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-replay-5:before,.video-js .vjs-skip-backward-5 .vjs-icon-placeholder:before{content:""}.vjs-icon-replay-10,.video-js .vjs-skip-backward-10 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-replay-10:before,.video-js .vjs-skip-backward-10 .vjs-icon-placeholder:before{content:""}.vjs-icon-replay-30,.video-js .vjs-skip-backward-30 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-replay-30:before,.video-js .vjs-skip-backward-30 .vjs-icon-placeholder:before{content:""}.vjs-icon-forward-5,.video-js .vjs-skip-forward-5 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-forward-5:before,.video-js .vjs-skip-forward-5 .vjs-icon-placeholder:before{content:""}.vjs-icon-forward-10,.video-js .vjs-skip-forward-10 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-forward-10:before,.video-js .vjs-skip-forward-10 .vjs-icon-placeholder:before{content:""}.vjs-icon-forward-30,.video-js .vjs-skip-forward-30 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-forward-30:before,.video-js .vjs-skip-forward-30 .vjs-icon-placeholder:before{content:""}.vjs-icon-audio,.video-js .vjs-audio-button .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-audio:before,.video-js .vjs-audio-button .vjs-icon-placeholder:before{content:""}.vjs-icon-next-item{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-next-item:before{content:""}.vjs-icon-previous-item{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-previous-item:before{content:""}.vjs-icon-shuffle{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-shuffle:before{content:""}.vjs-icon-cast{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-cast:before{content:""}.vjs-icon-picture-in-picture-enter,.video-js .vjs-picture-in-picture-control .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-picture-in-picture-enter:before,.video-js .vjs-picture-in-picture-control .vjs-icon-placeholder:before{content:""}.vjs-icon-picture-in-picture-exit,.video-js.vjs-picture-in-picture .vjs-picture-in-picture-control .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-picture-in-picture-exit:before,.video-js.vjs-picture-in-picture .vjs-picture-in-picture-control .vjs-icon-placeholder:before{content:""}.vjs-icon-facebook{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-facebook:before{content:""}.vjs-icon-linkedin{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-linkedin:before{content:""}.vjs-icon-twitter{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-twitter:before{content:""}.vjs-icon-tumblr{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-tumblr:before{content:""}.vjs-icon-pinterest{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-pinterest:before{content:""}.vjs-icon-audio-description,.video-js .vjs-descriptions-button .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-audio-description:before,.video-js .vjs-descriptions-button .vjs-icon-placeholder:before{content:""}.video-js{display:inline-block;vertical-align:top;box-sizing:border-box;color:#fff;background-color:#000;position:relative;padding:0;font-size:10px;line-height:1;font-weight:400;font-style:normal;font-family:Arial,Helvetica,sans-serif;word-break:initial}.video-js:-moz-full-screen{position:absolute}.video-js:-webkit-full-screen{width:100%!important;height:100%!important}.video-js[tabindex="-1"]{outline:none}.video-js *,.video-js *:before,.video-js *:after{box-sizing:inherit}.video-js ul{font-family:inherit;font-size:inherit;line-height:inherit;list-style-position:outside;margin:0}.video-js.vjs-fluid,.video-js.vjs-16-9,.video-js.vjs-4-3,.video-js.vjs-9-16,.video-js.vjs-1-1{width:100%;max-width:100%}.video-js.vjs-fluid:not(.vjs-audio-only-mode),.video-js.vjs-16-9:not(.vjs-audio-only-mode),.video-js.vjs-4-3:not(.vjs-audio-only-mode),.video-js.vjs-9-16:not(.vjs-audio-only-mode),.video-js.vjs-1-1:not(.vjs-audio-only-mode){height:0}.video-js.vjs-16-9:not(.vjs-audio-only-mode){padding-top:56.25%}.video-js.vjs-4-3:not(.vjs-audio-only-mode){padding-top:75%}.video-js.vjs-9-16:not(.vjs-audio-only-mode){padding-top:177.7777777778%}.video-js.vjs-1-1:not(.vjs-audio-only-mode){padding-top:100%}.video-js.vjs-fill:not(.vjs-audio-only-mode){width:100%;height:100%}.video-js .vjs-tech{position:absolute;top:0;left:0;width:100%;height:100%}.video-js.vjs-audio-only-mode .vjs-tech{display:none}body.vjs-full-window,body.vjs-pip-window{padding:0;margin:0;height:100%}.vjs-full-window .video-js.vjs-fullscreen,body.vjs-pip-window .video-js{position:fixed;overflow:hidden;z-index:1000;left:0;top:0;bottom:0;right:0}.video-js.vjs-fullscreen:not(.vjs-ios-native-fs),body.vjs-pip-window .video-js{width:100%!important;height:100%!important;padding-top:0!important;display:block}.video-js.vjs-fullscreen.vjs-user-inactive{cursor:none}.vjs-pip-container .vjs-pip-text{position:absolute;bottom:10%;font-size:2em;background-color:#000000b3;padding:.5em;text-align:center;width:100%}.vjs-layout-tiny.vjs-pip-container .vjs-pip-text,.vjs-layout-x-small.vjs-pip-container .vjs-pip-text,.vjs-layout-small.vjs-pip-container .vjs-pip-text{bottom:0;font-size:1.4em}.vjs-hidden{display:none!important}.vjs-disabled{opacity:.5;cursor:default}.video-js .vjs-offscreen{height:1px;left:-9999px;position:absolute;top:0;width:1px}.vjs-lock-showing{display:block!important;opacity:1!important;visibility:visible!important}.vjs-no-js{padding:20px;color:#fff;background-color:#000;font-size:18px;font-family:Arial,Helvetica,sans-serif;text-align:center;width:300px;height:150px;margin:0 auto}.vjs-no-js a,.vjs-no-js a:visited{color:#66a8cc}.video-js .vjs-big-play-button{font-size:3em;line-height:1.5em;height:1.63332em;width:3em;display:block;position:absolute;top:50%;left:50%;padding:0;margin-top:-.81666em;margin-left:-1.5em;cursor:pointer;opacity:1;border:.06666em solid #fff;background-color:#2b333f;background-color:#2b333fb3;border-radius:.3em;transition:all .4s}.vjs-big-play-button .vjs-svg-icon{width:1em;height:1em;position:absolute;top:50%;left:50%;line-height:1;transform:translate(-50%,-50%)}.video-js:hover .vjs-big-play-button,.video-js .vjs-big-play-button:focus{border-color:#fff;background-color:#73859f;background-color:#73859f80;transition:all 0s}.vjs-controls-disabled .vjs-big-play-button,.vjs-has-started .vjs-big-play-button,.vjs-using-native-controls .vjs-big-play-button,.vjs-error .vjs-big-play-button{display:none}.vjs-has-started.vjs-paused.vjs-show-big-play-button-on-pause:not(.vjs-seeking,.vjs-scrubbing,.vjs-error) .vjs-big-play-button{display:block}.video-js button{background:none;border:none;color:inherit;display:inline-block;font-size:inherit;line-height:inherit;text-transform:none;text-decoration:none;transition:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.video-js.vjs-spatial-navigation-enabled .vjs-button:focus{outline:.0625em solid white;box-shadow:none}.vjs-control .vjs-button{width:100%;height:100%}.video-js .vjs-control.vjs-close-button{cursor:pointer;height:3em;position:absolute;right:0;top:.5em;z-index:2}.video-js .vjs-modal-dialog{background:rgba(0,0,0,.8);background:linear-gradient(180deg,rgba(0,0,0,.8),rgba(255,255,255,0));overflow:auto}.video-js .vjs-modal-dialog>*{box-sizing:border-box}.vjs-modal-dialog .vjs-modal-dialog-content{font-size:1.2em;line-height:1.5;padding:20px 24px;z-index:1}.vjs-menu-button{cursor:pointer}.vjs-menu-button.vjs-disabled{cursor:default}.vjs-workinghover .vjs-menu-button.vjs-disabled:hover .vjs-menu{display:none}.vjs-menu .vjs-menu-content{display:block;padding:0;margin:0;font-family:Arial,Helvetica,sans-serif;overflow:auto}.vjs-menu .vjs-menu-content>*{box-sizing:border-box}.vjs-scrubbing .vjs-control.vjs-menu-button:hover .vjs-menu{display:none}.vjs-menu li{display:flex;justify-content:center;list-style:none;margin:0;padding:.2em 0;line-height:1.4em;font-size:1.2em;text-align:center;text-transform:lowercase}.vjs-menu li.vjs-menu-item:focus,.vjs-menu li.vjs-menu-item:hover,.js-focus-visible .vjs-menu li.vjs-menu-item:hover{background-color:#73859f;background-color:#73859f80}.vjs-menu li.vjs-selected,.vjs-menu li.vjs-selected:focus,.vjs-menu li.vjs-selected:hover,.js-focus-visible .vjs-menu li.vjs-selected:hover{background-color:#fff;color:#2b333f}.vjs-menu li.vjs-selected .vjs-svg-icon,.vjs-menu li.vjs-selected:focus .vjs-svg-icon,.vjs-menu li.vjs-selected:hover .vjs-svg-icon,.js-focus-visible .vjs-menu li.vjs-selected:hover .vjs-svg-icon{fill:#000}.video-js .vjs-menu *:not(.vjs-selected):focus:not(:focus-visible),.js-focus-visible .vjs-menu *:not(.vjs-selected):focus:not(.focus-visible){background:none}.vjs-menu li.vjs-menu-title{text-align:center;text-transform:uppercase;font-size:1em;line-height:2em;padding:0;margin:0 0 .3em;font-weight:700;cursor:default}.vjs-menu-button-popup .vjs-menu{display:none;position:absolute;bottom:0;width:10em;left:-3em;height:0em;margin-bottom:1.5em;border-top-color:#2b333fb3}.vjs-pip-window .vjs-menu-button-popup .vjs-menu{left:unset;right:1em}.vjs-menu-button-popup .vjs-menu .vjs-menu-content{background-color:#2b333f;background-color:#2b333fb3;position:absolute;width:100%;bottom:1.5em;max-height:15em}.vjs-layout-tiny .vjs-menu-button-popup .vjs-menu .vjs-menu-content,.vjs-layout-x-small .vjs-menu-button-popup .vjs-menu .vjs-menu-content{max-height:5em}.vjs-layout-small .vjs-menu-button-popup .vjs-menu .vjs-menu-content{max-height:10em}.vjs-layout-medium .vjs-menu-button-popup .vjs-menu .vjs-menu-content{max-height:14em}.vjs-layout-large .vjs-menu-button-popup .vjs-menu .vjs-menu-content,.vjs-layout-x-large .vjs-menu-button-popup .vjs-menu .vjs-menu-content,.vjs-layout-huge .vjs-menu-button-popup .vjs-menu .vjs-menu-content{max-height:25em}.vjs-workinghover .vjs-menu-button-popup.vjs-hover .vjs-menu,.vjs-menu-button-popup .vjs-menu.vjs-lock-showing{display:block}.video-js .vjs-menu-button-inline{transition:all .4s;overflow:hidden}.video-js .vjs-menu-button-inline:before{width:2.222222222em}.video-js .vjs-menu-button-inline:hover,.video-js .vjs-menu-button-inline:focus,.video-js .vjs-menu-button-inline.vjs-slider-active{width:12em}.vjs-menu-button-inline .vjs-menu{opacity:0;height:100%;width:auto;position:absolute;left:4em;top:0;padding:0;margin:0;transition:all .4s}.vjs-menu-button-inline:hover .vjs-menu,.vjs-menu-button-inline:focus .vjs-menu,.vjs-menu-button-inline.vjs-slider-active .vjs-menu{display:block;opacity:1}.vjs-menu-button-inline .vjs-menu-content{width:auto;height:100%;margin:0;overflow:hidden}.video-js .vjs-control-bar{display:none;width:100%;position:absolute;bottom:0;left:0;right:0;height:3em;background-color:#2b333f;background-color:#2b333fb3}.video-js.vjs-spatial-navigation-enabled .vjs-control-bar{gap:1px}.video-js:not(.vjs-controls-disabled,.vjs-using-native-controls,.vjs-error) .vjs-control-bar.vjs-lock-showing{display:flex!important}.vjs-has-started .vjs-control-bar,.vjs-audio-only-mode .vjs-control-bar{display:flex;visibility:visible;opacity:1;transition:visibility .1s,opacity .1s}.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{visibility:visible;opacity:0;pointer-events:none;transition:visibility 1s,opacity 1s}.vjs-controls-disabled .vjs-control-bar,.vjs-using-native-controls .vjs-control-bar,.vjs-error .vjs-control-bar{display:none!important}.vjs-audio.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar,.vjs-audio-only-mode.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{opacity:1;visibility:visible;pointer-events:auto}.video-js .vjs-control{position:relative;text-align:center;margin:0;padding:0;height:100%;width:4em;flex:none}.video-js .vjs-control.vjs-visible-text{width:auto;padding-left:1em;padding-right:1em}.vjs-button>.vjs-icon-placeholder:before{font-size:1.8em;line-height:1.67}.vjs-button>.vjs-icon-placeholder{display:block}.vjs-button>.vjs-svg-icon{display:inline-block}.video-js .vjs-control:focus:before,.video-js .vjs-control:hover:before,.video-js .vjs-control:focus{text-shadow:0em 0em 1em white}.video-js *:not(.vjs-visible-text)>.vjs-control-text{border:0;clip:rect(0 0 0 0);height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.video-js .vjs-custom-control-spacer{display:none}.video-js .vjs-progress-control{cursor:pointer;flex:auto;display:flex;align-items:center;min-width:4em;touch-action:none}.video-js .vjs-progress-control.disabled{cursor:default}.vjs-live .vjs-progress-control{display:none}.vjs-liveui .vjs-progress-control{display:flex;align-items:center}.video-js .vjs-progress-holder{flex:auto;transition:all .2s;height:.3em}.video-js .vjs-progress-control .vjs-progress-holder{margin:0 10px}.video-js .vjs-progress-control:hover .vjs-progress-holder,.video-js.vjs-scrubbing.vjs-touch-enabled .vjs-progress-control .vjs-progress-holder{font-size:1.6666666667em}.video-js .vjs-progress-control:hover .vjs-progress-holder.disabled{font-size:1em}.video-js .vjs-progress-holder .vjs-play-progress,.video-js .vjs-progress-holder .vjs-load-progress,.video-js .vjs-progress-holder .vjs-load-progress div{position:absolute;display:block;height:100%;margin:0;padding:0;width:0}.video-js .vjs-play-progress{background-color:#fff}.video-js .vjs-play-progress:before{font-size:.9em;position:absolute;right:-.5em;line-height:.35em;z-index:1}.vjs-svg-icons-enabled .vjs-play-progress:before{content:none!important}.vjs-play-progress .vjs-svg-icon{position:absolute;top:-.35em;right:-.4em;width:.9em;height:.9em;pointer-events:none;line-height:.15em;z-index:1}.video-js .vjs-load-progress{background:rgba(114.9141509434,132.7028301887,159.3858490566,.5)}.video-js .vjs-load-progress div{background:rgba(114.9141509434,132.7028301887,159.3858490566,.75)}.video-js .vjs-time-tooltip{background-color:#fff;background-color:#fffc;border-radius:.3em;color:#000;float:right;font-family:Arial,Helvetica,sans-serif;font-size:1em;padding:6px 8px 8px;pointer-events:none;position:absolute;top:-3.4em;visibility:hidden;z-index:1}.video-js .vjs-progress-holder:focus .vjs-time-tooltip{display:none}.video-js .vjs-progress-control:hover .vjs-time-tooltip,.video-js .vjs-progress-control:hover .vjs-progress-holder:focus .vjs-time-tooltip,.video-js.vjs-scrubbing.vjs-touch-enabled .vjs-progress-control .vjs-time-tooltip{display:block;font-size:.6em;visibility:visible}.video-js .vjs-progress-control.disabled:hover .vjs-time-tooltip{font-size:1em}.video-js .vjs-progress-control .vjs-mouse-display{display:none;position:absolute;width:1px;height:100%;background-color:#000;z-index:1}.video-js .vjs-progress-control:hover .vjs-mouse-display,.video-js.vjs-scrubbing.vjs-touch-enabled .vjs-progress-control .vjs-mouse-display{display:block}.video-js.vjs-user-inactive .vjs-progress-control .vjs-mouse-display,.video-js.vjs-touch-enabled:not(.vjs-scrubbing) .vjs-progress-control .vjs-mouse-display{visibility:hidden;opacity:0;transition:visibility 1s,opacity 1s}.vjs-mouse-display .vjs-time-tooltip{color:#fff;background-color:#000;background-color:#000c}.video-js .vjs-slider{position:relative;cursor:pointer;padding:0;margin:0 .45em;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:#73859f;background-color:#73859f80}.video-js .vjs-slider.disabled{cursor:default}.video-js .vjs-slider:focus{text-shadow:0em 0em 1em white;box-shadow:0 0 1em #fff}.video-js.vjs-spatial-navigation-enabled .vjs-slider:focus{outline:.0625em solid white}.video-js .vjs-mute-control{cursor:pointer;flex:none}.video-js .vjs-volume-control{cursor:pointer;margin-right:1em;display:flex}.video-js .vjs-volume-control.vjs-volume-horizontal{width:5em}.video-js .vjs-volume-panel .vjs-volume-control{visibility:visible;opacity:0;width:1px;height:1px;margin-left:-1px}.video-js .vjs-volume-panel{transition:width 1s}.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control,.video-js .vjs-volume-panel:active .vjs-volume-control,.video-js .vjs-volume-panel:focus .vjs-volume-control,.video-js .vjs-volume-panel .vjs-volume-control:active,.video-js .vjs-volume-panel.vjs-hover .vjs-mute-control~.vjs-volume-control,.video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active{visibility:visible;opacity:1;position:relative;transition:visibility .1s,opacity .1s,height .1s,width .1s,left 0s,top 0s}.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control.vjs-volume-horizontal,.video-js .vjs-volume-panel:active .vjs-volume-control.vjs-volume-horizontal,.video-js .vjs-volume-panel:focus .vjs-volume-control.vjs-volume-horizontal,.video-js .vjs-volume-panel .vjs-volume-control:active.vjs-volume-horizontal,.video-js .vjs-volume-panel.vjs-hover .vjs-mute-control~.vjs-volume-control.vjs-volume-horizontal,.video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active.vjs-volume-horizontal{width:5em;height:3em;margin-right:0}.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control.vjs-volume-vertical,.video-js .vjs-volume-panel:active .vjs-volume-control.vjs-volume-vertical,.video-js .vjs-volume-panel:focus .vjs-volume-control.vjs-volume-vertical,.video-js .vjs-volume-panel .vjs-volume-control:active.vjs-volume-vertical,.video-js .vjs-volume-panel.vjs-hover .vjs-mute-control~.vjs-volume-control.vjs-volume-vertical,.video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active.vjs-volume-vertical{left:-3.5em;transition:left 0s}.video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover,.video-js .vjs-volume-panel.vjs-volume-panel-horizontal:active,.video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active{width:10em;transition:width .1s}.video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-mute-toggle-only{width:4em}.video-js .vjs-volume-panel .vjs-volume-control.vjs-volume-vertical{height:8em;width:3em;left:-3000em;transition:visibility 1s,opacity 1s,height 1s 1s,width 1s 1s,left 1s 1s,top 1s 1s}.video-js .vjs-volume-panel .vjs-volume-control.vjs-volume-horizontal{transition:visibility 1s,opacity 1s,height 1s 1s,width 1s,left 1s 1s,top 1s 1s}.video-js .vjs-volume-panel{display:flex}.video-js .vjs-volume-bar{margin:1.35em .45em}.vjs-volume-bar.vjs-slider-horizontal{width:5em;height:.3em}.vjs-volume-bar.vjs-slider-vertical{width:.3em;height:5em;margin:1.35em auto}.video-js .vjs-volume-level{position:absolute;bottom:0;left:0;background-color:#fff}.video-js .vjs-volume-level:before{position:absolute;font-size:.9em;z-index:1}.vjs-slider-vertical .vjs-volume-level{width:.3em}.vjs-slider-vertical .vjs-volume-level:before{top:-.5em;left:-.3em;z-index:1}.vjs-svg-icons-enabled .vjs-volume-level:before{content:none}.vjs-volume-level .vjs-svg-icon{position:absolute;width:.9em;height:.9em;pointer-events:none;z-index:1}.vjs-slider-horizontal .vjs-volume-level{height:.3em}.vjs-slider-horizontal .vjs-volume-level:before{line-height:.35em;right:-.5em}.vjs-slider-horizontal .vjs-volume-level .vjs-svg-icon{right:-.3em;transform:translateY(-50%)}.vjs-slider-vertical .vjs-volume-level .vjs-svg-icon{top:-.55em;transform:translate(-50%)}.video-js .vjs-volume-panel.vjs-volume-panel-vertical{width:4em}.vjs-volume-bar.vjs-slider-vertical .vjs-volume-level{height:100%}.vjs-volume-bar.vjs-slider-horizontal .vjs-volume-level{width:100%}.video-js .vjs-volume-vertical{width:3em;height:8em;bottom:8em;background-color:#2b333f;background-color:#2b333fb3}.video-js .vjs-volume-horizontal .vjs-menu{left:-2em}.video-js .vjs-volume-tooltip{background-color:#fff;background-color:#fffc;border-radius:.3em;color:#000;float:right;font-family:Arial,Helvetica,sans-serif;font-size:1em;padding:6px 8px 8px;pointer-events:none;position:absolute;top:-3.4em;visibility:hidden;z-index:1}.video-js .vjs-volume-control:hover .vjs-volume-tooltip,.video-js .vjs-volume-control:hover .vjs-progress-holder:focus .vjs-volume-tooltip{display:block;font-size:1em;visibility:visible}.video-js .vjs-volume-vertical:hover .vjs-volume-tooltip,.video-js .vjs-volume-vertical:hover .vjs-progress-holder:focus .vjs-volume-tooltip{left:1em;top:-12px}.video-js .vjs-volume-control.disabled:hover .vjs-volume-tooltip{font-size:1em}.video-js .vjs-volume-control .vjs-mouse-display{display:none;position:absolute;width:100%;height:1px;background-color:#000;z-index:1}.video-js .vjs-volume-horizontal .vjs-mouse-display{width:1px;height:100%}.video-js .vjs-volume-control:hover .vjs-mouse-display{display:block}.video-js.vjs-user-inactive .vjs-volume-control .vjs-mouse-display{visibility:hidden;opacity:0;transition:visibility 1s,opacity 1s}.vjs-mouse-display .vjs-volume-tooltip{color:#fff;background-color:#000;background-color:#000c}.vjs-poster{display:inline-block;vertical-align:middle;cursor:pointer;margin:0;padding:0;position:absolute;top:0;right:0;bottom:0;left:0;height:100%}.vjs-has-started .vjs-poster,.vjs-using-native-controls .vjs-poster{display:none}.vjs-audio.vjs-has-started .vjs-poster,.vjs-has-started.vjs-audio-poster-mode .vjs-poster,.vjs-pip-container.vjs-has-started .vjs-poster{display:block}.vjs-poster img{width:100%;height:100%;object-fit:contain}.video-js .vjs-live-control{display:flex;align-items:flex-start;flex:auto;font-size:1em;line-height:3em}.video-js:not(.vjs-live) .vjs-live-control,.video-js.vjs-liveui .vjs-live-control{display:none}.video-js .vjs-seek-to-live-control{align-items:center;cursor:pointer;flex:none;display:inline-flex;height:100%;padding-left:.5em;padding-right:.5em;font-size:1em;line-height:3em;width:auto;min-width:4em}.video-js.vjs-live:not(.vjs-liveui) .vjs-seek-to-live-control,.video-js:not(.vjs-live) .vjs-seek-to-live-control{display:none}.vjs-seek-to-live-control.vjs-control.vjs-at-live-edge{cursor:auto}.vjs-seek-to-live-control .vjs-icon-placeholder{margin-right:.5em;color:#888}.vjs-svg-icons-enabled .vjs-seek-to-live-control{line-height:0}.vjs-seek-to-live-control .vjs-svg-icon{width:1em;height:1em;pointer-events:none;fill:#888}.vjs-seek-to-live-control.vjs-control.vjs-at-live-edge .vjs-icon-placeholder{color:red}.vjs-seek-to-live-control.vjs-control.vjs-at-live-edge .vjs-svg-icon{fill:red}.video-js .vjs-time-control{flex:none;font-size:1em;line-height:3em;min-width:2em;width:auto;padding-left:1em;padding-right:1em}.vjs-live .vjs-time-control,.vjs-live .vjs-time-divider,.video-js .vjs-current-time,.video-js .vjs-duration{display:none}.vjs-time-divider{display:none;line-height:3em}.vjs-normalise-time-controls:not(.vjs-live) .vjs-time-control{display:flex}.video-js .vjs-play-control{cursor:pointer}.video-js .vjs-play-control .vjs-icon-placeholder{flex:none}.vjs-text-track-display{position:absolute;bottom:3em;left:0;right:0;top:0;pointer-events:none}.vjs-error .vjs-text-track-display{display:none}.video-js.vjs-controls-disabled .vjs-text-track-display,.video-js.vjs-user-inactive.vjs-playing .vjs-text-track-display{bottom:1em}.video-js .vjs-text-track{font-size:1.4em;text-align:center;margin-bottom:.1em}.vjs-subtitles{color:#fff}.vjs-captions{color:#fc6}.vjs-tt-cue{display:block}video::-webkit-media-text-track-display{transform:translateY(-3em)}.video-js.vjs-controls-disabled video::-webkit-media-text-track-display,.video-js.vjs-user-inactive.vjs-playing video::-webkit-media-text-track-display{transform:translateY(-1.5em)}.video-js.vjs-force-center-align-cues .vjs-text-track-cue{text-align:center!important;width:80%!important}@supports not (inset: 10px){.video-js .vjs-text-track-display>div{top:0;right:0;bottom:0;left:0}}.video-js .vjs-picture-in-picture-control{cursor:pointer;flex:none}.video-js.vjs-audio-only-mode .vjs-picture-in-picture-control,.vjs-pip-window .vjs-picture-in-picture-control{display:none}.video-js .vjs-fullscreen-control{cursor:pointer;flex:none}.video-js.vjs-audio-only-mode .vjs-fullscreen-control,.vjs-pip-window .vjs-fullscreen-control{display:none}.vjs-playback-rate>.vjs-menu-button,.vjs-playback-rate .vjs-playback-rate-value{position:absolute;top:0;left:0;width:100%;height:100%}.vjs-playback-rate .vjs-playback-rate-value{pointer-events:none;font-size:1.5em;line-height:2;text-align:center}.vjs-playback-rate .vjs-menu{width:4em;left:0}.vjs-error .vjs-error-display .vjs-modal-dialog-content{font-size:1.4em;text-align:center}.vjs-loading-spinner{display:none;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);opacity:.85;text-align:left;border:.6em solid rgba(43,51,63,.7);box-sizing:border-box;background-clip:padding-box;width:5em;height:5em;border-radius:50%;visibility:hidden}.vjs-seeking .vjs-loading-spinner,.vjs-waiting .vjs-loading-spinner{display:flex;justify-content:center;align-items:center;animation:vjs-spinner-show 0s linear .3s forwards}.vjs-error .vjs-loading-spinner{display:none}.vjs-loading-spinner:before,.vjs-loading-spinner:after{content:"";position:absolute;box-sizing:inherit;width:inherit;height:inherit;border-radius:inherit;opacity:1;border:inherit;border-color:transparent;border-top-color:#fff}.vjs-seeking .vjs-loading-spinner:before,.vjs-seeking .vjs-loading-spinner:after,.vjs-waiting .vjs-loading-spinner:before,.vjs-waiting .vjs-loading-spinner:after{animation:vjs-spinner-spin 1.1s cubic-bezier(.6,.2,0,.8) infinite,vjs-spinner-fade 1.1s linear infinite}.vjs-seeking .vjs-loading-spinner:before,.vjs-waiting .vjs-loading-spinner:before{border-top-color:#fff}.vjs-seeking .vjs-loading-spinner:after,.vjs-waiting .vjs-loading-spinner:after{border-top-color:#fff;animation-delay:.44s}@keyframes vjs-spinner-show{to{visibility:visible}}@keyframes vjs-spinner-spin{to{transform:rotate(360deg)}}@keyframes vjs-spinner-fade{0%{border-top-color:#73859f}20%{border-top-color:#73859f}35%{border-top-color:#fff}60%{border-top-color:#73859f}to{border-top-color:#73859f}}.video-js.vjs-audio-only-mode .vjs-captions-button{display:none}.vjs-chapters-button .vjs-menu ul{width:24em}.video-js.vjs-audio-only-mode .vjs-descriptions-button{display:none}.vjs-subs-caps-button+.vjs-menu .vjs-captions-menu-item .vjs-svg-icon{width:1.5em;height:1.5em}.video-js .vjs-subs-caps-button+.vjs-menu .vjs-captions-menu-item .vjs-menu-item-text .vjs-icon-placeholder{vertical-align:middle;display:inline-block;margin-bottom:-.1em}.video-js .vjs-subs-caps-button+.vjs-menu .vjs-captions-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before{font-family:VideoJS;content:"";font-size:1.5em;line-height:inherit}.video-js.vjs-audio-only-mode .vjs-subs-caps-button{display:none}.video-js .vjs-audio-button+.vjs-menu .vjs-descriptions-menu-item .vjs-menu-item-text .vjs-icon-placeholder,.video-js .vjs-audio-button+.vjs-menu .vjs-main-desc-menu-item .vjs-menu-item-text .vjs-icon-placeholder{vertical-align:middle;display:inline-block;margin-bottom:-.1em}.video-js .vjs-audio-button+.vjs-menu .vjs-descriptions-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before,.video-js .vjs-audio-button+.vjs-menu .vjs-main-desc-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before{font-family:VideoJS;content:" ";font-size:1.5em;line-height:inherit}.video-js.vjs-layout-small .vjs-current-time,.video-js.vjs-layout-small .vjs-time-divider,.video-js.vjs-layout-small .vjs-duration,.video-js.vjs-layout-small .vjs-remaining-time,.video-js.vjs-layout-small .vjs-playback-rate,.video-js.vjs-layout-small .vjs-volume-control,.video-js.vjs-layout-x-small .vjs-current-time,.video-js.vjs-layout-x-small .vjs-time-divider,.video-js.vjs-layout-x-small .vjs-duration,.video-js.vjs-layout-x-small .vjs-remaining-time,.video-js.vjs-layout-x-small .vjs-playback-rate,.video-js.vjs-layout-x-small .vjs-volume-control,.video-js.vjs-layout-tiny .vjs-current-time,.video-js.vjs-layout-tiny .vjs-time-divider,.video-js.vjs-layout-tiny .vjs-duration,.video-js.vjs-layout-tiny .vjs-remaining-time,.video-js.vjs-layout-tiny .vjs-playback-rate,.video-js.vjs-layout-tiny .vjs-volume-control{display:none}.video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal:hover,.video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal:active,.video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active,.video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover,.video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal:hover,.video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal:active,.video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active,.video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover,.video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal:hover,.video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal:active,.video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active,.video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover{width:auto;width:initial}.video-js.vjs-layout-x-small .vjs-progress-control,.video-js.vjs-layout-tiny .vjs-progress-control{display:none}.video-js.vjs-layout-x-small .vjs-custom-control-spacer{flex:auto;display:block}.vjs-modal-dialog.vjs-text-track-settings{background-color:#2b333f;background-color:#2b333fbf;color:#fff;height:70%}.vjs-spatial-navigation-enabled .vjs-modal-dialog.vjs-text-track-settings{height:80%}.vjs-error .vjs-text-track-settings{display:none}.vjs-text-track-settings .vjs-modal-dialog-content{display:table}.vjs-text-track-settings .vjs-track-settings-colors,.vjs-text-track-settings .vjs-track-settings-font,.vjs-text-track-settings .vjs-track-settings-controls{display:table-cell}.vjs-text-track-settings .vjs-track-settings-controls{text-align:right;vertical-align:bottom}@supports (display: grid){.vjs-text-track-settings .vjs-modal-dialog-content{display:grid;grid-template-columns:1fr 1fr;grid-template-rows:1fr;padding:20px 24px 0}.vjs-track-settings-controls .vjs-default-button{margin-bottom:20px}.vjs-text-track-settings .vjs-track-settings-controls{grid-column:1/-1}.vjs-layout-small .vjs-text-track-settings .vjs-modal-dialog-content,.vjs-layout-x-small .vjs-text-track-settings .vjs-modal-dialog-content,.vjs-layout-tiny .vjs-text-track-settings .vjs-modal-dialog-content{grid-template-columns:1fr}}.vjs-text-track-settings select{font-size:inherit}.vjs-track-setting>select{margin-right:1em;margin-bottom:.5em}.vjs-text-track-settings fieldset{margin:10px;border:none}.vjs-text-track-settings fieldset span{display:inline-block;padding:0 .6em .8em}.vjs-text-track-settings fieldset span>select{max-width:7.3em}.vjs-text-track-settings legend{color:#fff;font-weight:700;font-size:1.2em}.vjs-text-track-settings .vjs-label{margin:0 .5em .5em 0}.vjs-track-settings-controls button:focus,.vjs-track-settings-controls button:active{outline-style:solid;outline-width:medium;background-image:linear-gradient(0deg,#fff 88%,rgb(114.9141509434,132.7028301887,159.3858490566) 100%)}.vjs-track-settings-controls button:hover{color:#2b333fbf}.vjs-track-settings-controls button{background-color:#fff;background-image:linear-gradient(-180deg,#fff 88%,rgb(114.9141509434,132.7028301887,159.3858490566) 100%);color:#2b333f;cursor:pointer;border-radius:2px}.vjs-track-settings-controls .vjs-default-button{margin-right:1em}.vjs-title-bar{background:rgba(0,0,0,.9);background:linear-gradient(180deg,rgba(0,0,0,.9) 0%,rgba(0,0,0,.7) 60%,rgba(0,0,0,0) 100%);font-size:1.2em;line-height:1.5;transition:opacity .1s;padding:.666em 1.333em 4em;pointer-events:none;position:absolute;top:0;width:100%}.vjs-error .vjs-title-bar{display:none}.vjs-title-bar-title,.vjs-title-bar-description{margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vjs-title-bar-title{font-weight:700;margin-bottom:.333em}.vjs-playing.vjs-user-inactive .vjs-title-bar{opacity:0;transition:opacity 1s}.video-js .vjs-skip-forward-5,.video-js .vjs-skip-forward-10,.video-js .vjs-skip-forward-30,.video-js .vjs-skip-backward-5,.video-js .vjs-skip-backward-10,.video-js .vjs-skip-backward-30{cursor:pointer}.video-js .vjs-transient-button{position:absolute;height:3em;display:flex;align-items:center;justify-content:center;background-color:#32323280;cursor:pointer;opacity:1;transition:opacity 1s}.video-js:not(.vjs-has-started) .vjs-transient-button{display:none}.video-js.not-hover .vjs-transient-button:not(.force-display),.video-js.vjs-user-inactive .vjs-transient-button:not(.force-display){opacity:0}.video-js .vjs-transient-button span{padding:0 .5em}.video-js .vjs-transient-button.vjs-left{left:1em}.video-js .vjs-transient-button.vjs-right{right:1em}.video-js .vjs-transient-button.vjs-top{top:1em}.video-js .vjs-transient-button.vjs-near-top{top:4em}.video-js .vjs-transient-button.vjs-bottom{bottom:4em}.video-js .vjs-transient-button:hover{background-color:#323232e6}@media print{.video-js>*:not(.vjs-tech):not(.vjs-poster){visibility:hidden}}.vjs-resize-manager{position:absolute;top:0;left:0;width:100%;height:100%;border:none;z-index:-1000}.js-focus-visible .video-js *:focus:not(.focus-visible){outline:none}.video-js *:focus:not(:focus-visible){outline:none}.vjs-autoplay-countdown-overlay{position:absolute;top:0;left:0;width:100%;height:calc(100% - 46px);background:rgba(0,0,0,.85);display:none;flex-direction:column;justify-content:center;align-items:center;z-index:100000;padding:20px;box-sizing:border-box;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);opacity:0;transition:opacity .3s ease-in-out}.vjs-autoplay-countdown-overlay.autoplay-countdown-show{opacity:1}.autoplay-countdown-content{background:linear-gradient(135deg,rgba(0,0,0,.95),rgba(20,20,20,.9));border-radius:20px;padding:50px;max-width:480px;width:100%;text-align:center;box-shadow:0 20px 60px #0006,0 8px 32px #0003,inset 0 1px #ffffff1a;border:1px solid rgba(255,255,255,.15);-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);position:relative;overflow:hidden}.autoplay-countdown-content:before{content:"";position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(255,255,255,.3),transparent)}.autoplay-countdown-content:after{content:"";position:absolute;top:-50%;left:-50%;width:200%;height:200%;background:radial-gradient(circle,rgba(255,0,0,.05) 0%,transparent 70%);animation:backgroundPulse 4s ease-in-out infinite;pointer-events:none}@keyframes backgroundPulse{0%,to{opacity:.3;transform:scale(1)}50%{opacity:.6;transform:scale(1.1)}}.autoplay-countdown-header{position:relative;z-index:2}.autoplay-countdown-header h3{color:#fff;font-size:26px;font-weight:400;margin:0 0 10px;line-height:1.3;text-shadow:0 2px 4px rgba(0,0,0,.3)}.autoplay-countdown-header h3 span{font-weight:700}.autoplay-countdown-video-info{display:flex;flex-direction:column;align-items:center;gap:20px;text-align:center;position:relative;z-index:2;margin:0 0 50px}.next-video-thumbnail{flex-shrink:0;width:180px;height:101px;border-radius:12px;overflow:hidden;background:#333;position:relative;box-shadow:0 12px 32px #0006,0 4px 16px #0003;border:2px solid rgba(255,255,255,.1);transition:transform .3s ease,box-shadow .3s ease}.next-video-thumbnail:hover{transform:translateY(-4px) scale(1.02);box-shadow:0 16px 40px #00000080,0 8px 24px #0000004d}.next-video-thumbnail img{width:100%;height:100%;object-fit:cover;display:block}.play-overlay{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background:rgba(0,0,0,.8);border-radius:50%;width:64px;height:64px;display:flex;align-items:center;justify-content:center;color:#fff;transition:all .3s ease;box-shadow:0 8px 24px #00000080,0 4px 16px #0000004d;border:3px solid rgba(255,255,255,.2);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.play-overlay:hover{background:rgba(0,0,0,.9);transform:translate(-50%,-50%) scale(1.1);box-shadow:0 12px 32px #0009,0 6px 20px #0006}.play-overlay svg{margin-left:4px;width:28px;height:28px}.next-video-details{flex-grow:1;min-width:0;text-align:center}.next-video-title{color:#999;font-size:18px;font-weight:500;margin:0;line-height:1.4;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;text-shadow:0 2px 4px rgba(0,0,0,.3);letter-spacing:.5px}.next-video-author{color:#bbb;font-size:16px;margin:0 0 8px;line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}.next-video-duration{color:#999;font-size:14px;margin:0;line-height:1.2;font-weight:500}.autoplay-countdown-actions{display:flex;gap:24px;justify-content:center;align-items:center;position:relative;z-index:2;padding:0;margin-top:8px}button.autoplay-play-button,button.autoplay-cancel-button{display:flex;align-items:center;justify-content:center;gap:8px;padding:10px 20px;border:none;border-radius:8px;font-size:13px;font-weight:600;cursor:pointer;transition:all .3s cubic-bezier(.4,0,.2,1);min-width:140px;height:48px;position:relative;overflow:hidden;text-transform:uppercase;letter-spacing:.3px;line-height:1;white-space:nowrap;box-shadow:0 6px 20px #0000004d,inset 0 1px #ffffff1a;text-align:center}button.autoplay-play-button{background:linear-gradient(135deg,#ff0000,#e60000);color:#fff;border:1px solid rgba(255,255,255,.1)}.autoplay-play-button:before{content:"";position:absolute;top:0;left:-100%;width:100%;height:100%;background:linear-gradient(90deg,transparent,rgba(255,255,255,.2),transparent);transition:left .5s ease}.autoplay-play-button:hover{background:linear-gradient(135deg,#ff1a1a,#cc0000);transform:translateY(-2px);box-shadow:0 8px 25px #f006,inset 0 1px #ffffff4d}.autoplay-play-button:hover:before{left:100%}.autoplay-play-button:active{transform:translateY(-1px);box-shadow:0 4px 15px #ff00004d,inset 0 1px #fff3}.autoplay-cancel-button{background:linear-gradient(135deg,#404040,#2a2a2a);color:#fff;border:1px solid rgba(255,255,255,.1);box-shadow:0 6px 20px #0000004d,inset 0 1px #ffffff1a}.autoplay-cancel-button:hover{background:linear-gradient(135deg,#505050,#3a3a3a);transform:translateY(-2px);box-shadow:0 8px 25px #0006,inset 0 1px #fff3}.autoplay-cancel-button:active{transform:translateY(-1px);box-shadow:0 4px 15px #0000004d,inset 0 1px #ffffff1a}.autoplay-play-button svg,.autoplay-cancel-button svg{width:18px;height:18px;flex-shrink:0;filter:drop-shadow(0 1px 2px rgba(0,0,0,.3));transition:transform .3s ease;position:relative;z-index:1;display:block;margin:0;padding:0;vertical-align:middle}.autoplay-play-button:hover svg{transform:scale(1.05);filter:drop-shadow(0 2px 4px rgba(0,0,0,.4))}.autoplay-cancel-button svg{width:16px;height:16px}.autoplay-cancel-button:hover svg{transform:scale(1.05) rotate(90deg);filter:drop-shadow(0 2px 4px rgba(0,0,0,.4))}.autoplay-play-button span,.autoplay-cancel-button span{display:inline-block;vertical-align:middle;line-height:1;font-size:inherit;font-weight:inherit;letter-spacing:inherit;text-transform:inherit;position:relative;z-index:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;margin:0;padding:0;height:auto;align-self:center}.autoplay-play-button>*,.autoplay-cancel-button>*{vertical-align:middle;display:inline-block}.autoplay-play-button,.autoplay-cancel-button{align-items:center;justify-content:center}.autoplay-play-button svg,.autoplay-cancel-button svg{vertical-align:middle;display:inline-block}.vjs-autoplay-toggle .vjs-autoplay-icon svg{width:100%;height:100%;display:block}@media (max-width: 767px){.autoplay-countdown-video-info{margin-bottom:20px}.autoplay-countdown-content{padding:24px;max-width:400px}.autoplay-countdown-header h3{font-size:20px}.next-video-thumbnail{width:140px;height:78px}.play-overlay{width:48px;height:48px}.play-overlay svg{width:20px;height:20px}.next-video-title{font-size:18px}.next-video-author{font-size:14px}.autoplay-play-button,.autoplay-cancel-button{padding:12px 24px;font-size:14px;min-width:120px;height:44px;gap:6px;align-items:center;justify-content:center}.autoplay-play-button svg{width:16px;height:16px;vertical-align:middle}.autoplay-cancel-button svg{width:14px;height:14px;vertical-align:middle}}@media (max-width: 480px){.autoplay-countdown-content{padding:20px;max-width:350px}.autoplay-countdown-header h3{font-size:18px}.countdown-timer{font-size:24px;padding:10px 16px}.autoplay-countdown-video-info{gap:16px}.next-video-thumbnail{width:120px;height:68px}.play-overlay{width:40px;height:40px}.play-overlay svg{width:16px;height:16px}.next-video-title{font-size:16px}.next-video-author{font-size:13px}.autoplay-countdown-actions{gap:5px;padding:0}button.autoplay-play-button,button.autoplay-cancel-button{padding:10px 20px;width:120px;height:40px;min-width:120px}.autoplay-play-button,.autoplay-cancel-button{width:100%;min-width:100%;height:46px;gap:6px;padding:10px 20px;font-size:13px;align-items:center;justify-content:center}.autoplay-play-button svg{width:14px;height:14px;vertical-align:middle}.autoplay-cancel-button svg{width:12px;height:12px;vertical-align:middle}}.vjs-settings-button{width:3em;height:3em;display:flex;align-items:center;justify-content:center;padding:0;margin:0}.vjs-icon-cog1{font-size:30px!important;position:relative;top:-8px!important;display:flex;align-items:center;justify-content:center;width:100%;height:100%;line-height:1}.custom-settings-overlay{border:0;position:absolute;bottom:60px;right:20px;width:280px;height:350px;background:rgba(28,28,28,.95);color:#fff;border-radius:7px;box-shadow:0 4px 12px #00000080;display:none;z-index:1000;font-size:14px;overflow:auto}.settings-header{padding:12px 16px;border-bottom:1px solid rgba(255,255,255,.1);font-weight:700}.settings-item{padding:12px 16px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid rgba(255,255,255,.1);transition:background .2s ease;gap:10px}.settings-item .settings-left span{display:flex}.custom-settings-overlay .settings-left span.vjs-icon-placeholder{transform:inherit!important}.settings-item:last-child{border-bottom:none}.settings-item:hover{background:rgba(255,255,255,.05)}.speed-submenu,.quality-submenu,.subtitles-submenu{position:absolute;top:0;left:0;right:0;bottom:0;background:rgba(28,28,28,.95);display:none;flex-direction:column;overflow:auto;-webkit-overflow-scrolling:touch;touch-action:pan-y;overscroll-behavior:contain}.subtitle-option{padding:12px 16px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;transition:background .2s ease}.subtitle-option:hover{background:rgba(255,255,255,.05)}.subtitle-option.active{background:rgba(255,255,255,.1)}.submenu-header{padding:12px 16px;border-bottom:1px solid rgba(255,255,255,.1);display:flex;align-items:center;cursor:pointer;position:sticky;top:0;background:rgba(28,28,28,.95);z-index:1}.submenu-header:hover{background:rgba(28,28,28,1)}.speed-option{padding:12px 16px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;transition:background .2s ease}.speed-option:hover{background:rgba(255,255,255,.05)}.speed-option.active{background:rgba(255,255,255,.1)}.quality-option{padding:12px 16px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;transition:background .2s ease}.quality-option:hover{background:rgba(255,255,255,.05)}.quality-option.active{background:rgba(255,255,255,.1)}.settings-left{display:inline-flex;align-items:center;gap:8px}.settings-right{display:inline-flex;align-items:center;text-align:right}sup.hd-badge{font-size:10px;line-height:1;margin-left:6px;background:#e53935;color:#fff;padding:1px 4px;border-radius:3px} diff --git a/static/video_js/video-js.js b/static/video_js/video-js.js index 7729cb3c..9381b066 100644 --- a/static/video_js/video-js.js +++ b/static/video_js/video-js.js @@ -1,4 +1,4 @@ -(function(){"use strict";var Mf=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Xc(s){return s&&s.__esModule&&Object.prototype.hasOwnProperty.call(s,"default")?s.default:s}function w_(s){if(s.__esModule)return s;var e=s.default;if(typeof e=="function"){var i=function a(){return this instanceof a?Reflect.construct(e,arguments,this.constructor):e.apply(this,arguments)};i.prototype=e.prototype}else i={};return Object.defineProperty(i,"__esModule",{value:!0}),Object.keys(s).forEach(function(a){var o=Object.getOwnPropertyDescriptor(s,a);Object.defineProperty(i,a,o.get?o:{enumerable:!0,get:function(){return s[a]}})}),i}var A_={exports:{}},Wc={},D_={exports:{}},Qc={exports:{}};/** +(function(){"use strict";var Mf=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Xc(s){return s&&s.__esModule&&Object.prototype.hasOwnProperty.call(s,"default")?s.default:s}function w_(s){if(s.__esModule)return s;var e=s.default;if(typeof e=="function"){var i=function r(){return this instanceof r?Reflect.construct(e,arguments,this.constructor):e.apply(this,arguments)};i.prototype=e.prototype}else i={};return Object.defineProperty(i,"__esModule",{value:!0}),Object.keys(s).forEach(function(r){var o=Object.getOwnPropertyDescriptor(s,r);Object.defineProperty(i,r,o.get?o:{enumerable:!0,get:function(){return s[r]}})}),i}var A_={exports:{}},Wc={},D_={exports:{}},Qc={exports:{}};/** * @license React * react.development.js * @@ -6,19 +6,19 @@ * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */Qc.exports;var k_;function OD(){return k_||(k_=1,function(s,e){(function(){function i(D,Y){Object.defineProperty(u.prototype,D,{get:function(){console.warn("%s(...) is deprecated in plain JavaScript React classes. %s",Y[0],Y[1])}})}function a(D){return D===null||typeof D!="object"?null:(D=He&&D[He]||D["@@iterator"],typeof D=="function"?D:null)}function o(D,Y){D=(D=D.constructor)&&(D.displayName||D.name)||"ReactClass";var ye=D+"."+Y;it[ye]||(console.error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.",Y,D),it[ye]=!0)}function u(D,Y,ye){this.props=D,this.context=Y,this.refs=Sn,this.updater=ye||gt}function c(){}function h(D,Y,ye){this.props=D,this.context=Y,this.refs=Sn,this.updater=ye||gt}function m(D){return""+D}function b(D){try{m(D);var Y=!1}catch{Y=!0}if(Y){Y=console;var ye=Y.error,we=typeof Symbol=="function"&&Symbol.toStringTag&&D[Symbol.toStringTag]||D.constructor.name||"Object";return ye.call(Y,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",we),m(D)}}function T(D){if(D==null)return null;if(typeof D=="function")return D.$$typeof===xn?null:D.displayName||D.name||null;if(typeof D=="string")return D;switch(D){case oe:return"Fragment";case Se:return"Profiler";case Te:return"StrictMode";case Qe:return"Suspense";case be:return"SuspenseList";case Ge:return"Activity"}if(typeof D=="object")switch(typeof D.tag=="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),D.$$typeof){case qe:return"Portal";case We:return(D.displayName||"Context")+".Provider";case ze:return(D._context.displayName||"Context")+".Consumer";case Fe:var Y=D.render;return D=D.displayName,D||(D=Y.displayName||Y.name||"",D=D!==""?"ForwardRef("+D+")":"ForwardRef"),D;case _e:return Y=D.displayName||null,Y!==null?Y:T(D.type)||"Memo";case Ne:Y=D._payload,D=D._init;try{return T(D(Y))}catch{}}return null}function x(D){if(D===oe)return"<>";if(typeof D=="object"&&D!==null&&D.$$typeof===Ne)return"<...>";try{var Y=T(D);return Y?"<"+Y+">":"<...>"}catch{return"<...>"}}function w(){var D=xe.A;return D===null?null:D.getOwner()}function R(){return Error("react-stack-top-frame")}function L(D){if(Ei.call(D,"key")){var Y=Object.getOwnPropertyDescriptor(D,"key").get;if(Y&&Y.isReactWarning)return!1}return D.key!==void 0}function A(D,Y){function ye(){$t||($t=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",Y))}ye.isReactWarning=!0,Object.defineProperty(D,"key",{get:ye,configurable:!0})}function q(){var D=T(this.type);return Ha[D]||(Ha[D]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),D=this.props.ref,D!==void 0?D:null}function U(D,Y,ye,we,Pe,st,Ke,ft){return ye=st.ref,D={$$typeof:ke,type:D,key:Y,props:st,_owner:Pe},(ye!==void 0?ye:null)!==null?Object.defineProperty(D,"ref",{enumerable:!1,get:q}):Object.defineProperty(D,"ref",{enumerable:!1,value:null}),D._store={},Object.defineProperty(D._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(D,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(D,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:Ke}),Object.defineProperty(D,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:ft}),Object.freeze&&(Object.freeze(D.props),Object.freeze(D)),D}function G(D,Y){return Y=U(D.type,Y,void 0,void 0,D._owner,D.props,D._debugStack,D._debugTask),D._store&&(Y._store.validated=D._store.validated),Y}function $(D){return typeof D=="object"&&D!==null&&D.$$typeof===ke}function X(D){var Y={"=":"=0",":":"=2"};return"$"+D.replace(/[=:]/g,function(ye){return Y[ye]})}function Q(D,Y){return typeof D=="object"&&D!==null&&D.key!=null?(b(D.key),X(""+D.key)):Y.toString(36)}function ue(){}function Z(D){switch(D.status){case"fulfilled":return D.value;case"rejected":throw D.reason;default:switch(typeof D.status=="string"?D.then(ue,ue):(D.status="pending",D.then(function(Y){D.status==="pending"&&(D.status="fulfilled",D.value=Y)},function(Y){D.status==="pending"&&(D.status="rejected",D.reason=Y)})),D.status){case"fulfilled":return D.value;case"rejected":throw D.reason}}throw D}function K(D,Y,ye,we,Pe){var st=typeof D;(st==="undefined"||st==="boolean")&&(D=null);var Ke=!1;if(D===null)Ke=!0;else switch(st){case"bigint":case"string":case"number":Ke=!0;break;case"object":switch(D.$$typeof){case ke:case qe:Ke=!0;break;case Ne:return Ke=D._init,K(Ke(D._payload),Y,ye,we,Pe)}}if(Ke){Ke=D,Pe=Pe(Ke);var ft=we===""?"."+Q(Ke,0):we;return pt(Pe)?(ye="",ft!=null&&(ye=ft.replace(Br,"$&/")+"/"),K(Pe,Y,ye,"",function(si){return si})):Pe!=null&&($(Pe)&&(Pe.key!=null&&(Ke&&Ke.key===Pe.key||b(Pe.key)),ye=G(Pe,ye+(Pe.key==null||Ke&&Ke.key===Pe.key?"":(""+Pe.key).replace(Br,"$&/")+"/")+ft),we!==""&&Ke!=null&&$(Ke)&&Ke.key==null&&Ke._store&&!Ke._store.validated&&(ye._store.validated=2),Pe=ye),Y.push(Pe)),1}if(Ke=0,ft=we===""?".":we+":",pt(D))for(var Ze=0;Ze";if(typeof D=="object"&&D!==null&&D.$$typeof===ut)return"<...>";try{var X=S(D);return X?"<"+X+">":"<...>"}catch{return"<...>"}}function w(){var D=_e.A;return D===null?null:D.getOwner()}function R(){return Error("react-stack-top-frame")}function L(D){if(Ei.call(D,"key")){var X=Object.getOwnPropertyDescriptor(D,"key").get;if(X&&X.isReactWarning)return!1}return D.key!==void 0}function A(D,X){function ye(){$t||($t=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",X))}ye.isReactWarning=!0,Object.defineProperty(D,"key",{get:ye,configurable:!0})}function q(){var D=S(this.type);return Hr[D]||(Hr[D]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),D=this.props.ref,D!==void 0?D:null}function U(D,X,ye,Ee,Pe,Je,Ge,ct){return ye=Je.ref,D={$$typeof:Oe,type:D,key:X,props:Je,_owner:Pe},(ye!==void 0?ye:null)!==null?Object.defineProperty(D,"ref",{enumerable:!1,get:q}):Object.defineProperty(D,"ref",{enumerable:!1,value:null}),D._store={},Object.defineProperty(D._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(D,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(D,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:Ge}),Object.defineProperty(D,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:ct}),Object.freeze&&(Object.freeze(D.props),Object.freeze(D)),D}function G(D,X){return X=U(D.type,X,void 0,void 0,D._owner,D.props,D._debugStack,D._debugTask),D._store&&(X._store.validated=D._store.validated),X}function $(D){return typeof D=="object"&&D!==null&&D.$$typeof===Oe}function W(D){var X={"=":"=0",":":"=2"};return"$"+D.replace(/[=:]/g,function(ye){return X[ye]})}function K(D,X){return typeof D=="object"&&D!==null&&D.key!=null?(b(D.key),W(""+D.key)):X.toString(36)}function le(){}function Y(D){switch(D.status){case"fulfilled":return D.value;case"rejected":throw D.reason;default:switch(typeof D.status=="string"?D.then(le,le):(D.status="pending",D.then(function(X){D.status==="pending"&&(D.status="fulfilled",D.value=X)},function(X){D.status==="pending"&&(D.status="rejected",D.reason=X)})),D.status){case"fulfilled":return D.value;case"rejected":throw D.reason}}throw D}function J(D,X,ye,Ee,Pe){var Je=typeof D;(Je==="undefined"||Je==="boolean")&&(D=null);var Ge=!1;if(D===null)Ge=!0;else switch(Je){case"bigint":case"string":case"number":Ge=!0;break;case"object":switch(D.$$typeof){case Oe:case Be:Ge=!0;break;case ut:return Ge=D._init,J(Ge(D._payload),X,ye,Ee,Pe)}}if(Ge){Ge=D,Pe=Pe(Ge);var ct=Ee===""?"."+K(Ge,0):Ee;return dt(Pe)?(ye="",ct!=null&&(ye=ct.replace(Ba,"$&/")+"/"),J(Pe,X,ye,"",function(si){return si})):Pe!=null&&($(Pe)&&(Pe.key!=null&&(Ge&&Ge.key===Pe.key||b(Pe.key)),ye=G(Pe,ye+(Pe.key==null||Ge&&Ge.key===Pe.key?"":(""+Pe.key).replace(Ba,"$&/")+"/")+ct),Ee!==""&&Ge!=null&&$(Ge)&&Ge.key==null&&Ge._store&&!Ge._store.validated&&(ye._store.validated=2),Pe=ye),X.push(Pe)),1}if(Ge=0,ct=Ee===""?".":Ee+":",dt(D))for(var Ye=0;Ye import('./MyComponent')) -Did you accidentally put curly braces around the import?`,Y),"default"in Y||console.error(`lazy: Expected the result of a dynamic import() call. Instead received: %s +Did you accidentally put curly braces around the import?`,X),"default"in X||console.error(`lazy: Expected the result of a dynamic import() call. Instead received: %s Your code should look like: - const MyComponent = lazy(() => import('./MyComponent'))`,Y),Y.default;throw D._result}function fe(){var D=xe.H;return D===null&&console.error(`Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons: + const MyComponent = lazy(() => import('./MyComponent'))`,X),X.default;throw D._result}function he(){var D=_e.H;return D===null&&console.error(`Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons: 1. You might have mismatching versions of React and the renderer (such as React DOM) 2. You might be breaking the Rules of Hooks 3. You might have more than one copy of React in the same app -See https://react.dev/link/invalid-hook-call for tips about how to debug and fix this problem.`),D}function pe(){}function de(D){if(yt===null)try{var Y=("require"+Math.random()).slice(0,7);yt=(s&&s[Y]).call(s,"timers").setImmediate}catch{yt=function(we){Ur===!1&&(Ur=!0,typeof MessageChannel>"u"&&console.error("This browser does not have a MessageChannel implementation, so enqueuing tasks via await act(async () => ...) will fail. Please file an issue at https://github.com/facebook/react/issues if you encounter this warning."));var Pe=new MessageChannel;Pe.port1.onmessage=we,Pe.port2.postMessage(void 0)}}return yt(D)}function De(D){return 1 ...) without await. This could lead to unexpected testing behaviour, interleaving multiple act calls and mixing their scopes. You should - await act(async () => ...);"))}),{then:function(Ze,si){Pe=!0,Ke.then(function(ws){if(je(Y,ye),ye===0){try{Ae(we),de(function(){return ae(ws,Ze,si)})}catch(Ud){xe.thrownErrors.push(Ud)}if(0 ...)"))}),xe.actQueue=null),0xe.recentlyCreatedOwnerStacks++;return U(D,Pe,void 0,void 0,w(),we,Ze?Error("react-stack-top-frame"):Pr,Ze?ci(x(D)):ea)},e.createRef=function(){var D={current:null};return Object.seal(D),D},e.forwardRef=function(D){D!=null&&D.$$typeof===_e?console.error("forwardRef requires a render function but received a `memo` component. Instead of forwardRef(memo(...)), use memo(forwardRef(...))."):typeof D!="function"?console.error("forwardRef requires a render function but was given %s.",D===null?"null":typeof D):D.length!==0&&D.length!==2&&console.error("forwardRef render functions accept exactly two parameters: props and ref. %s",D.length===1?"Did you forget to use the ref parameter?":"Any additional parameter will be undefined."),D!=null&&D.defaultProps!=null&&console.error("forwardRef render functions do not support defaultProps. Did you accidentally pass a React component?");var Y={$$typeof:Fe,render:D},ye;return Object.defineProperty(Y,"displayName",{enumerable:!1,configurable:!0,get:function(){return ye},set:function(we){ye=we,D.name||D.displayName||(Object.defineProperty(D,"name",{value:we}),D.displayName=we)}}),Y},e.isValidElement=$,e.lazy=function(D){return{$$typeof:Ne,_payload:{_status:-1,_result:D},_init:ve}},e.memo=function(D,Y){D==null&&console.error("memo: The first argument must be a component. Instead received: %s",D===null?"null":typeof D),Y={$$typeof:_e,type:D,compare:Y===void 0?null:Y};var ye;return Object.defineProperty(Y,"displayName",{enumerable:!1,configurable:!0,get:function(){return ye},set:function(we){ye=we,D.name||D.displayName||(Object.defineProperty(D,"name",{value:we}),D.displayName=we)}}),Y},e.startTransition=function(D){var Y=xe.T,ye={};xe.T=ye,ye._updatedFibers=new Set;try{var we=D(),Pe=xe.S;Pe!==null&&Pe(ye,we),typeof we=="object"&&we!==null&&typeof we.then=="function"&&we.then(pe,za)}catch(st){za(st)}finally{Y===null&&ye._updatedFibers&&(D=ye._updatedFibers.size,ye._updatedFibers.clear(),10"u"&&console.error("This browser does not have a MessageChannel implementation, so enqueuing tasks via await act(async () => ...) will fail. Please file an issue at https://github.com/facebook/react/issues if you encounter this warning."));var Pe=new MessageChannel;Pe.port1.onmessage=Ee,Pe.port2.postMessage(void 0)}}return gt(D)}function fe(D){return 1 ...) without await. This could lead to unexpected testing behaviour, interleaving multiple act calls and mixing their scopes. You should - await act(async () => ...);"))}),{then:function(Ye,si){Pe=!0,Ge.then(function(ws){if(He(X,ye),ye===0){try{Ce(Ee),me(function(){return ce(ws,Ye,si)})}catch(Ud){_e.thrownErrors.push(Ud)}if(0<_e.thrownErrors.length){var Bd=fe(_e.thrownErrors);_e.thrownErrors.length=0,si(Bd)}}else Ye(ws)},function(ws){He(X,ye),0<_e.thrownErrors.length&&(ws=fe(_e.thrownErrors),_e.thrownErrors.length=0),si(ws)})}}}var ct=Je;if(He(X,ye),ye===0&&(Ce(Ee),Ee.length!==0&&ir(function(){Pe||Wi||(Wi=!0,console.error("A component suspended inside an `act` scope, but the `act` call was not awaited. When testing React components that depend on asynchronous data, you must await the result:\n\nawait act(() => ...)"))}),_e.actQueue=null),0<_e.thrownErrors.length)throw D=fe(_e.thrownErrors),_e.thrownErrors.length=0,D;return{then:function(Ye,si){Pe=!0,ye===0?(_e.actQueue=Ee,me(function(){return ce(ct,Ye,si)})):Ye(ct)}}},e.cache=function(D){return function(){return D.apply(null,arguments)}},e.captureOwnerStack=function(){var D=_e.getCurrentStack;return D===null?null:D()},e.cloneElement=function(D,X,ye){if(D==null)throw Error("The argument must be a React element, but you passed "+D+".");var Ee=Vt({},D.props),Pe=D.key,Je=D._owner;if(X!=null){var Ge;e:{if(Ei.call(X,"ref")&&(Ge=Object.getOwnPropertyDescriptor(X,"ref").get)&&Ge.isReactWarning){Ge=!1;break e}Ge=X.ref!==void 0}Ge&&(Je=w()),L(X)&&(b(X.key),Pe=""+X.key);for(ct in X)!Ei.call(X,ct)||ct==="key"||ct==="__self"||ct==="__source"||ct==="ref"&&X.ref===void 0||(Ee[ct]=X[ct])}var ct=arguments.length-2;if(ct===1)Ee.children=ye;else if(1_e.recentlyCreatedOwnerStacks++;return U(D,Pe,void 0,void 0,w(),Ee,Ye?Error("react-stack-top-frame"):Pa,Ye?ci(x(D)):er)},e.createRef=function(){var D={current:null};return Object.seal(D),D},e.forwardRef=function(D){D!=null&&D.$$typeof===ke?console.error("forwardRef requires a render function but received a `memo` component. Instead of forwardRef(memo(...)), use memo(forwardRef(...))."):typeof D!="function"?console.error("forwardRef requires a render function but was given %s.",D===null?"null":typeof D):D.length!==0&&D.length!==2&&console.error("forwardRef render functions accept exactly two parameters: props and ref. %s",D.length===1?"Did you forget to use the ref parameter?":"Any additional parameter will be undefined."),D!=null&&D.defaultProps!=null&&console.error("forwardRef render functions do not support defaultProps. Did you accidentally pass a React component?");var X={$$typeof:ht,render:D},ye;return Object.defineProperty(X,"displayName",{enumerable:!1,configurable:!0,get:function(){return ye},set:function(Ee){ye=Ee,D.name||D.displayName||(Object.defineProperty(D,"name",{value:Ee}),D.displayName=Ee)}}),X},e.isValidElement=$,e.lazy=function(D){return{$$typeof:ut,_payload:{_status:-1,_result:D},_init:xe}},e.memo=function(D,X){D==null&&console.error("memo: The first argument must be a component. Instead received: %s",D===null?"null":typeof D),X={$$typeof:ke,type:D,compare:X===void 0?null:X};var ye;return Object.defineProperty(X,"displayName",{enumerable:!1,configurable:!0,get:function(){return ye},set:function(Ee){ye=Ee,D.name||D.displayName||(Object.defineProperty(D,"name",{value:Ee}),D.displayName=Ee)}}),X},e.startTransition=function(D){var X=_e.T,ye={};_e.T=ye,ye._updatedFibers=new Set;try{var Ee=D(),Pe=_e.S;Pe!==null&&Pe(ye,Ee),typeof Ee=="object"&&Ee!==null&&typeof Ee.then=="function"&&Ee.then(be,zr)}catch(Je){zr(Je)}finally{X===null&&ye._updatedFibers&&(D=ye._updatedFibers.size,ye._updatedFibers.clear(),10";if(typeof oe=="object"&&oe!==null&&oe.$$typeof===K)return"<...>";try{var Te=s(oe);return Te?"<"+Te+">":"<...>"}catch{return"<...>"}}function o(){var oe=fe.A;return oe===null?null:oe.getOwner()}function u(){return Error("react-stack-top-frame")}function c(oe){if(pe.call(oe,"key")){var Te=Object.getOwnPropertyDescriptor(oe,"key").get;if(Te&&Te.isReactWarning)return!1}return oe.key!==void 0}function h(oe,Te){function Se(){je||(je=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",Te))}Se.isReactWarning=!0,Object.defineProperty(oe,"key",{get:Se,configurable:!0})}function m(){var oe=s(this.type);return ae[oe]||(ae[oe]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),oe=this.props.ref,oe!==void 0?oe:null}function b(oe,Te,Se,ze,We,Fe,Qe,be){return Se=Fe.ref,oe={$$typeof:R,type:oe,key:Te,props:Fe,_owner:We},(Se!==void 0?Se:null)!==null?Object.defineProperty(oe,"ref",{enumerable:!1,get:m}):Object.defineProperty(oe,"ref",{enumerable:!1,value:null}),oe._store={},Object.defineProperty(oe._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(oe,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(oe,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:Qe}),Object.defineProperty(oe,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:be}),Object.freeze&&(Object.freeze(oe.props),Object.freeze(oe)),oe}function T(oe,Te,Se,ze,We,Fe,Qe,be){var _e=Te.children;if(_e!==void 0)if(ze)if(de(_e)){for(ze=0;ze<_e.length;ze++)x(_e[ze]);Object.freeze&&Object.freeze(_e)}else console.error("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.");else x(_e);if(pe.call(Te,"key")){_e=s(oe);var Ne=Object.keys(Te).filter(function(He){return He!=="key"});ze=0";if(typeof ee=="object"&&ee!==null&&ee.$$typeof===J)return"<...>";try{var we=s(ee);return we?"<"+we+">":"<...>"}catch{return"<...>"}}function o(){var ee=he.A;return ee===null?null:ee.getOwner()}function u(){return Error("react-stack-top-frame")}function c(ee){if(be.call(ee,"key")){var we=Object.getOwnPropertyDescriptor(ee,"key").get;if(we&&we.isReactWarning)return!1}return ee.key!==void 0}function f(ee,we){function ve(){He||(He=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",we))}ve.isReactWarning=!0,Object.defineProperty(ee,"key",{get:ve,configurable:!0})}function m(){var ee=s(this.type);return ce[ee]||(ce[ee]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),ee=this.props.ref,ee!==void 0?ee:null}function b(ee,we,ve,Re,Ue,ht,at,Ne){return ve=ht.ref,ee={$$typeof:R,type:ee,key:we,props:ht,_owner:Ue},(ve!==void 0?ve:null)!==null?Object.defineProperty(ee,"ref",{enumerable:!1,get:m}):Object.defineProperty(ee,"ref",{enumerable:!1,value:null}),ee._store={},Object.defineProperty(ee._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(ee,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(ee,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:at}),Object.defineProperty(ee,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:Ne}),Object.freeze&&(Object.freeze(ee.props),Object.freeze(ee)),ee}function S(ee,we,ve,Re,Ue,ht,at,Ne){var ke=we.children;if(ke!==void 0)if(Re)if(me(ke)){for(Re=0;Re React keys must be passed directly to JSX without using spread: let props = %s; - <%s key={someKey} {...props} />`,ze,_e,Ne,_e),qe[_e+ze]=!0)}if(_e=null,Se!==void 0&&(i(Se),_e=""+Se),c(Te)&&(i(Te.key),_e=""+Te.key),"key"in Te){Se={};for(var Ge in Te)Ge!=="key"&&(Se[Ge]=Te[Ge])}else Se=Te;return _e&&h(Se,typeof oe=="function"?oe.displayName||oe.name||"Unknown":oe),b(oe,_e,Fe,We,o(),Se,Qe,be)}function x(oe){typeof oe=="object"&&oe!==null&&oe.$$typeof===R&&oe._store&&(oe._store.validated=1)}var w=Ri,R=Symbol.for("react.transitional.element"),L=Symbol.for("react.portal"),A=Symbol.for("react.fragment"),q=Symbol.for("react.strict_mode"),U=Symbol.for("react.profiler"),G=Symbol.for("react.consumer"),$=Symbol.for("react.context"),X=Symbol.for("react.forward_ref"),Q=Symbol.for("react.suspense"),ue=Symbol.for("react.suspense_list"),Z=Symbol.for("react.memo"),K=Symbol.for("react.lazy"),ee=Symbol.for("react.activity"),ve=Symbol.for("react.client.reference"),fe=w.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,pe=Object.prototype.hasOwnProperty,de=Array.isArray,De=console.createTask?console.createTask:function(){return null};w={"react-stack-bottom-frame":function(oe){return oe()}};var je,ae={},Ae=w["react-stack-bottom-frame"].bind(w,u)(),ke=De(a(u)),qe={};Wc.Fragment=A,Wc.jsx=function(oe,Te,Se,ze,We){var Fe=1e4>fe.recentlyCreatedOwnerStacks++;return T(oe,Te,Se,!1,ze,We,Fe?Error("react-stack-top-frame"):Ae,Fe?De(a(oe)):ke)},Wc.jsxs=function(oe,Te,Se,ze,We){var Fe=1e4>fe.recentlyCreatedOwnerStacks++;return T(oe,Te,Se,!0,ze,We,Fe?Error("react-stack-top-frame"):Ae,Fe?De(a(oe)):ke)}}()),Wc}A_.exports=RD();var Fl=A_.exports,R_={exports:{}},Ng={exports:{}},Pg={};/** + <%s key={someKey} {...props} />`,Re,ke,ut,ke),Be[ke+Re]=!0)}if(ke=null,ve!==void 0&&(i(ve),ke=""+ve),c(we)&&(i(we.key),ke=""+we.key),"key"in we){ve={};for(var ft in we)ft!=="key"&&(ve[ft]=we[ft])}else ve=we;return ke&&f(ve,typeof ee=="function"?ee.displayName||ee.name||"Unknown":ee),b(ee,ke,ht,Ue,o(),ve,at,Ne)}function x(ee){typeof ee=="object"&&ee!==null&&ee.$$typeof===R&&ee._store&&(ee._store.validated=1)}var w=Ri,R=Symbol.for("react.transitional.element"),L=Symbol.for("react.portal"),A=Symbol.for("react.fragment"),q=Symbol.for("react.strict_mode"),U=Symbol.for("react.profiler"),G=Symbol.for("react.consumer"),$=Symbol.for("react.context"),W=Symbol.for("react.forward_ref"),K=Symbol.for("react.suspense"),le=Symbol.for("react.suspense_list"),Y=Symbol.for("react.memo"),J=Symbol.for("react.lazy"),te=Symbol.for("react.activity"),xe=Symbol.for("react.client.reference"),he=w.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,be=Object.prototype.hasOwnProperty,me=Array.isArray,fe=console.createTask?console.createTask:function(){return null};w={"react-stack-bottom-frame":function(ee){return ee()}};var He,ce={},Ce=w["react-stack-bottom-frame"].bind(w,u)(),Oe=fe(r(u)),Be={};Wc.Fragment=A,Wc.jsx=function(ee,we,ve,Re,Ue){var ht=1e4>he.recentlyCreatedOwnerStacks++;return S(ee,we,ve,!1,Re,Ue,ht?Error("react-stack-top-frame"):Ce,ht?fe(r(ee)):Oe)},Wc.jsxs=function(ee,we,ve,Re,Ue){var ht=1e4>he.recentlyCreatedOwnerStacks++;return S(ee,we,ve,!0,Re,Ue,ht?Error("react-stack-top-frame"):Ce,ht?fe(r(ee)):Oe)}}()),Wc}A_.exports=RD();var Fl=A_.exports,R_={exports:{}},Ng={exports:{}},Pg={};/** * @license React * scheduler.development.js * @@ -39,7 +39,7 @@ React keys must be passed directly to JSX without using spread: * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var M_;function MD(){return M_||(M_=1,function(s){(function(){function e(){if(Q=!1,ee){var ae=s.unstable_now();pe=ae;var Ae=!0;try{e:{$=!1,X&&(X=!1,Z(ve),ve=-1),G=!0;var ke=U;try{t:{for(c(ae),q=a(R);q!==null&&!(q.expirationTime>ae&&m());){var qe=q.callback;if(typeof qe=="function"){q.callback=null,U=q.priorityLevel;var oe=qe(q.expirationTime<=ae);if(ae=s.unstable_now(),typeof oe=="function"){q.callback=oe,c(ae),Ae=!0;break t}q===a(R)&&o(R),c(ae)}else o(R);q=a(R)}if(q!==null)Ae=!0;else{var Te=a(L);Te!==null&&b(h,Te.startTime-ae),Ae=!1}}break e}finally{q=null,U=ke,G=!1}Ae=void 0}}finally{Ae?de():ee=!1}}}function i(ae,Ae){var ke=ae.length;ae.push(Ae);e:for(;0>>1,oe=ae[qe];if(0>>1;qeu(ze,ke))Weu(Fe,ze)?(ae[qe]=Fe,ae[We]=ke,qe=We):(ae[qe]=ze,ae[Se]=ke,qe=Se);else if(Weu(Fe,ke))ae[qe]=Fe,ae[We]=ke,qe=We;else break e}}return Ae}function u(ae,Ae){var ke=ae.sortIndex-Ae.sortIndex;return ke!==0?ke:ae.id-Ae.id}function c(ae){for(var Ae=a(L);Ae!==null;){if(Ae.callback===null)o(L);else if(Ae.startTime<=ae)o(L),Ae.sortIndex=Ae.expirationTime,i(R,Ae);else break;Ae=a(L)}}function h(ae){if(X=!1,c(ae),!$)if(a(R)!==null)$=!0,ee||(ee=!0,de());else{var Ae=a(L);Ae!==null&&b(h,Ae.startTime-ae)}}function m(){return Q?!0:!(s.unstable_now()-peae||125qe?(ae.sortIndex=ke,i(L,ae),a(R)===null&&ae===a(L)&&(X?(Z(ve),ve=-1):X=!0,b(h,ke-qe))):(ae.sortIndex=oe,i(R,ae),$||G||($=!0,ee||(ee=!0,de()))),ae},s.unstable_shouldYield=m,s.unstable_wrapCallback=function(ae){var Ae=U;return function(){var ke=U;U=Ae;try{return ae.apply(this,arguments)}finally{U=ke}}},typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())})()}(Pg)),Pg}var L_;function LD(){return L_||(L_=1,Ng.exports=MD()),Ng.exports}var Bg={exports:{}},Vi={};/** + */var M_;function MD(){return M_||(M_=1,function(s){(function(){function e(){if(K=!1,te){var ce=s.unstable_now();be=ce;var Ce=!0;try{e:{$=!1,W&&(W=!1,Y(xe),xe=-1),G=!0;var Oe=U;try{t:{for(c(ce),q=r(R);q!==null&&!(q.expirationTime>ce&&m());){var Be=q.callback;if(typeof Be=="function"){q.callback=null,U=q.priorityLevel;var ee=Be(q.expirationTime<=ce);if(ce=s.unstable_now(),typeof ee=="function"){q.callback=ee,c(ce),Ce=!0;break t}q===r(R)&&o(R),c(ce)}else o(R);q=r(R)}if(q!==null)Ce=!0;else{var we=r(L);we!==null&&b(f,we.startTime-ce),Ce=!1}}break e}finally{q=null,U=Oe,G=!1}Ce=void 0}}finally{Ce?me():te=!1}}}function i(ce,Ce){var Oe=ce.length;ce.push(Ce);e:for(;0>>1,ee=ce[Be];if(0>>1;Beu(Re,Oe))Ueu(ht,Re)?(ce[Be]=ht,ce[Ue]=Oe,Be=Ue):(ce[Be]=Re,ce[ve]=Oe,Be=ve);else if(Ueu(ht,Oe))ce[Be]=ht,ce[Ue]=Oe,Be=Ue;else break e}}return Ce}function u(ce,Ce){var Oe=ce.sortIndex-Ce.sortIndex;return Oe!==0?Oe:ce.id-Ce.id}function c(ce){for(var Ce=r(L);Ce!==null;){if(Ce.callback===null)o(L);else if(Ce.startTime<=ce)o(L),Ce.sortIndex=Ce.expirationTime,i(R,Ce);else break;Ce=r(L)}}function f(ce){if(W=!1,c(ce),!$)if(r(R)!==null)$=!0,te||(te=!0,me());else{var Ce=r(L);Ce!==null&&b(f,Ce.startTime-ce)}}function m(){return K?!0:!(s.unstable_now()-bece||125Be?(ce.sortIndex=Oe,i(L,ce),r(R)===null&&ce===r(L)&&(W?(Y(xe),xe=-1):W=!0,b(f,Oe-Be))):(ce.sortIndex=ee,i(R,ce),$||G||($=!0,te||(te=!0,me()))),ce},s.unstable_shouldYield=m,s.unstable_wrapCallback=function(ce){var Ce=U;return function(){var Oe=U;U=Ce;try{return ce.apply(this,arguments)}finally{U=Oe}}},typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())})()}(Pg)),Pg}var L_;function LD(){return L_||(L_=1,Ng.exports=MD()),Ng.exports}var Bg={exports:{}},Vi={};/** * @license React * react-dom.development.js * @@ -47,11 +47,11 @@ React keys must be passed directly to JSX without using spread: * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var I_;function ID(){return I_||(I_=1,function(){function s(){}function e(x){return""+x}function i(x,w,R){var L=3` tag.%s',R),typeof x=="string"&&typeof w=="object"&&w!==null&&typeof w.as=="string"){R=w.as;var L=a(R,w.crossOrigin);m.d.L(x,R,{crossOrigin:L,integrity:typeof w.integrity=="string"?w.integrity:void 0,nonce:typeof w.nonce=="string"?w.nonce:void 0,type:typeof w.type=="string"?w.type:void 0,fetchPriority:typeof w.fetchPriority=="string"?w.fetchPriority:void 0,referrerPolicy:typeof w.referrerPolicy=="string"?w.referrerPolicy:void 0,imageSrcSet:typeof w.imageSrcSet=="string"?w.imageSrcSet:void 0,imageSizes:typeof w.imageSizes=="string"?w.imageSizes:void 0,media:typeof w.media=="string"?w.media:void 0})}},Vi.preloadModule=function(x,w){var R="";typeof x=="string"&&x||(R+=" The `href` argument encountered was "+o(x)+"."),w!==void 0&&typeof w!="object"?R+=" The `options` argument encountered was "+o(w)+".":w&&"as"in w&&typeof w.as!="string"&&(R+=" The `as` option encountered was "+o(w.as)+"."),R&&console.error('ReactDOM.preloadModule(): Expected two arguments, a non-empty `href` string and, optionally, an `options` object with an `as` property valid for a `` tag.%s',R),typeof x=="string"&&(w?(R=a(w.as,w.crossOrigin),m.d.m(x,{as:typeof w.as=="string"&&w.as!=="script"?w.as:void 0,crossOrigin:R,integrity:typeof w.integrity=="string"?w.integrity:void 0})):m.d.m(x))},Vi.requestFormReset=function(x){m.d.r(x)},Vi.unstable_batchedUpdates=function(x,w){return x(w)},Vi.useFormState=function(x,w,R){return c().useFormState(x,w,R)},Vi.useFormStatus=function(){return c().useHostTransitionStatus()},Vi.version="19.1.0",typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())}()),Vi}var N_;function ND(){return N_||(N_=1,Bg.exports=ID()),Bg.exports}var Kc={};/** +See https://react.dev/link/invalid-hook-call for tips about how to debug and fix this problem.`),x}typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());var f=Ri,m={d:{f:s,r:function(){throw Error("Invalid form element. requestFormReset must be passed a form that was rendered by React.")},D:s,C:s,L:s,m:s,X:s,S:s,M:s},p:0,findDOMNode:null},b=Symbol.for("react.portal"),S=f.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;typeof Map=="function"&&Map.prototype!=null&&typeof Map.prototype.forEach=="function"&&typeof Set=="function"&&Set.prototype!=null&&typeof Set.prototype.clear=="function"&&typeof Set.prototype.forEach=="function"||console.error("React depends on Map and Set built-in types. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills"),Vi.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=m,Vi.createPortal=function(x,w){var R=2` tag.%s',R),typeof x=="string"&&typeof w=="object"&&w!==null&&typeof w.as=="string"){R=w.as;var L=r(R,w.crossOrigin);m.d.L(x,R,{crossOrigin:L,integrity:typeof w.integrity=="string"?w.integrity:void 0,nonce:typeof w.nonce=="string"?w.nonce:void 0,type:typeof w.type=="string"?w.type:void 0,fetchPriority:typeof w.fetchPriority=="string"?w.fetchPriority:void 0,referrerPolicy:typeof w.referrerPolicy=="string"?w.referrerPolicy:void 0,imageSrcSet:typeof w.imageSrcSet=="string"?w.imageSrcSet:void 0,imageSizes:typeof w.imageSizes=="string"?w.imageSizes:void 0,media:typeof w.media=="string"?w.media:void 0})}},Vi.preloadModule=function(x,w){var R="";typeof x=="string"&&x||(R+=" The `href` argument encountered was "+o(x)+"."),w!==void 0&&typeof w!="object"?R+=" The `options` argument encountered was "+o(w)+".":w&&"as"in w&&typeof w.as!="string"&&(R+=" The `as` option encountered was "+o(w.as)+"."),R&&console.error('ReactDOM.preloadModule(): Expected two arguments, a non-empty `href` string and, optionally, an `options` object with an `as` property valid for a `` tag.%s',R),typeof x=="string"&&(w?(R=r(w.as,w.crossOrigin),m.d.m(x,{as:typeof w.as=="string"&&w.as!=="script"?w.as:void 0,crossOrigin:R,integrity:typeof w.integrity=="string"?w.integrity:void 0})):m.d.m(x))},Vi.requestFormReset=function(x){m.d.r(x)},Vi.unstable_batchedUpdates=function(x,w){return x(w)},Vi.useFormState=function(x,w,R){return c().useFormState(x,w,R)},Vi.useFormStatus=function(){return c().useHostTransitionStatus()},Vi.version="19.1.0",typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())}()),Vi}var N_;function ND(){return N_||(N_=1,Bg.exports=ID()),Bg.exports}var Kc={};/** * @license React * react-dom-client.development.js * @@ -59,61 +59,61 @@ See https://react.dev/link/invalid-hook-call for tips about how to debug and fix * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var P_;function PD(){return P_||(P_=1,function(){function s(t,n){for(t=t.memoizedState;t!==null&&0=n.length)return l;var d=n[r],p=Fi(t)?t.slice():ot({},t);return p[d]=e(t[d],n,r+1,l),p}function i(t,n,r){if(n.length!==r.length)console.warn("copyWithRename() expects paths of the same length");else{for(var l=0;lcr?console.error("Unexpected pop."):(n!==db[cr]&&console.error("Unexpected Fiber popped."),t.current=cb[cr],cb[cr]=null,db[cr]=null,cr--)}function pe(t,n,r){cr++,cb[cr]=t.current,db[cr]=r,t.current=n}function de(t){return t===null&&console.error("Expected host context to exist. This error is likely caused by a bug in React. Please file an issue."),t}function De(t,n){pe(oo,n,t),pe(Vh,t,t),pe(ro,null,t);var r=n.nodeType;switch(r){case 9:case 11:r=r===9?"#document":"#fragment",n=(n=n.documentElement)&&(n=n.namespaceURI)?wC(n):Sr;break;default:if(r=n.tagName,n=n.namespaceURI)n=wC(n),n=AC(n,r);else switch(r){case"svg":n=Gc;break;case"math":n=Dg;break;default:n=Sr}}r=r.toLowerCase(),r=Cn(null,r),r={context:n,ancestorInfo:r},fe(ro,t),pe(ro,r,t)}function je(t){fe(ro,t),fe(Vh,t),fe(oo,t)}function ae(){return de(ro.current)}function Ae(t){t.memoizedState!==null&&pe(zm,t,t);var n=de(ro.current),r=t.type,l=AC(n.context,r);r=Cn(n.ancestorInfo,r),l={context:l,ancestorInfo:r},n!==l&&(pe(Vh,t,t),pe(ro,l,t))}function ke(t){Vh.current===t&&(fe(ro,t),fe(Vh,t)),zm.current===t&&(fe(zm,t),kf._currentValue=ql)}function qe(t){return typeof Symbol=="function"&&Symbol.toStringTag&&t[Symbol.toStringTag]||t.constructor.name||"Object"}function oe(t){try{return Te(t),!1}catch{return!0}}function Te(t){return""+t}function Se(t,n){if(oe(t))return console.error("The provided `%s` attribute is an unsupported type %s. This value must be coerced to a string before using it here.",n,qe(t)),Te(t)}function ze(t,n){if(oe(t))return console.error("The provided `%s` CSS property is an unsupported type %s. This value must be coerced to a string before using it here.",n,qe(t)),Te(t)}function We(t){if(oe(t))return console.error("Form field values (value, checked, defaultValue, or defaultChecked props) must be strings, not %s. This value must be coerced to a string before using it here.",qe(t)),Te(t)}function Fe(t){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u")return!1;var n=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(n.isDisabled)return!0;if(!n.supportsFiber)return console.error("The installed version of React DevTools is too old and will not work with the current version of React. Please update React DevTools. https://react.dev/link/react-devtools"),!0;try{fc=n.inject(t),Ki=n}catch(r){console.error("React instrumentation encountered an error: %s.",r)}return!!n.checkDCE}function Qe(t){if(typeof dL=="function"&&hL(t),Ki&&typeof Ki.setStrictMode=="function")try{Ki.setStrictMode(fc,t)}catch(n){Ea||(Ea=!0,console.error("React instrumentation encountered an error: %s",n))}}function be(t){Oe=t}function _e(){Oe!==null&&typeof Oe.markCommitStopped=="function"&&Oe.markCommitStopped()}function Ne(t){Oe!==null&&typeof Oe.markComponentRenderStarted=="function"&&Oe.markComponentRenderStarted(t)}function Ge(){Oe!==null&&typeof Oe.markComponentRenderStopped=="function"&&Oe.markComponentRenderStopped()}function He(t){Oe!==null&&typeof Oe.markRenderStarted=="function"&&Oe.markRenderStarted(t)}function it(){Oe!==null&&typeof Oe.markRenderStopped=="function"&&Oe.markRenderStopped()}function gt(t,n){Oe!==null&&typeof Oe.markStateUpdateScheduled=="function"&&Oe.markStateUpdateScheduled(t,n)}function Vt(t){return t>>>=0,t===0?32:31-(fL(t)/pL|0)|0}function Sn(t){if(t&1)return"SyncHydrationLane";if(t&2)return"Sync";if(t&4)return"InputContinuousHydration";if(t&8)return"InputContinuous";if(t&16)return"DefaultHydration";if(t&32)return"Default";if(t&128)return"TransitionHydration";if(t&4194048)return"Transition";if(t&62914560)return"Retry";if(t&67108864)return"SelectiveHydration";if(t&134217728)return"IdleHydration";if(t&268435456)return"Idle";if(t&536870912)return"Offscreen";if(t&1073741824)return"Deferred"}function kt(t){var n=t&42;if(n!==0)return n;switch(t&-t){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t&4194048;case 4194304:case 8388608:case 16777216:case 33554432:return t&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return console.error("Should have found matching lanes. This is a bug in React."),t}}function Ot(t,n,r){var l=t.pendingLanes;if(l===0)return 0;var d=0,p=t.suspendedLanes,S=t.pingedLanes;t=t.warmLanes;var C=l&134217727;return C!==0?(l=C&~p,l!==0?d=kt(l):(S&=C,S!==0?d=kt(S):r||(r=C&~t,r!==0&&(d=kt(r))))):(C=l&~p,C!==0?d=kt(C):S!==0?d=kt(S):r||(r=l&~t,r!==0&&(d=kt(r)))),d===0?0:n!==0&&n!==d&&!(n&p)&&(p=d&-d,r=n&-n,p>=r||p===32&&(r&4194048)!==0)?n:d}function pt(t,n){return(t.pendingLanes&~(t.suspendedLanes&~t.pingedLanes)&n)===0}function xn(t,n){switch(t){case 1:case 2:case 4:case 8:case 64:return n+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return n+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return console.error("Should have found matching lanes. This is a bug in React."),-1}}function xe(){var t=Vm;return Vm<<=1,!(Vm&4194048)&&(Vm=256),t}function Ei(){var t=$m;return $m<<=1,!($m&62914560)&&($m=4194304),t}function ci(t){for(var n=[],r=0;31>r;r++)n.push(t);return n}function $t(t,n){t.pendingLanes|=n,n!==268435456&&(t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0)}function Ci(t,n,r,l,d,p){var S=t.pendingLanes;t.pendingLanes=r,t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0,t.expiredLanes&=r,t.entangledLanes&=r,t.errorRecoveryDisabledLanes&=r,t.shellSuspendCounter=0;var C=t.entanglements,O=t.expirationTimes,I=t.hiddenUpdates;for(r=S&~r;0Gh&&console.error("disabledDepth fell below zero. This is a bug in React. Please file an issue.")}function En(t){if(vb===void 0)try{throw Error()}catch(r){var n=r.stack.trim().match(/\n( *(at )?)/);vb=n&&n[1]||"",cw=-1)":-1S||I[p]!==J[S]){var se=` -`+I[p].replace(" at new "," at ");return t.displayName&&se.includes("")&&(se=se.replace("",t.displayName)),typeof t=="function"&&_b.set(t,se),se}while(1<=p&&0<=S);break}}}finally{bb=!1,ne.H=l,Ud(),Error.prepareStackTrace=r}return I=(I=t?t.displayName||t.name:"")?En(I):"",typeof t=="function"&&_b.set(t,I),I}function Fd(t){var n=Error.prepareStackTrace;if(Error.prepareStackTrace=void 0,t=t.stack,Error.prepareStackTrace=n,t.startsWith(`Error: react-stack-top-frame + */var P_;function PD(){return P_||(P_=1,function(){function s(t,n){for(t=t.memoizedState;t!==null&&0=n.length)return l;var d=n[a],p=Fi(t)?t.slice():it({},t);return p[d]=e(t[d],n,a+1,l),p}function i(t,n,a){if(n.length!==a.length)console.warn("copyWithRename() expects paths of the same length");else{for(var l=0;lca?console.error("Unexpected pop."):(n!==db[ca]&&console.error("Unexpected Fiber popped."),t.current=cb[ca],cb[ca]=null,db[ca]=null,ca--)}function be(t,n,a){ca++,cb[ca]=t.current,db[ca]=a,t.current=n}function me(t){return t===null&&console.error("Expected host context to exist. This error is likely caused by a bug in React. Please file an issue."),t}function fe(t,n){be(oo,n,t),be(Vh,t,t),be(ao,null,t);var a=n.nodeType;switch(a){case 9:case 11:a=a===9?"#document":"#fragment",n=(n=n.documentElement)&&(n=n.namespaceURI)?wC(n):Sa;break;default:if(a=n.tagName,n=n.namespaceURI)n=wC(n),n=AC(n,a);else switch(a){case"svg":n=Gc;break;case"math":n=Dg;break;default:n=Sa}}a=a.toLowerCase(),a=Cn(null,a),a={context:n,ancestorInfo:a},he(ao,t),be(ao,a,t)}function He(t){he(ao,t),he(Vh,t),he(oo,t)}function ce(){return me(ao.current)}function Ce(t){t.memoizedState!==null&&be(zm,t,t);var n=me(ao.current),a=t.type,l=AC(n.context,a);a=Cn(n.ancestorInfo,a),l={context:l,ancestorInfo:a},n!==l&&(be(Vh,t,t),be(ao,l,t))}function Oe(t){Vh.current===t&&(he(ao,t),he(Vh,t)),zm.current===t&&(he(zm,t),kf._currentValue=ql)}function Be(t){return typeof Symbol=="function"&&Symbol.toStringTag&&t[Symbol.toStringTag]||t.constructor.name||"Object"}function ee(t){try{return we(t),!1}catch{return!0}}function we(t){return""+t}function ve(t,n){if(ee(t))return console.error("The provided `%s` attribute is an unsupported type %s. This value must be coerced to a string before using it here.",n,Be(t)),we(t)}function Re(t,n){if(ee(t))return console.error("The provided `%s` CSS property is an unsupported type %s. This value must be coerced to a string before using it here.",n,Be(t)),we(t)}function Ue(t){if(ee(t))return console.error("Form field values (value, checked, defaultValue, or defaultChecked props) must be strings, not %s. This value must be coerced to a string before using it here.",Be(t)),we(t)}function ht(t){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u")return!1;var n=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(n.isDisabled)return!0;if(!n.supportsFiber)return console.error("The installed version of React DevTools is too old and will not work with the current version of React. Please update React DevTools. https://react.dev/link/react-devtools"),!0;try{fc=n.inject(t),Ki=n}catch(a){console.error("React instrumentation encountered an error: %s.",a)}return!!n.checkDCE}function at(t){if(typeof dL=="function"&&hL(t),Ki&&typeof Ki.setStrictMode=="function")try{Ki.setStrictMode(fc,t)}catch(n){Er||(Er=!0,console.error("React instrumentation encountered an error: %s",n))}}function Ne(t){Ae=t}function ke(){Ae!==null&&typeof Ae.markCommitStopped=="function"&&Ae.markCommitStopped()}function ut(t){Ae!==null&&typeof Ae.markComponentRenderStarted=="function"&&Ae.markComponentRenderStarted(t)}function ft(){Ae!==null&&typeof Ae.markComponentRenderStopped=="function"&&Ae.markComponentRenderStopped()}function Ze(t){Ae!==null&&typeof Ae.markRenderStarted=="function"&&Ae.markRenderStarted(t)}function pt(){Ae!==null&&typeof Ae.markRenderStopped=="function"&&Ae.markRenderStopped()}function At(t,n){Ae!==null&&typeof Ae.markStateUpdateScheduled=="function"&&Ae.markStateUpdateScheduled(t,n)}function Vt(t){return t>>>=0,t===0?32:31-(fL(t)/pL|0)|0}function Sn(t){if(t&1)return"SyncHydrationLane";if(t&2)return"Sync";if(t&4)return"InputContinuousHydration";if(t&8)return"InputContinuous";if(t&16)return"DefaultHydration";if(t&32)return"Default";if(t&128)return"TransitionHydration";if(t&4194048)return"Transition";if(t&62914560)return"Retry";if(t&67108864)return"SelectiveHydration";if(t&134217728)return"IdleHydration";if(t&268435456)return"Idle";if(t&536870912)return"Offscreen";if(t&1073741824)return"Deferred"}function kt(t){var n=t&42;if(n!==0)return n;switch(t&-t){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t&4194048;case 4194304:case 8388608:case 16777216:case 33554432:return t&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return console.error("Should have found matching lanes. This is a bug in React."),t}}function Ot(t,n,a){var l=t.pendingLanes;if(l===0)return 0;var d=0,p=t.suspendedLanes,T=t.pingedLanes;t=t.warmLanes;var C=l&134217727;return C!==0?(l=C&~p,l!==0?d=kt(l):(T&=C,T!==0?d=kt(T):a||(a=C&~t,a!==0&&(d=kt(a))))):(C=l&~p,C!==0?d=kt(C):T!==0?d=kt(T):a||(a=l&~t,a!==0&&(d=kt(a)))),d===0?0:n!==0&&n!==d&&!(n&p)&&(p=d&-d,a=n&-n,p>=a||p===32&&(a&4194048)!==0)?n:d}function dt(t,n){return(t.pendingLanes&~(t.suspendedLanes&~t.pingedLanes)&n)===0}function xn(t,n){switch(t){case 1:case 2:case 4:case 8:case 64:return n+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return n+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return console.error("Should have found matching lanes. This is a bug in React."),-1}}function _e(){var t=Vm;return Vm<<=1,!(Vm&4194048)&&(Vm=256),t}function Ei(){var t=$m;return $m<<=1,!($m&62914560)&&($m=4194304),t}function ci(t){for(var n=[],a=0;31>a;a++)n.push(t);return n}function $t(t,n){t.pendingLanes|=n,n!==268435456&&(t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0)}function Ci(t,n,a,l,d,p){var T=t.pendingLanes;t.pendingLanes=a,t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0,t.expiredLanes&=a,t.entangledLanes&=a,t.errorRecoveryDisabledLanes&=a,t.shellSuspendCounter=0;var C=t.entanglements,O=t.expirationTimes,I=t.hiddenUpdates;for(a=T&~a;0Gh&&console.error("disabledDepth fell below zero. This is a bug in React. Please file an issue.")}function En(t){if(vb===void 0)try{throw Error()}catch(a){var n=a.stack.trim().match(/\n( *(at )?)/);vb=n&&n[1]||"",cw=-1)":-1T||I[p]!==Z[T]){var re=` +`+I[p].replace(" at new "," at ");return t.displayName&&re.includes("")&&(re=re.replace("",t.displayName)),typeof t=="function"&&_b.set(t,re),re}while(1<=p&&0<=T);break}}}finally{bb=!1,se.H=l,Ud(),Error.prepareStackTrace=a}return I=(I=t?t.displayName||t.name:"")?En(I):"",typeof t=="function"&&_b.set(t,I),I}function Fd(t){var n=Error.prepareStackTrace;if(Error.prepareStackTrace=void 0,t=t.stack,Error.prepareStackTrace=n,t.startsWith(`Error: react-stack-top-frame `)&&(t=t.slice(29)),n=t.indexOf(` `),n!==-1&&(t=t.slice(n+1)),n=t.indexOf("react-stack-bottom-frame"),n!==-1&&(n=t.lastIndexOf(` -`,n)),n!==-1)t=t.slice(0,n);else return"";return t}function Hd(t){switch(t.tag){case 26:case 27:case 5:return En(t.type);case 16:return En("Lazy");case 13:return En("Suspense");case 19:return En("SuspenseList");case 0:case 15:return qd(t.type,!1);case 11:return qd(t.type.render,!1);case 1:return qd(t.type,!0);case 31:return En("Activity");default:return""}}function Fo(t){try{var n="";do{n+=Hd(t);var r=t._debugInfo;if(r)for(var l=r.length-1;0<=l;l--){var d=r[l];if(typeof d.name=="string"){var p=n,S=d.env,C=En(d.name+(S?" ["+S+"]":""));n=p+C}}t=t.return}while(t);return n}catch(O){return` +`,n)),n!==-1)t=t.slice(0,n);else return"";return t}function Hd(t){switch(t.tag){case 26:case 27:case 5:return En(t.type);case 16:return En("Lazy");case 13:return En("Suspense");case 19:return En("SuspenseList");case 0:case 15:return qd(t.type,!1);case 11:return qd(t.type.render,!1);case 1:return qd(t.type,!0);case 31:return En("Activity");default:return""}}function Fo(t){try{var n="";do{n+=Hd(t);var a=t._debugInfo;if(a)for(var l=a.length-1;0<=l;l--){var d=a[l];if(typeof d.name=="string"){var p=n,T=d.env,C=En(d.name+(T?" ["+T+"]":""));n=p+C}}t=t.return}while(t);return n}catch(O){return` Error generating stack: `+O.message+` -`+O.stack}}function Li(t){return(t=t?t.displayName||t.name:"")?En(t):""}function Au(){if(Wn===null)return null;var t=Wn._debugOwner;return t!=null?K(t):null}function Hy(){if(Wn===null)return"";var t=Wn;try{var n="";switch(t.tag===6&&(t=t.return),t.tag){case 26:case 27:case 5:n+=En(t.type);break;case 13:n+=En("Suspense");break;case 19:n+=En("SuspenseList");break;case 31:n+=En("Activity");break;case 30:case 0:case 15:case 1:t._debugOwner||n!==""||(n+=Li(t.type));break;case 11:t._debugOwner||n!==""||(n+=Li(t.type.render))}for(;t;)if(typeof t.tag=="number"){var r=t;t=r._debugOwner;var l=r._debugStack;t&&l&&(typeof l!="string"&&(r._debugStack=l=Fd(l)),l!==""&&(n+=` +`+O.stack}}function Li(t){return(t=t?t.displayName||t.name:"")?En(t):""}function Au(){if(Wn===null)return null;var t=Wn._debugOwner;return t!=null?J(t):null}function Hy(){if(Wn===null)return"";var t=Wn;try{var n="";switch(t.tag===6&&(t=t.return),t.tag){case 26:case 27:case 5:n+=En(t.type);break;case 13:n+=En("Suspense");break;case 19:n+=En("SuspenseList");break;case 31:n+=En("Activity");break;case 30:case 0:case 15:case 1:t._debugOwner||n!==""||(n+=Li(t.type));break;case 11:t._debugOwner||n!==""||(n+=Li(t.type.render))}for(;t;)if(typeof t.tag=="number"){var a=t;t=a._debugOwner;var l=a._debugStack;t&&l&&(typeof l!="string"&&(a._debugStack=l=Fd(l)),l!==""&&(n+=` `+l))}else if(t.debugStack!=null){var d=t.debugStack;(t=t.owner)&&d&&(n+=` -`+Fd(d))}else break;var p=n}catch(S){p=` -Error generating stack: `+S.message+` -`+S.stack}return p}function Ie(t,n,r,l,d,p,S){var C=Wn;Fn(t);try{return t!==null&&t._debugTask?t._debugTask.run(n.bind(null,r,l,d,p,S)):n(r,l,d,p,S)}finally{Fn(C)}throw Error("runWithFiberInDEV should never be called in production. This is a bug in React.")}function Fn(t){ne.getCurrentStack=t===null?null:Hy,wa=!1,Wn=t}function Ii(t){switch(typeof t){case"bigint":case"boolean":case"number":case"string":case"undefined":return t;case"object":return We(t),t;default:return""}}function Ct(t){var n=t.type;return(t=t.nodeName)&&t.toLowerCase()==="input"&&(n==="checkbox"||n==="radio")}function jy(t){var n=Ct(t)?"checked":"value",r=Object.getOwnPropertyDescriptor(t.constructor.prototype,n);We(t[n]);var l=""+t[n];if(!t.hasOwnProperty(n)&&typeof r<"u"&&typeof r.get=="function"&&typeof r.set=="function"){var d=r.get,p=r.set;return Object.defineProperty(t,n,{configurable:!0,get:function(){return d.call(this)},set:function(S){We(S),l=""+S,p.call(this,S)}}),Object.defineProperty(t,n,{enumerable:r.enumerable}),{getValue:function(){return l},setValue:function(S){We(S),l=""+S},stopTracking:function(){t._valueTracker=null,delete t[n]}}}}function Va(t){t._valueTracker||(t._valueTracker=jy(t))}function Ho(t){if(!t)return!1;var n=t._valueTracker;if(!n)return!0;var r=n.getValue(),l="";return t&&(l=Ct(t)?t.checked?"true":"false":t.value),t=l,t!==r?(n.setValue(t),!0):!1}function Du(t){if(t=t||(typeof document<"u"?document:void 0),typeof t>"u")return null;try{return t.activeElement||t.body}catch{return t.body}}function di(t){return t.replace(bL,function(n){return"\\"+n.charCodeAt(0).toString(16)+" "})}function Nt(t,n){n.checked===void 0||n.defaultChecked===void 0||hw||(console.error("%s contains an input of type %s with both checked and defaultChecked props. Input elements must be either controlled or uncontrolled (specify either the checked prop, or the defaultChecked prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://react.dev/link/controlled-components",Au()||"A component",n.type),hw=!0),n.value===void 0||n.defaultValue===void 0||dw||(console.error("%s contains an input of type %s with both value and defaultValue props. Input elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://react.dev/link/controlled-components",Au()||"A component",n.type),dw=!0)}function ku(t,n,r,l,d,p,S,C){t.name="",S!=null&&typeof S!="function"&&typeof S!="symbol"&&typeof S!="boolean"?(Se(S,"type"),t.type=S):t.removeAttribute("type"),n!=null?S==="number"?(n===0&&t.value===""||t.value!=n)&&(t.value=""+Ii(n)):t.value!==""+Ii(n)&&(t.value=""+Ii(n)):S!=="submit"&&S!=="reset"||t.removeAttribute("value"),n!=null?jd(t,S,Ii(n)):r!=null?jd(t,S,Ii(r)):l!=null&&t.removeAttribute("value"),d==null&&p!=null&&(t.defaultChecked=!!p),d!=null&&(t.checked=d&&typeof d!="function"&&typeof d!="symbol"),C!=null&&typeof C!="function"&&typeof C!="symbol"&&typeof C!="boolean"?(Se(C,"name"),t.name=""+Ii(C)):t.removeAttribute("name")}function jo(t,n,r,l,d,p,S,C){if(p!=null&&typeof p!="function"&&typeof p!="symbol"&&typeof p!="boolean"&&(Se(p,"type"),t.type=p),n!=null||r!=null){if(!(p!=="submit"&&p!=="reset"||n!=null))return;r=r!=null?""+Ii(r):"",n=n!=null?""+Ii(n):r,C||n===t.value||(t.value=n),t.defaultValue=n}l=l??d,l=typeof l!="function"&&typeof l!="symbol"&&!!l,t.checked=C?t.checked:!!l,t.defaultChecked=!!l,S!=null&&typeof S!="function"&&typeof S!="symbol"&&typeof S!="boolean"&&(Se(S,"name"),t.name=S)}function jd(t,n,r){n==="number"&&Du(t.ownerDocument)===t||t.defaultValue===""+r||(t.defaultValue=""+r)}function Fp(t,n){n.value==null&&(typeof n.children=="object"&&n.children!==null?sb.Children.forEach(n.children,function(r){r==null||typeof r=="string"||typeof r=="number"||typeof r=="bigint"||pw||(pw=!0,console.error("Cannot infer the option value of complex children. Pass a `value` prop or use a plain string as children to element (document.head) to exist in the Document but one was not found. React never removes the head for any Document it renders into so the cause is likely in some other script running on this page.");return t;case"body":if(t=n.body,!t)throw Error("React expected a element (document.body) to exist in the Document but one was not found. React never removes the body for any Document it renders into so the cause is likely in some other script running on this page.");return t;default:throw Error("resolveSingletonInstance was called with an element type that is not supported. This is a bug in React.")}}function F5(t,n,r,l){if(!r[uo]&&qn(r)){var d=r.tagName.toLowerCase();console.error("You are mounting a new %s component when a previous one has not first unmounted. It is an error to render more than one %s component at a time and attributes and children of these components will likely fail in unpredictable ways. Please only render a single instance of <%s> and if you need to mount a new one, ensure any previous ones have unmounted first.",d,d,d)}switch(t){case"html":case"head":case"body":break;default:console.error("acquireSingletonInstance was called with an element type that is not supported. This is a bug in React.")}for(d=r.attributes;d.length;)r.removeAttributeNode(d[0]);qi(r,t,n),r[Zi]=l,r[kn]=n}function Uh(t){for(var n=t.attributes;n.length;)t.removeAttributeNode(n[0]);ta(t)}function Im(t){return typeof t.getRootNode=="function"?t.getRootNode():t.nodeType===9?t:t.ownerDocument}function NC(t,n,r){var l=Yc;if(l&&typeof n=="string"&&n){var d=di(n);d='link[rel="'+t+'"][href="'+d+'"]',typeof r=="string"&&(d+='[crossorigin="'+r+'"]'),mD.has(d)||(mD.add(d),t={rel:t,crossOrigin:r,href:n},l.querySelector(d)===null&&(n=l.createElement("link"),qi(n,"link",t),Y(n),l.head.appendChild(n)))}}function PC(t,n,r,l){var d=(d=oo.current)?Im(d):null;if(!d)throw Error('"resourceRoot" was expected to exist. This is a bug in React.');switch(t){case"meta":case"title":return null;case"style":return typeof r.precedence=="string"&&typeof r.href=="string"?(r=lc(r.href),n=D(d).hoistableStyles,l=n.get(r),l||(l={type:"style",instance:null,count:0,state:null},n.set(r,l)),l):{type:"void",instance:null,count:0,state:null};case"link":if(r.rel==="stylesheet"&&typeof r.href=="string"&&typeof r.precedence=="string"){t=lc(r.href);var p=D(d).hoistableStyles,S=p.get(t);if(!S&&(d=d.ownerDocument||d,S={type:"stylesheet",instance:null,count:0,state:{loading:Ul,preload:null}},p.set(t,S),(p=d.querySelector(qh(t)))&&!p._p&&(S.instance=p,S.state.loading=Af|_s),!Ts.has(t))){var C={rel:"preload",as:"style",href:r.href,crossOrigin:r.crossOrigin,integrity:r.integrity,media:r.media,hrefLang:r.hrefLang,referrerPolicy:r.referrerPolicy};Ts.set(t,C),p||H5(d,t,C,S.state)}if(n&&l===null)throw r=` +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act`,te(t))})}function _r(t){t!==$c&&t.next===null&&($c===null?bg=$c=t:$c=$c.next=t),_g=!0,se.actQueue!==null?p_||(p_=!0,fC()):f_||(f_=!0,fC())}function Ph(t,n){if(!m_&&_g){m_=!0;do for(var a=!1,l=bg;l!==null;){if(!n)if(t!==0){var d=l.pendingLanes;if(d===0)var p=0;else{var T=l.suspendedLanes,C=l.pingedLanes;p=(1<<31-ln(42|t)+1)-1,p&=d&~(T&~C),p=p&201326741?p&201326741|1:p?p|2:0}p!==0&&(a=!0,hC(l,p))}else p=rt,p=Ot(l,l===Pt?p:0,l.cancelPendingCommit!==null||l.timeoutHandle!==Bl),!(p&3)||dt(l,p)||(a=!0,hC(l,p));l=l.next}while(a);m_=!1}}function bM(){Nv()}function Nv(){_g=p_=f_=!1;var t=0;Nl!==0&&(EM()&&(t=Nl),Nl=0);for(var n=xr(),a=null,l=bg;l!==null;){var d=l.next,p=cC(l,n);p===0?(l.next=null,a===null?bg=d:a.next=d,d===null&&($c=a)):(a=l,(t!==0||p&3)&&(_g=!0)),l=d}Ph(t,!1)}function cC(t,n){for(var a=t.suspendedLanes,l=t.pingedLanes,d=t.expirationTimes,p=t.pendingLanes&-62914561;0 or