Spaces:
Running
Running
Upload folder using huggingface_hub
Browse filesThis view is limited to 50 files because it contains too many changes. See raw diff
- .dockerignore +9 -0
- Debugger.py +542 -0
- Dockerfile +37 -0
- README.md +95 -0
- README_DEPLOY.md +69 -0
- app.2.py +73 -0
- app.css +81 -0
- app.py +76 -0
- docker-compose.yml +17 -0
- glv.py +74 -0
- glv_var.py +66 -0
- main.py +1382 -0
- movies/bbb_sunflower_1080p_30fps_normal.mp4 +3 -0
- out/404.html +5 -0
- out/404/index.html +5 -0
- out/__next.__PAGE__.txt +9 -0
- out/__next._full.txt +19 -0
- out/__next._head.txt +6 -0
- out/__next._index.txt +6 -0
- out/__next._tree.txt +2 -0
- out/_next/static/chunks/0cz1d0mv5g_q7.js +0 -0
- out/_next/static/chunks/0d-c12mml-h6p.js +5 -0
- out/_next/static/chunks/0xm351i8abo9i.js +1 -0
- out/_next/static/chunks/158myu8e_yme3.js +1 -0
- out/_next/static/chunks/1u8kf-cumb-f7.js +31 -0
- out/_next/static/chunks/2dkoocrktt9k-.js +0 -0
- out/_next/static/chunks/2fc-6082kgcrk.js +1 -0
- out/_next/static/chunks/2v-rv291cn1b-.css +0 -0
- out/_next/static/chunks/3rxl-jt3pdxgx.js +0 -0
- out/_next/static/chunks/3sfsn9t1uaymg.js +0 -0
- out/_next/static/chunks/3y0d2nz4u4vwb.js +0 -0
- out/_next/static/chunks/turbopack-3v560ngbdsqcf.js +1 -0
- out/_next/static/media/favicon.2vob68tjqpejf.ico +0 -0
- out/_next/static/nBKcDuA1Pt7_3iMhIbjDI/_buildManifest.js +18 -0
- out/_next/static/nBKcDuA1Pt7_3iMhIbjDI/_clientMiddlewareManifest.js +1 -0
- out/_next/static/nBKcDuA1Pt7_3iMhIbjDI/_ssgManifest.js +1 -0
- out/_not-found/__next._full.txt +17 -0
- out/_not-found/__next._head.txt +6 -0
- out/_not-found/__next._index.txt +6 -0
- out/_not-found/__next._not-found.txt +5 -0
- out/_not-found/__next._not-found/__PAGE__.txt +5 -0
- out/_not-found/__next._tree.txt +2 -0
- out/_not-found/index.html +5 -0
- out/_not-found/index.txt +17 -0
- out/favicon.ico +0 -0
- out/file.svg +1 -0
- out/globe.svg +1 -0
- out/index.html +9 -0
- out/index.txt +19 -0
- out/manager/__next._full.txt +21 -0
.dockerignore
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
.git
|
| 2 |
+
.idea
|
| 3 |
+
.venv
|
| 4 |
+
__pycache__
|
| 5 |
+
frontend/node_modules
|
| 6 |
+
frontend/.next
|
| 7 |
+
*.zip
|
| 8 |
+
*.rar
|
| 9 |
+
*.tar.gz
|
Debugger.py
ADDED
|
@@ -0,0 +1,542 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import inspect
|
| 2 |
+
import os
|
| 3 |
+
import time
|
| 4 |
+
import re
|
| 5 |
+
import traceback
|
| 6 |
+
|
| 7 |
+
class Debugger:
|
| 8 |
+
COLORS = {
|
| 9 |
+
"CYAN": "\033[96m",
|
| 10 |
+
"BRIGHT_CYAN": "\033[1;96m",
|
| 11 |
+
"DIM_CYAN": "\033[2;96m",
|
| 12 |
+
"YELLOW": "\033[93m",
|
| 13 |
+
"BRIGHT_YELLOW": "\033[1;93m",
|
| 14 |
+
"DIM_YELLOW": "\033[2;93m",
|
| 15 |
+
"MAGENTA": "\033[95m",
|
| 16 |
+
"BRIGHT_MAGENTA": "\033[1;95m",
|
| 17 |
+
"DIM_MAGENTA": "\033[2;95m",
|
| 18 |
+
"RED": "\033[91m",
|
| 19 |
+
"BRIGHT_RED": "\033[1;91m",
|
| 20 |
+
"DIM_RED": "\033[2;91m",
|
| 21 |
+
"GREEN": "\033[92m",
|
| 22 |
+
"BRIGHT_GREEN": "\033[1;92m",
|
| 23 |
+
"DIM_GREEN": "\033[2;92m",
|
| 24 |
+
"BLUE": "\033[94m",
|
| 25 |
+
"BRIGHT_BLUE": "\033[1;94m",
|
| 26 |
+
"DIM_BLUE": "\033[2;94m",
|
| 27 |
+
"RESET": "\033[0m",
|
| 28 |
+
}
|
| 29 |
+
|
| 30 |
+
LEVELS = {
|
| 31 |
+
"INFO": 0,
|
| 32 |
+
"SUCCESS": 0,
|
| 33 |
+
"DEBUG": 1,
|
| 34 |
+
"WARNING": 2,
|
| 35 |
+
"ERROR": 3,
|
| 36 |
+
"CRITICAL": 4,
|
| 37 |
+
}
|
| 38 |
+
|
| 39 |
+
COLOR_MAP = {
|
| 40 |
+
"INFO": "BRIGHT_CYAN",
|
| 41 |
+
"SUCCESS": "BRIGHT_GREEN",
|
| 42 |
+
"DEBUG": "BRIGHT_YELLOW",
|
| 43 |
+
"WARNING": "BRIGHT_MAGENTA",
|
| 44 |
+
"ERROR": "BRIGHT_RED",
|
| 45 |
+
"CRITICAL": "BRIGHT_RED",
|
| 46 |
+
"VAR": "BRIGHT_BLUE",
|
| 47 |
+
}
|
| 48 |
+
|
| 49 |
+
DIM_COLOR_MAP = {
|
| 50 |
+
"INFO": "DIM_CYAN",
|
| 51 |
+
"SUCCESS": "DIM_GREEN",
|
| 52 |
+
"DEBUG": "DIM_YELLOW",
|
| 53 |
+
"WARNING": "DIM_MAGENTA",
|
| 54 |
+
"ERROR": "DIM_RED",
|
| 55 |
+
"CRITICAL": "DIM_RED",
|
| 56 |
+
"VAR": "DIM_BLUE",
|
| 57 |
+
}
|
| 58 |
+
|
| 59 |
+
def __init__(self, enabled=True, level="INFO", show_time=True, show_location=True, column_widths=None):
|
| 60 |
+
self.enabled = enabled
|
| 61 |
+
self.level = self.LEVELS.get(level.upper(), 0)
|
| 62 |
+
self.show_time = show_time
|
| 63 |
+
self.show_location = show_location
|
| 64 |
+
self.column_widths = column_widths or {"level": 10, "time": 20, "location": 20, "message": 50}
|
| 65 |
+
|
| 66 |
+
# To ensure consistent spacing, we need to track actual visible text lengths
|
| 67 |
+
# when ANSI color codes are used
|
| 68 |
+
self.ansi_escape = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])')
|
| 69 |
+
self._indent_level = 0 # Added for recursive indentation
|
| 70 |
+
|
| 71 |
+
def _get_location(self):
|
| 72 |
+
"""
|
| 73 |
+
Get the location of the calling code outside of the Debugger class.
|
| 74 |
+
"""
|
| 75 |
+
# Get the frame at the specified depth
|
| 76 |
+
current_frame = inspect.currentframe()
|
| 77 |
+
|
| 78 |
+
# Find the caller frame (outside of the Debugger class)
|
| 79 |
+
caller_frame = current_frame
|
| 80 |
+
for _ in range(10): # Limit to 10 frames to avoid infinite loop
|
| 81 |
+
if caller_frame.f_back is None:
|
| 82 |
+
break
|
| 83 |
+
|
| 84 |
+
caller_frame = caller_frame.f_back
|
| 85 |
+
# Get the code object for the frame
|
| 86 |
+
code = caller_frame.f_code
|
| 87 |
+
|
| 88 |
+
# If this frame is not from Debugger.py, we've found our caller
|
| 89 |
+
if os.path.basename(code.co_filename) != "Debugger.py":
|
| 90 |
+
break
|
| 91 |
+
|
| 92 |
+
filename = os.path.basename(caller_frame.f_code.co_filename)
|
| 93 |
+
lineno = caller_frame.f_lineno
|
| 94 |
+
return f"{filename}:{lineno}"
|
| 95 |
+
|
| 96 |
+
def _get_variable_name(self, var, frame_depth=2):
|
| 97 |
+
"""
|
| 98 |
+
Dynamically get the variable name by inspecting the source code.
|
| 99 |
+
|
| 100 |
+
Args:
|
| 101 |
+
var: The variable to find the name for
|
| 102 |
+
frame_depth: How many frames to go back to find the caller
|
| 103 |
+
|
| 104 |
+
Returns:
|
| 105 |
+
str: The variable name or "unknown" if not found
|
| 106 |
+
"""
|
| 107 |
+
try:
|
| 108 |
+
# Get the frame that called this function
|
| 109 |
+
frame = inspect.currentframe()
|
| 110 |
+
for _ in range(frame_depth):
|
| 111 |
+
if frame.f_back is None:
|
| 112 |
+
break
|
| 113 |
+
frame = frame.f_back
|
| 114 |
+
|
| 115 |
+
# Get the line of code that called this function
|
| 116 |
+
context = inspect.getframeinfo(frame).code_context
|
| 117 |
+
if not context:
|
| 118 |
+
return "unknown"
|
| 119 |
+
|
| 120 |
+
# Extract the line
|
| 121 |
+
caller_line = context[0].strip()
|
| 122 |
+
|
| 123 |
+
# Regular expression to match common variable inspection patterns
|
| 124 |
+
# This captures variable names inside function calls like:
|
| 125 |
+
# debug.var(my_variable), debug.var_dict(my_dict), etc.
|
| 126 |
+
matches = re.findall(r'(?:var\w*)\s*\(\s*([^,)]+)', caller_line)
|
| 127 |
+
|
| 128 |
+
if matches:
|
| 129 |
+
return matches[0].strip()
|
| 130 |
+
|
| 131 |
+
# Fall back to inspecting local variables
|
| 132 |
+
for var_name, var_val in frame.f_locals.items():
|
| 133 |
+
if var_val is var:
|
| 134 |
+
return var_name
|
| 135 |
+
|
| 136 |
+
return "unknown"
|
| 137 |
+
|
| 138 |
+
except Exception:
|
| 139 |
+
return "unknown"
|
| 140 |
+
finally:
|
| 141 |
+
# Ensure we clean up the frame reference to avoid memory leaks
|
| 142 |
+
del frame
|
| 143 |
+
|
| 144 |
+
def _strip_ansi(self, text):
|
| 145 |
+
"""Remove ANSI escape sequences from text to get true visible length"""
|
| 146 |
+
return self.ansi_escape.sub('', text)
|
| 147 |
+
|
| 148 |
+
def _ljust_with_ansi(self, text, width):
|
| 149 |
+
"""Left justify text accounting for ANSI color codes"""
|
| 150 |
+
visible_text = self._strip_ansi(text)
|
| 151 |
+
padding = max(0, width - len(visible_text))
|
| 152 |
+
return text + ' ' * padding
|
| 153 |
+
|
| 154 |
+
def _format(self, level, message):
|
| 155 |
+
parts = []
|
| 156 |
+
|
| 157 |
+
# Get the dim color for the level
|
| 158 |
+
dim_color = self.COLORS.get(self.DIM_COLOR_MAP.get(level, ""), "")
|
| 159 |
+
# Get the bright color for the message
|
| 160 |
+
bright_color = self.COLORS.get(self.COLOR_MAP.get(level, ""), "")
|
| 161 |
+
reset = self.COLORS["RESET"]
|
| 162 |
+
|
| 163 |
+
# Format level with consistent padding regardless of ANSI codes
|
| 164 |
+
level_text = f"{dim_color}[{level}]{reset}"
|
| 165 |
+
level_str = self._ljust_with_ansi(level_text, self.column_widths["level"])
|
| 166 |
+
|
| 167 |
+
# Format other components
|
| 168 |
+
time_text = time.strftime("[%Y-%m-%d %H:%M:%S]") if self.show_time else ""
|
| 169 |
+
time_str = self._ljust_with_ansi(time_text, self.column_widths["time"])
|
| 170 |
+
|
| 171 |
+
location_text = f"[{self._get_location()}]" if self.show_location else ""
|
| 172 |
+
location_str = self._ljust_with_ansi(location_text, self.column_widths["location"])
|
| 173 |
+
|
| 174 |
+
# Add indentation for recursive calls
|
| 175 |
+
indent_prefix = " " * self._indent_level
|
| 176 |
+
message_str = f"{indent_prefix}{bright_color}{message}{reset}"
|
| 177 |
+
|
| 178 |
+
# Combine into a table-like structure
|
| 179 |
+
parts.append(f"{level_str} {time_str} {location_str} {message_str}")
|
| 180 |
+
|
| 181 |
+
return "".join(parts)
|
| 182 |
+
|
| 183 |
+
def log(self, message, level="INFO"):
|
| 184 |
+
if not self.enabled or self.LEVELS.get(level, 0) < self.level:
|
| 185 |
+
return
|
| 186 |
+
|
| 187 |
+
print(self._format(level, message))
|
| 188 |
+
|
| 189 |
+
def info(self, message):
|
| 190 |
+
self.log(message, "INFO")
|
| 191 |
+
|
| 192 |
+
def debug(self, message):
|
| 193 |
+
self.log(message, "DEBUG")
|
| 194 |
+
|
| 195 |
+
def warning(self, message):
|
| 196 |
+
self.log(message, "WARNING")
|
| 197 |
+
|
| 198 |
+
def error(self, message):
|
| 199 |
+
self.log(message, "ERROR")
|
| 200 |
+
|
| 201 |
+
def critical(self, message):
|
| 202 |
+
self.log(message, "CRITICAL")
|
| 203 |
+
|
| 204 |
+
def success(self, message):
|
| 205 |
+
self.log(message, "SUCCESS")
|
| 206 |
+
|
| 207 |
+
# --- Variable inspection methods ---
|
| 208 |
+
|
| 209 |
+
def var(self, *args, **kwargs):
|
| 210 |
+
"""
|
| 211 |
+
General-purpose variable inspector that accepts multiple variables.
|
| 212 |
+
|
| 213 |
+
Args:
|
| 214 |
+
*args: Variables to inspect
|
| 215 |
+
**kwargs: Variables with custom names as keyword arguments
|
| 216 |
+
|
| 217 |
+
Usage:
|
| 218 |
+
debug.var(x) # Single variable, auto-detected name
|
| 219 |
+
debug.var(x, y, z) # Multiple variables with auto-detected names
|
| 220 |
+
debug.var(result=x) # Custom name 'result' for variable x
|
| 221 |
+
debug.var(x, y, result=z) # Mix of auto-detected and custom names
|
| 222 |
+
"""
|
| 223 |
+
# Handle positional arguments (auto-detect names)
|
| 224 |
+
# We need to adjust frame_depth here because _get_variable_name is called
|
| 225 |
+
# from var, which is called from the user code.
|
| 226 |
+
# This will need careful adjustment if the call stack changes significantly.
|
| 227 |
+
current_frame = inspect.currentframe()
|
| 228 |
+
outer_frames = []
|
| 229 |
+
f = current_frame
|
| 230 |
+
while f:
|
| 231 |
+
if os.path.basename(f.f_code.co_filename) != "Debugger.py":
|
| 232 |
+
break
|
| 233 |
+
outer_frames.append(f)
|
| 234 |
+
f = f.f_back
|
| 235 |
+
|
| 236 |
+
# If the call is directly from user code, we need to go back 2 frames
|
| 237 |
+
# (var -> _inspect_var -> _get_variable_name)
|
| 238 |
+
# If it's a wrapper like var_dict -> var, then it's different.
|
| 239 |
+
# For a general `var` call, we want the frame that called `var`.
|
| 240 |
+
# So we look for the first frame outside of Debugger.py in the stack.
|
| 241 |
+
# This logic is already handled by _get_location, but for variable naming
|
| 242 |
+
# we need to be more precise about the frame where the variable is defined.
|
| 243 |
+
|
| 244 |
+
# The frame for var() is at depth 0, its caller is at depth 1 (user code)
|
| 245 |
+
# The _get_variable_name itself looks back from its own call, so `frame_depth=2` is typically correct for `var`
|
| 246 |
+
# if called directly like `debug.var(my_var)`.
|
| 247 |
+
# For nested calls (e.g., from `_inspect_dict`), `_inspect_var` is already adjusting depth.
|
| 248 |
+
|
| 249 |
+
# This is a tricky part for _get_variable_name. Let's assume it works well for the top-level call.
|
| 250 |
+
# For internal recursive calls, the name is provided explicitly.
|
| 251 |
+
|
| 252 |
+
for arg in args:
|
| 253 |
+
# When calling from var, we need to look one more frame back
|
| 254 |
+
# compared to when _get_variable_name is called directly from _inspect_var.
|
| 255 |
+
# This is because _inspect_var is a helper function to var.
|
| 256 |
+
# However, the current _get_variable_name implementation already tries to find the
|
| 257 |
+
# non-Debugger.py frame, which is often what we want.
|
| 258 |
+
# Let's keep `frame_depth=2` for the top-level `var` call as it's designed to skip `var` and `_get_variable_name` itself.
|
| 259 |
+
var_name = self._get_variable_name(arg, frame_depth=2)
|
| 260 |
+
self._inspect_var(arg, var_name)
|
| 261 |
+
|
| 262 |
+
# Handle keyword arguments (custom names)
|
| 263 |
+
for name, value in kwargs.items():
|
| 264 |
+
self._inspect_var(value, name)
|
| 265 |
+
|
| 266 |
+
def _inspect_var(self, variable, var_name, is_nested=False):
|
| 267 |
+
"""
|
| 268 |
+
Helper method to inspect a single variable
|
| 269 |
+
|
| 270 |
+
Args:
|
| 271 |
+
variable: The variable to inspect
|
| 272 |
+
var_name: Name to display for the variable
|
| 273 |
+
is_nested: True if this call is from a recursive inspection (for indentation)
|
| 274 |
+
"""
|
| 275 |
+
var_type = type(variable).__name__
|
| 276 |
+
|
| 277 |
+
# Increment indent level for nested calls
|
| 278 |
+
if is_nested:
|
| 279 |
+
self._indent_level += 1
|
| 280 |
+
|
| 281 |
+
try:
|
| 282 |
+
# For simple types, just show the value
|
| 283 |
+
if isinstance(variable, (int, float, bool, str, type(None))): # Added NoneType
|
| 284 |
+
value_str = repr(variable)
|
| 285 |
+
self.log(f"{var_name} ({var_type}) = {value_str}", "VAR")
|
| 286 |
+
|
| 287 |
+
# For more complex types, use type-specific methods
|
| 288 |
+
elif isinstance(variable, dict):
|
| 289 |
+
self._inspect_dict(variable, var_name, is_nested=True)
|
| 290 |
+
elif isinstance(variable, (list, tuple)):
|
| 291 |
+
self._inspect_list(variable, var_name, is_nested=True)
|
| 292 |
+
elif isinstance(variable, set):
|
| 293 |
+
self._inspect_set(variable, var_name, is_nested=True)
|
| 294 |
+
else:
|
| 295 |
+
# For other objects, show the representation
|
| 296 |
+
value_str = repr(variable)
|
| 297 |
+
self.log(f"{var_name} ({var_type}) = {value_str}", "VAR")
|
| 298 |
+
finally:
|
| 299 |
+
# Decrement indent level after nested calls
|
| 300 |
+
if is_nested:
|
| 301 |
+
self._indent_level -= 1
|
| 302 |
+
|
| 303 |
+
|
| 304 |
+
def var_dict(self, *args, **kwargs):
|
| 305 |
+
# Handle positional arguments (auto-detect names)
|
| 306 |
+
for arg in args:
|
| 307 |
+
if isinstance(arg, dict):
|
| 308 |
+
# When calling from var_dict directly, adjust frame_depth
|
| 309 |
+
var_name = self._get_variable_name(arg, frame_depth=2) # Adjust depth for direct var_dict call
|
| 310 |
+
self._inspect_dict(arg, var_name)
|
| 311 |
+
else:
|
| 312 |
+
var_type = type(arg).__name__
|
| 313 |
+
var_name = self._get_variable_name(arg, frame_depth=2)
|
| 314 |
+
self.log(f"{var_name} is not a dictionary (got {var_type})", "WARNING")
|
| 315 |
+
|
| 316 |
+
# Handle keyword arguments (custom names)
|
| 317 |
+
for name, value in kwargs.items():
|
| 318 |
+
if isinstance(value, dict):
|
| 319 |
+
self._inspect_dict(value, name)
|
| 320 |
+
else:
|
| 321 |
+
var_type = type(value).__name__
|
| 322 |
+
self.log(f"{name} is not a dictionary (got {var_type})", "WARNING")
|
| 323 |
+
|
| 324 |
+
def _inspect_dict(self, dictionary, var_name, is_nested=False):
|
| 325 |
+
"""
|
| 326 |
+
Helper method to inspect a single dictionary
|
| 327 |
+
|
| 328 |
+
Args:
|
| 329 |
+
dictionary: The dictionary to inspect
|
| 330 |
+
var_name: Name to display for the dictionary
|
| 331 |
+
is_nested: True if this call is from a recursive inspection
|
| 332 |
+
"""
|
| 333 |
+
if not is_nested: # Only increment on the initial call to this method
|
| 334 |
+
self._indent_level += 1
|
| 335 |
+
|
| 336 |
+
self.log(f"{var_name} (dict) with {len(dictionary)} items:", "VAR")
|
| 337 |
+
|
| 338 |
+
if not dictionary:
|
| 339 |
+
self.log("{}", "VAR")
|
| 340 |
+
if not is_nested: # Only decrement on the initial call exit
|
| 341 |
+
self._indent_level -= 1
|
| 342 |
+
return
|
| 343 |
+
|
| 344 |
+
self.log("{", "VAR")
|
| 345 |
+
for key, value in dictionary.items():
|
| 346 |
+
key_repr = repr(key)
|
| 347 |
+
# Recursively inspect the value
|
| 348 |
+
# The name for the nested item will be its key
|
| 349 |
+
self._inspect_var(value, key_repr, is_nested=True)
|
| 350 |
+
self.log("}", "VAR")
|
| 351 |
+
|
| 352 |
+
if not is_nested: # Only decrement on the initial call exit
|
| 353 |
+
self._indent_level -= 1
|
| 354 |
+
|
| 355 |
+
|
| 356 |
+
def var_list(self, *args, **kwargs):
|
| 357 |
+
# Handle positional arguments (auto-detect names)
|
| 358 |
+
for arg in args:
|
| 359 |
+
if isinstance(arg, (list, tuple)):
|
| 360 |
+
var_name = self._get_variable_name(arg, frame_depth=2) # Adjust depth for direct var_list call
|
| 361 |
+
self._inspect_list(arg, var_name)
|
| 362 |
+
else:
|
| 363 |
+
var_type = type(arg).__name__
|
| 364 |
+
var_name = self._get_variable_name(arg, frame_depth=2)
|
| 365 |
+
self.log(f"{var_name} is not a list or tuple (got {var_type})", "WARNING")
|
| 366 |
+
|
| 367 |
+
# Handle keyword arguments (custom names)
|
| 368 |
+
for name, value in kwargs.items():
|
| 369 |
+
if isinstance(value, (list, tuple)):
|
| 370 |
+
self._inspect_list(value, name)
|
| 371 |
+
else:
|
| 372 |
+
var_type = type(value).__name__
|
| 373 |
+
self.log(f"{name} is not a list or tuple (got {var_type})", "WARNING")
|
| 374 |
+
|
| 375 |
+
def _inspect_list(self, lst, var_name, is_nested=False):
|
| 376 |
+
"""
|
| 377 |
+
Helper method to inspect a single list or tuple
|
| 378 |
+
|
| 379 |
+
Args:
|
| 380 |
+
lst: The list or tuple to inspect
|
| 381 |
+
var_name: Name to display for the list or tuple
|
| 382 |
+
is_nested: True if this call is from a recursive inspection
|
| 383 |
+
"""
|
| 384 |
+
container_type = "list" if isinstance(lst, list) else "tuple"
|
| 385 |
+
if not is_nested: # Only increment on the initial call to this method
|
| 386 |
+
self._indent_level += 1
|
| 387 |
+
|
| 388 |
+
self.log(f"{var_name} ({container_type}) with {len(lst)} items:", "VAR")
|
| 389 |
+
|
| 390 |
+
if not lst:
|
| 391 |
+
self.log(f"{'[]' if container_type == 'list' else '()'} ", "VAR") # Added space for consistency
|
| 392 |
+
if not is_nested: # Only decrement on the initial call exit
|
| 393 |
+
self._indent_level -= 1
|
| 394 |
+
return
|
| 395 |
+
|
| 396 |
+
opening = "[" if container_type == "list" else "("
|
| 397 |
+
closing = "]" if container_type == "list" else ")"
|
| 398 |
+
|
| 399 |
+
self.log(opening, "VAR")
|
| 400 |
+
for i, item in enumerate(lst):
|
| 401 |
+
# Recursively inspect the item
|
| 402 |
+
self._inspect_var(item, f"{var_name}[{i}]", is_nested=True) # Pass index as part of name
|
| 403 |
+
self.log(closing, "VAR")
|
| 404 |
+
|
| 405 |
+
if not is_nested: # Only decrement on the initial call exit
|
| 406 |
+
self._indent_level -= 1
|
| 407 |
+
|
| 408 |
+
|
| 409 |
+
def var_set(self, *args, **kwargs):
|
| 410 |
+
# Handle positional arguments (auto-detect names)
|
| 411 |
+
for arg in args:
|
| 412 |
+
if isinstance(arg, set):
|
| 413 |
+
var_name = self._get_variable_name(arg, frame_depth=2) # Adjust depth for direct var_set call
|
| 414 |
+
self._inspect_set(arg, var_name)
|
| 415 |
+
else:
|
| 416 |
+
var_type = type(arg).__name__
|
| 417 |
+
var_name = self._get_variable_name(arg, frame_depth=2)
|
| 418 |
+
self.log(f"{var_name} is not a set (got {var_type})", "WARNING")
|
| 419 |
+
|
| 420 |
+
# Handle keyword arguments (custom names)
|
| 421 |
+
for name, value in kwargs.items():
|
| 422 |
+
if isinstance(value, set):
|
| 423 |
+
self._inspect_set(value, name)
|
| 424 |
+
else:
|
| 425 |
+
var_type = type(value).__name__
|
| 426 |
+
self.log(f"{name} is not a set (got {var_type})", "WARNING")
|
| 427 |
+
|
| 428 |
+
def _inspect_set(self, s, var_name, is_nested=False):
|
| 429 |
+
"""
|
| 430 |
+
Helper method to inspect a single set
|
| 431 |
+
|
| 432 |
+
Args:
|
| 433 |
+
s: The set to inspect
|
| 434 |
+
var_name: Name to display for the set
|
| 435 |
+
is_nested: True if this call is from a recursive inspection
|
| 436 |
+
"""
|
| 437 |
+
if not is_nested: # Only increment on the initial call to this method
|
| 438 |
+
self._indent_level += 1
|
| 439 |
+
|
| 440 |
+
self.log(f"{var_name} (set) with {len(s)} items:", "VAR")
|
| 441 |
+
|
| 442 |
+
if not s:
|
| 443 |
+
self.log("{}", "VAR")
|
| 444 |
+
if not is_nested: # Only decrement on the initial call exit
|
| 445 |
+
self._indent_level -= 1
|
| 446 |
+
return
|
| 447 |
+
|
| 448 |
+
self.log("{", "VAR")
|
| 449 |
+
for i, item in enumerate(s):
|
| 450 |
+
# Recursively inspect the item, using a generic name like "item_X"
|
| 451 |
+
self._inspect_var(item, f"item_{i}", is_nested=True)
|
| 452 |
+
self.log("}", "VAR")
|
| 453 |
+
|
| 454 |
+
if not is_nested: # Only decrement on the initial call exit
|
| 455 |
+
self._indent_level -= 1
|
| 456 |
+
|
| 457 |
+
def var_bool(self, *args, **kwargs):
|
| 458 |
+
# Handle positional arguments (auto-detect names)
|
| 459 |
+
for arg in args:
|
| 460 |
+
if isinstance(arg, bool):
|
| 461 |
+
var_name = self._get_variable_name(arg, frame_depth=2)
|
| 462 |
+
self._inspect_bool(arg, var_name)
|
| 463 |
+
else:
|
| 464 |
+
var_type = type(arg).__name__
|
| 465 |
+
var_name = self._get_variable_name(arg, frame_depth=2)
|
| 466 |
+
self.log(f"{var_name} is not a boolean (got {var_type})", "WARNING")
|
| 467 |
+
|
| 468 |
+
# Handle keyword arguments (custom names)
|
| 469 |
+
for name, value in kwargs.items():
|
| 470 |
+
if isinstance(value, bool):
|
| 471 |
+
self._inspect_bool(value, name)
|
| 472 |
+
else:
|
| 473 |
+
var_type = type(value).__name__
|
| 474 |
+
self.log(f"{name} is not a boolean (got {var_type})", "WARNING")
|
| 475 |
+
|
| 476 |
+
def _inspect_bool(self, boolean, var_name):
|
| 477 |
+
value_str = str(boolean)
|
| 478 |
+
self.log(f"{var_name} (bool) = {value_str}", "VAR")
|
| 479 |
+
|
| 480 |
+
def var_num(self, *args, **kwargs):
|
| 481 |
+
# Handle positional arguments (auto-detect names)
|
| 482 |
+
for arg in args:
|
| 483 |
+
if isinstance(arg, (int, float)):
|
| 484 |
+
var_name = self._get_variable_name(arg, frame_depth=2)
|
| 485 |
+
self._inspect_num(arg, var_name)
|
| 486 |
+
else:
|
| 487 |
+
var_type = type(arg).__name__
|
| 488 |
+
var_name = self._get_variable_name(arg, frame_depth=2)
|
| 489 |
+
self.log(f"{var_name} is not a number (got {var_type})", "WARNING")
|
| 490 |
+
|
| 491 |
+
# Handle keyword arguments (custom names)
|
| 492 |
+
for name, value in kwargs.items():
|
| 493 |
+
if isinstance(value, (int, float)):
|
| 494 |
+
self._inspect_num(value, name)
|
| 495 |
+
else:
|
| 496 |
+
var_type = type(value).__name__
|
| 497 |
+
self.log(f"{name} is not a number (got {var_type})", "WARNING")
|
| 498 |
+
|
| 499 |
+
def _inspect_num(self, number, var_name):
|
| 500 |
+
num_type = "int" if isinstance(number, int) else "float"
|
| 501 |
+
self.log(f"{var_name} ({num_type}) = {number}", "VAR")
|
| 502 |
+
|
| 503 |
+
def var_str(self, *args, **kwargs):
|
| 504 |
+
# Handle positional arguments (auto-detect names)
|
| 505 |
+
for arg in args:
|
| 506 |
+
if isinstance(arg, str):
|
| 507 |
+
var_name = self._get_variable_name(arg, frame_depth=2)
|
| 508 |
+
self._inspect_str(arg, var_name)
|
| 509 |
+
else:
|
| 510 |
+
var_type = type(arg).__name__
|
| 511 |
+
var_name = self._get_variable_name(arg, frame_depth=2)
|
| 512 |
+
self.log(f"{var_name} is not a string (got {var_type})", "WARNING")
|
| 513 |
+
|
| 514 |
+
# Handle keyword arguments (custom names)
|
| 515 |
+
for name, value in kwargs.items():
|
| 516 |
+
if isinstance(value, str):
|
| 517 |
+
self._inspect_str(value, name)
|
| 518 |
+
else:
|
| 519 |
+
var_type = type(value).__name__
|
| 520 |
+
self.log(f"{name} is not a string (got {var_type})", "WARNING")
|
| 521 |
+
|
| 522 |
+
def _inspect_str(self, string, var_name):
|
| 523 |
+
self.log(f"{var_name} (str) length={len(string)}", "VAR")
|
| 524 |
+
self.log(f'"{string}"', "VAR")
|
| 525 |
+
|
| 526 |
+
def var_type(self, *args, **kwargs):
|
| 527 |
+
# Handle positional arguments (auto-detect names)
|
| 528 |
+
for arg in args:
|
| 529 |
+
var_name = self._get_variable_name(arg, frame_depth=2)
|
| 530 |
+
self._inspect_type(arg, var_name)
|
| 531 |
+
|
| 532 |
+
# Handle keyword arguments (custom names)
|
| 533 |
+
for name, value in kwargs.items():
|
| 534 |
+
self._inspect_type(value, name)
|
| 535 |
+
|
| 536 |
+
def _inspect_type(self, obj, var_name):
|
| 537 |
+
mro = type(obj).__mro__
|
| 538 |
+
type_names = [t.__name__ for t in mro]
|
| 539 |
+
self.log(f"{var_name} type hierarchy:", "VAR")
|
| 540 |
+
for i, name in enumerate(type_names):
|
| 541 |
+
indent = " " * i
|
| 542 |
+
self.log(f"{indent}└─ {name}", "VAR")
|
Dockerfile
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
FROM python:3.11-slim
|
| 2 |
+
|
| 3 |
+
# Install system dependencies (VLC and FFmpeg)
|
| 4 |
+
RUN apt-get update && apt-get install -y \
|
| 5 |
+
vlc \
|
| 6 |
+
ffmpeg \
|
| 7 |
+
&& rm -rf /var/lib/apt/lists/*
|
| 8 |
+
|
| 9 |
+
# Create non-root user (VLC refuses to run as root by default)
|
| 10 |
+
RUN useradd -m watchparty
|
| 11 |
+
|
| 12 |
+
WORKDIR /app
|
| 13 |
+
|
| 14 |
+
# Copy and install Python dependencies
|
| 15 |
+
COPY requirements.txt ./
|
| 16 |
+
RUN pip install --no-cache-dir -r requirements.txt
|
| 17 |
+
|
| 18 |
+
# Copy backend files and static frontend build (out directory)
|
| 19 |
+
COPY . .
|
| 20 |
+
|
| 21 |
+
# Set permissions so the watchparty user can write and execute, and make /app and /movies writable by any user (Hugging Face Spaces random UID requirement)
|
| 22 |
+
RUN mkdir -p /movies && chmod -R 777 /app /movies && chown -R watchparty:watchparty /app /movies
|
| 23 |
+
|
| 24 |
+
# Switch to non-root user
|
| 25 |
+
USER watchparty
|
| 26 |
+
|
| 27 |
+
# Default environment variables
|
| 28 |
+
ENV BASE_MOVIES_DIR=/movies
|
| 29 |
+
ENV VLC_PASSWORD=pass
|
| 30 |
+
ENV VLC_EXECUTABLE=vlc
|
| 31 |
+
|
| 32 |
+
EXPOSE 7860
|
| 33 |
+
|
| 34 |
+
# Mount your media folder to /movies when running the container
|
| 35 |
+
VOLUME ["/movies"]
|
| 36 |
+
|
| 37 |
+
CMD ["sh", "-c", "uvicorn main:app --host 0.0.0.0 --port ${PORT:-7860}"]
|
README.md
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
title: WatchParty Bridge
|
| 3 |
+
emoji: 🎬
|
| 4 |
+
colorFrom: blue
|
| 5 |
+
colorTo: indigo
|
| 6 |
+
sdk: docker
|
| 7 |
+
app_port: 7860
|
| 8 |
+
pinned: false
|
| 9 |
+
---
|
| 10 |
+
|
| 11 |
+
# tw-watchparty-server (WatchParty Bridge)
|
| 12 |
+
|
| 13 |
+
WatchParty Bridge is a high-performance VLC transcode controller, Twitch streamer, and Media/Download Manager. It provides a unified web dashboard to stream local/downloaded video files to Twitch with fully custom transcode profiles, hot track switching, and an integrated downloader/scraper.
|
| 14 |
+
|
| 15 |
+
---
|
| 16 |
+
|
| 17 |
+
## Key Features
|
| 18 |
+
|
| 19 |
+
### 1. Advanced Twitch Stream & Transcode Customization
|
| 20 |
+
* **Custom Transcode Parameters**: Modify video/audio codecs, presets, samplerates, scaling, and keyframe intervals on the fly.
|
| 21 |
+
* **Default SOUT Preset**: Optimized specifically for Twitch streaming:
|
| 22 |
+
`#transcode{vcodec=h264,vb=3000,scale=Auto,acodec=mp4a,ab=128,channels=2,samplerate=44100,fps=60,soverlay,venc=x264{preset=veryfast,keyint=60}}`
|
| 23 |
+
* **Dynamic Stream Reconfiguration**: Subtitle burn-ins and audio tracks are locked during active transcodes. Our dynamic reconfiguration system lets you switch audio tracks/subtitles by gracefully restarting the stream on the same port in under a second.
|
| 24 |
+
|
| 25 |
+
### 2. Media & Downloader Dashboard
|
| 26 |
+
* **Native In-House Downloader**: Pure Python HTTP/HTTPS chunk-downloader with Zero system daemon dependencies.
|
| 27 |
+
* **Pause & Resume Support**: Utilizes HTTP range requests to pause and resume downloads at any point.
|
| 28 |
+
* **Persistent Sessions**: Download path selections are persisted in `localStorage` and automatically synchronized with the backend.
|
| 29 |
+
* **File Explorer**: Browse files recursively on the host system, delete files, and click **Play** to automatically prepopulate stream startup configurations.
|
| 30 |
+
|
| 31 |
+
### 3. Integrated Acer Movies Scraper
|
| 32 |
+
* **Scraper APIs**: Search movies and TV series directly on `acermovies.fun` from the dashboard.
|
| 33 |
+
* **Season & Episode Selector**: Fetches episodes and displays them in a clean checklist.
|
| 34 |
+
* **Checklist Bulk Download**: Select specific episodes or select the entire season to queue them sequentially with one click.
|
| 35 |
+
* **Silent Background Queues**: All browser alert alerts are muted for seamless background additions.
|
| 36 |
+
|
| 37 |
+
---
|
| 38 |
+
|
| 39 |
+
## Installation & Running
|
| 40 |
+
|
| 41 |
+
### Option 1: Running Locally (Recommended)
|
| 42 |
+
|
| 43 |
+
#### Prerequisites
|
| 44 |
+
1. Install [VLC Media Player](https://www.videolan.org/vlc/). Make sure the `vlc` executable is in your system PATH, or specify its location via the `VLC_EXECUTABLE` environment variable.
|
| 45 |
+
2. Install Python 3.10 or higher.
|
| 46 |
+
|
| 47 |
+
#### Setup & Start
|
| 48 |
+
1. Clone the repository and navigate to the directory:
|
| 49 |
+
```bash
|
| 50 |
+
git clone https://github.com/shubhamakshit/tw-watchparty-web.git
|
| 51 |
+
cd tw-watchparty-web
|
| 52 |
+
```
|
| 53 |
+
2. Install dependencies:
|
| 54 |
+
```bash
|
| 55 |
+
pip install -r requirements.txt
|
| 56 |
+
```
|
| 57 |
+
3. Run the server:
|
| 58 |
+
```bash
|
| 59 |
+
python main.py
|
| 60 |
+
```
|
| 61 |
+
4. Open your browser and navigate to `http://localhost:8000`.
|
| 62 |
+
|
| 63 |
+
---
|
| 64 |
+
|
| 65 |
+
### Option 2: Running with Docker
|
| 66 |
+
|
| 67 |
+
1. Ensure Docker and Docker Compose are installed.
|
| 68 |
+
2. Build and start the containers:
|
| 69 |
+
```bash
|
| 70 |
+
docker-compose up --build
|
| 71 |
+
```
|
| 72 |
+
3. The server will start on port `8000` and map the `./movies` folder to `/movies` inside the container.
|
| 73 |
+
|
| 74 |
+
---
|
| 75 |
+
|
| 76 |
+
## Environment Variables
|
| 77 |
+
|
| 78 |
+
Configure the server behavior using these environment variables (or setting them inside your shell/Docker configs):
|
| 79 |
+
|
| 80 |
+
* `BASE_MOVIES_DIR`: The root directory where files are browsed and downloads are saved (Defaults to the user's home directory `~`).
|
| 81 |
+
* `VLC_PASSWORD`: The Telnet password used by the backend to control VLC instances (Default: `pass`).
|
| 82 |
+
* `VLC_EXECUTABLE`: Path to the VLC executable (Default: `vlc`).
|
| 83 |
+
|
| 84 |
+
---
|
| 85 |
+
|
| 86 |
+
## Frontend Development & Rebuilding
|
| 87 |
+
|
| 88 |
+
The frontend is built using Next.js, Mantine components, and Tabler icons inside the `frontend` folder.
|
| 89 |
+
|
| 90 |
+
If you make modifications to the frontend code and want to package it for distribution:
|
| 91 |
+
1. Run the build packaging script in the root directory:
|
| 92 |
+
```bash
|
| 93 |
+
python build_package.py
|
| 94 |
+
```
|
| 95 |
+
2. The script will automatically compile the Next.js static export and copy the assets to the `out` directory, which is served directly by the Python FastAPI backend.
|
README_DEPLOY.md
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Deploying the WatchParty Bridge to a Home Server
|
| 2 |
+
|
| 3 |
+
This guide explains how to package the Next.js frontend and FastAPI backend into a single, unified package and deploy it on your home server (either directly with Python or via Docker).
|
| 4 |
+
|
| 5 |
+
---
|
| 6 |
+
|
| 7 |
+
## Part 1: How Subtitles Work (Updated)
|
| 8 |
+
We have added support for **burning subtitles directly into the Twitch stream**.
|
| 9 |
+
* In the UI, selecting a **Subtitle Track** will send the track index to the backend.
|
| 10 |
+
* The backend automatically appends the `,soverlay` parameter to VLC's `#transcode` block.
|
| 11 |
+
* VLC will burn (render) the selected subtitle track directly onto the video frames before streaming to Twitch.
|
| 12 |
+
|
| 13 |
+
---
|
| 14 |
+
|
| 15 |
+
## Part 2: Packaging the Application (Single Port Setup)
|
| 16 |
+
We have configured Next.js to build as a static export, and FastAPI to host these static files directly. This means **both the frontend and backend run on a single port (e.g. 8000)**.
|
| 17 |
+
|
| 18 |
+
To compile the frontend and copy it into the backend folder:
|
| 19 |
+
1. Open a terminal.
|
| 20 |
+
2. Navigate to the `tw-watchparty-server` directory.
|
| 21 |
+
3. Run the automated build script:
|
| 22 |
+
```bash
|
| 23 |
+
python build_package.py
|
| 24 |
+
```
|
| 25 |
+
This script will build the Next.js app and copy the static build output into a folder named `out` in the FastAPI directory.
|
| 26 |
+
|
| 27 |
+
---
|
| 28 |
+
|
| 29 |
+
## Part 3: Deployment Options
|
| 30 |
+
|
| 31 |
+
### Option A: Running Directly with Python
|
| 32 |
+
After running `build_package.py`, you can start the unified server using `uvicorn`:
|
| 33 |
+
|
| 34 |
+
```bash
|
| 35 |
+
uvicorn main:app --host 0.0.0.0 --port 8000
|
| 36 |
+
```
|
| 37 |
+
* Access the dashboard from any device on your local network: `http://<your-server-ip>:8000`
|
| 38 |
+
|
| 39 |
+
---
|
| 40 |
+
|
| 41 |
+
### Option B: Running with Docker / Docker Compose
|
| 42 |
+
We have included a `Dockerfile` and `docker-compose.yml` for containerized deployment.
|
| 43 |
+
|
| 44 |
+
1. Package the build first:
|
| 45 |
+
```bash
|
| 46 |
+
python build_package.py
|
| 47 |
+
```
|
| 48 |
+
2. Open `docker-compose.yml` and adjust the local path to your movies directory:
|
| 49 |
+
```yaml
|
| 50 |
+
volumes:
|
| 51 |
+
- /path/to/your/movies/on/server:/movies
|
| 52 |
+
```
|
| 53 |
+
3. Start the container in the background:
|
| 54 |
+
```bash
|
| 55 |
+
docker compose up -d --build
|
| 56 |
+
```
|
| 57 |
+
|
| 58 |
+
Note: VLC has a built-in security policy that blocks running as `root` inside Docker. The provided `Dockerfile` creates a dedicated, non-root `watchparty` user automatically to ensure VLC starts up safely.
|
| 59 |
+
|
| 60 |
+
---
|
| 61 |
+
|
| 62 |
+
## Part 4: Configuration Options
|
| 63 |
+
You can configure the server using environment variables (which are pre-configured in the Docker setup):
|
| 64 |
+
|
| 65 |
+
| Variable | Description | Default |
|
| 66 |
+
| --- | --- | --- |
|
| 67 |
+
| `BASE_MOVIES_DIR` | Directory containing your movies | `C:\Users\Administrator\Downloads` |
|
| 68 |
+
| `VLC_PASSWORD` | Password for VLC Telnet/HTTP interfaces | `pass` |
|
| 69 |
+
| `VLC_EXECUTABLE` | Path to the VLC executable | `vlc` |
|
app.2.py
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
|
| 3 |
+
from textual.app import App, ComposeResult
|
| 4 |
+
from textual.containers import HorizontalGroup, Grid
|
| 5 |
+
from textual.screen import ModalScreen
|
| 6 |
+
from textual.widgets import Footer, Header, OptionList, Label
|
| 7 |
+
from textual.containers import HorizontalGroup, VerticalScroll
|
| 8 |
+
from textual.widgets import Button, Digits, Footer, Header
|
| 9 |
+
from textual.widgets._option_list import Option
|
| 10 |
+
|
| 11 |
+
|
| 12 |
+
class FileSelectorDialog(ModalScreen):
|
| 13 |
+
|
| 14 |
+
def compose(self) -> ComposeResult:
|
| 15 |
+
yield Grid(
|
| 16 |
+
Label("Select a file:"),
|
| 17 |
+
OptionList(
|
| 18 |
+
Option("Aerilon", id="aer"),
|
| 19 |
+
Option("Aquaria", id="aqu"),
|
| 20 |
+
None,
|
| 21 |
+
Option("Canceron", id="can"),
|
| 22 |
+
Option("Caprica", id="cap", disabled=True),
|
| 23 |
+
None,
|
| 24 |
+
Option("Gemenon", id="gem"),
|
| 25 |
+
None,
|
| 26 |
+
Option("Leonis", id="leo"),
|
| 27 |
+
Option("Libran", id="lib"),
|
| 28 |
+
None,
|
| 29 |
+
Option("Picon", id="pic"),
|
| 30 |
+
None,
|
| 31 |
+
Option("Sagittaron", id="sag"),
|
| 32 |
+
Option("Scorpia", id="sco"),
|
| 33 |
+
None,
|
| 34 |
+
Option("Tauron", id="tau"),
|
| 35 |
+
None,
|
| 36 |
+
Option("Virgon", id="vir"),
|
| 37 |
+
)
|
| 38 |
+
,
|
| 39 |
+
|
| 40 |
+
Grid(
|
| 41 |
+
Button("Open", id="open"),
|
| 42 |
+
Button("Cancel", id="cancel"),
|
| 43 |
+
id = "dialog-buttons"
|
| 44 |
+
),
|
| 45 |
+
id = "dialog"
|
| 46 |
+
)
|
| 47 |
+
|
| 48 |
+
|
| 49 |
+
class StopwatchApp(App):
|
| 50 |
+
"""A Textual app to manage stopwatches."""
|
| 51 |
+
|
| 52 |
+
CSS_PATH = "app.css"
|
| 53 |
+
BINDINGS = [("d", "toggle_dark", "Toggle dark mode")]
|
| 54 |
+
|
| 55 |
+
|
| 56 |
+
|
| 57 |
+
|
| 58 |
+
def compose(self) -> ComposeResult:
|
| 59 |
+
"""Create child widgets for the app."""
|
| 60 |
+
|
| 61 |
+
|
| 62 |
+
yield Header()
|
| 63 |
+
yield Footer()
|
| 64 |
+
|
| 65 |
+
|
| 66 |
+
def action_toggle_dark(self) -> None:
|
| 67 |
+
"""An action to toggle dark mode."""
|
| 68 |
+
self.push_screen(FileSelectorDialog())
|
| 69 |
+
|
| 70 |
+
|
| 71 |
+
if __name__ == "__main__":
|
| 72 |
+
app = StopwatchApp()
|
| 73 |
+
app.run()
|
app.css
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Stopwatch {
|
| 2 |
+
background: $boost;
|
| 3 |
+
height: 5;
|
| 4 |
+
margin: 1;
|
| 5 |
+
min-width: 50;
|
| 6 |
+
padding: 1;
|
| 7 |
+
}
|
| 8 |
+
|
| 9 |
+
Screen{
|
| 10 |
+
layout: grid;
|
| 11 |
+
grid-size: 3 3;
|
| 12 |
+
grid-gutter: 1;
|
| 13 |
+
|
| 14 |
+
}
|
| 15 |
+
|
| 16 |
+
TimeDisplay {
|
| 17 |
+
text-align: center;
|
| 18 |
+
color: $foreground-muted;
|
| 19 |
+
height: 3;
|
| 20 |
+
}
|
| 21 |
+
|
| 22 |
+
TimeDisplay#hover{
|
| 23 |
+
color:green;
|
| 24 |
+
}
|
| 25 |
+
|
| 26 |
+
Button {
|
| 27 |
+
width: 10;
|
| 28 |
+
}
|
| 29 |
+
|
| 30 |
+
#start {
|
| 31 |
+
dock: left;
|
| 32 |
+
}
|
| 33 |
+
|
| 34 |
+
#stop {
|
| 35 |
+
dock: left;
|
| 36 |
+
display: none;
|
| 37 |
+
}
|
| 38 |
+
|
| 39 |
+
#reset {
|
| 40 |
+
dock: right;
|
| 41 |
+
}
|
| 42 |
+
|
| 43 |
+
.started {
|
| 44 |
+
background: $success-muted;
|
| 45 |
+
color: $text;
|
| 46 |
+
}
|
| 47 |
+
|
| 48 |
+
.started TimeDisplay {
|
| 49 |
+
color: $foreground;
|
| 50 |
+
}
|
| 51 |
+
|
| 52 |
+
.started #start {
|
| 53 |
+
display: none
|
| 54 |
+
}
|
| 55 |
+
|
| 56 |
+
.started #stop {
|
| 57 |
+
display: block
|
| 58 |
+
}
|
| 59 |
+
|
| 60 |
+
.started #reset {
|
| 61 |
+
visibility: hidden
|
| 62 |
+
}
|
| 63 |
+
|
| 64 |
+
#dialog{
|
| 65 |
+
|
| 66 |
+
row-span:2;
|
| 67 |
+
column-span:1;
|
| 68 |
+
align: center middle;
|
| 69 |
+
grid-gutter: 1 2;
|
| 70 |
+
grid-rows: 1fr 3;
|
| 71 |
+
padding: 0 1;
|
| 72 |
+
width: 60;
|
| 73 |
+
height: 30;
|
| 74 |
+
border: thick $background 80%;
|
| 75 |
+
background: $surface;
|
| 76 |
+
}
|
| 77 |
+
|
| 78 |
+
|
| 79 |
+
#dialog-buttons{
|
| 80 |
+
grid-size:2;
|
| 81 |
+
}
|
app.py
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import asyncio
|
| 2 |
+
import telnetlib
|
| 3 |
+
|
| 4 |
+
HOST = "localhost"
|
| 5 |
+
PORT = 4200
|
| 6 |
+
password = "pass"
|
| 7 |
+
|
| 8 |
+
|
| 9 |
+
async def vlc():
|
| 10 |
+
print("Launching VLC...")
|
| 11 |
+
# Use asyncio's native non-blocking subprocess creator
|
| 12 |
+
process = await asyncio.create_subprocess_exec(
|
| 13 |
+
"vlc",
|
| 14 |
+
r"C:\Users\Administrator\Downloads\bbb_sunflower_1080p_30fps_normal.mp4\bbb_sunflower_1080p_30fps_normal.mp4",
|
| 15 |
+
"--loop",
|
| 16 |
+
r"--sout=#transcode{vcodec=h264,vb=2000,acodec=aac,ab=128,channels=2,soverlay,fps=30,soverlay}:std{access=rtmp,mux=ffmpeg{mux=flv},dst=rtmp://live.twitch.tv/app/live_1518336715_CrQoiygeCkDolYIZ0eF5ZJBFHA1e0i}",
|
| 17 |
+
"--intf",
|
| 18 |
+
"telnet",
|
| 19 |
+
"--telnet-password",
|
| 20 |
+
"pass",
|
| 21 |
+
"-vv",
|
| 22 |
+
|
| 23 |
+
"--telnet-port",
|
| 24 |
+
"4200",
|
| 25 |
+
"--extraintf",
|
| 26 |
+
"http",
|
| 27 |
+
"--http-password",
|
| 28 |
+
"pass",
|
| 29 |
+
"--no-sout-all",
|
| 30 |
+
"--sout-keep",
|
| 31 |
+
# This keeps stdout/stderr flowing without blocking your loop
|
| 32 |
+
stdout=asyncio.subprocess.PIPE,
|
| 33 |
+
stderr=asyncio.subprocess.PIPE
|
| 34 |
+
)
|
| 35 |
+
|
| 36 |
+
|
| 37 |
+
# Optional: Read logs asynchronously so they don't block
|
| 38 |
+
|
| 39 |
+
while True:
|
| 40 |
+
line = await process.stderr.readline()
|
| 41 |
+
if not line:
|
| 42 |
+
break
|
| 43 |
+
print(f"[VLC] {line.decode().strip()}")
|
| 44 |
+
|
| 45 |
+
|
| 46 |
+
async def tl():
|
| 47 |
+
# Now this will actually count down while VLC is running!
|
| 48 |
+
print("Waiting 5 seconds for VLC to start...")
|
| 49 |
+
await asyncio.sleep(5)
|
| 50 |
+
print("Connecting to VLC via Telnet...")
|
| 51 |
+
|
| 52 |
+
try:
|
| 53 |
+
tn = telnetlib.Telnet(HOST, PORT)
|
| 54 |
+
|
| 55 |
+
if password:
|
| 56 |
+
tn.read_until(b"Password: ")
|
| 57 |
+
tn.write(password.encode('ascii') + b"\n")
|
| 58 |
+
|
| 59 |
+
tn.read_until(b"> ")
|
| 60 |
+
|
| 61 |
+
tn.write(b"help\n")
|
| 62 |
+
|
| 63 |
+
output = tn.read_until(b"> ")
|
| 64 |
+
print(output.decode('ascii'))
|
| 65 |
+
|
| 66 |
+
tn.close()
|
| 67 |
+
except ConnectionRefusedError:
|
| 68 |
+
print("Error: Could not connect to VLC. Is the port open?")
|
| 69 |
+
|
| 70 |
+
|
| 71 |
+
async def main():
|
| 72 |
+
# Now gather will actually run them concurrently
|
| 73 |
+
await asyncio.gather(vlc(), tl())
|
| 74 |
+
|
| 75 |
+
|
| 76 |
+
asyncio.run(main())
|
docker-compose.yml
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version: '3.8'
|
| 2 |
+
|
| 3 |
+
services:
|
| 4 |
+
watchparty:
|
| 5 |
+
build: .
|
| 6 |
+
container_name: watchparty-bridge
|
| 7 |
+
ports:
|
| 8 |
+
- "7860:7860"
|
| 9 |
+
# Expose dynamic ports if you want to inspect VLC HTTP/Telnet directly:
|
| 10 |
+
# - "4200-4250:4200-4250"
|
| 11 |
+
environment:
|
| 12 |
+
- BASE_MOVIES_DIR=/movies
|
| 13 |
+
- VLC_PASSWORD=pass
|
| 14 |
+
volumes:
|
| 15 |
+
# Replace the left path with the absolute path to your movies folder on your host server
|
| 16 |
+
- ./movies:/movies
|
| 17 |
+
restart: unless-stopped
|
glv.py
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from colorama import Fore, Style, init
|
| 2 |
+
import glv_var
|
| 3 |
+
import shutil
|
| 4 |
+
|
| 5 |
+
|
| 6 |
+
|
| 7 |
+
# Initialize colorama
|
| 8 |
+
init()
|
| 9 |
+
|
| 10 |
+
class Global:
|
| 11 |
+
|
| 12 |
+
# PREFERENCES_FILE is currently not used in mainLogic Project
|
| 13 |
+
# only used in beta project
|
| 14 |
+
import os
|
| 15 |
+
disable_hr = False
|
| 16 |
+
|
| 17 |
+
def __init__(self, vout=True, outDir="./"):
|
| 18 |
+
self.outDir = outDir
|
| 19 |
+
self.vout = vout
|
| 20 |
+
|
| 21 |
+
@staticmethod
|
| 22 |
+
def set_color(color, style=None):
|
| 23 |
+
"""Prints text in the specified color and style."""
|
| 24 |
+
print(getattr(Fore, color), end="")
|
| 25 |
+
if style:
|
| 26 |
+
print(getattr(Style, style), end="")
|
| 27 |
+
|
| 28 |
+
@staticmethod
|
| 29 |
+
def reset():
|
| 30 |
+
"""Resets text color and style to defaults."""
|
| 31 |
+
print(Style.RESET_ALL, end="")
|
| 32 |
+
|
| 33 |
+
@staticmethod
|
| 34 |
+
def print_colored(text, color, style=None):
|
| 35 |
+
"""Prints text in the specified color and style, resetting afterward."""
|
| 36 |
+
Global.set_color(color, style)
|
| 37 |
+
print(text)
|
| 38 |
+
Global.reset()
|
| 39 |
+
|
| 40 |
+
@staticmethod
|
| 41 |
+
def dprint(text):
|
| 42 |
+
"""Prints debug text in yellow."""
|
| 43 |
+
Global.print_colored(text, "YELLOW")
|
| 44 |
+
|
| 45 |
+
@staticmethod
|
| 46 |
+
def errprint(text):
|
| 47 |
+
"""Prints error text in red."""
|
| 48 |
+
Global.print_colored(text, "RED")
|
| 49 |
+
|
| 50 |
+
@staticmethod
|
| 51 |
+
def setDebug():
|
| 52 |
+
"""Sets the text color to yellow (for debugging)."""
|
| 53 |
+
Global.set_color("YELLOW")
|
| 54 |
+
|
| 55 |
+
@staticmethod
|
| 56 |
+
def setSuccess():
|
| 57 |
+
"""Sets the text color to green (for success messages)."""
|
| 58 |
+
Global.set_color("GREEN")
|
| 59 |
+
|
| 60 |
+
@staticmethod
|
| 61 |
+
def sprint(text):
|
| 62 |
+
"""Prints success text in green."""
|
| 63 |
+
Global.print_colored(text, "GREEN")
|
| 64 |
+
|
| 65 |
+
@staticmethod
|
| 66 |
+
def hr():
|
| 67 |
+
|
| 68 |
+
# Disable horizontal rule if set
|
| 69 |
+
if Global.disable_hr:
|
| 70 |
+
return
|
| 71 |
+
|
| 72 |
+
"""Fills the entire terminal with = (one row only)."""
|
| 73 |
+
columns, _ = shutil.get_terminal_size()
|
| 74 |
+
print("-" * columns)
|
glv_var.py
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# defining some variables that can be used in the preferences file
|
| 2 |
+
import os
|
| 3 |
+
|
| 4 |
+
from Debugger import Debugger
|
| 5 |
+
import os
|
| 6 |
+
|
| 7 |
+
class BasicUtils:
|
| 8 |
+
|
| 9 |
+
@staticmethod
|
| 10 |
+
def delete_old_files(directory, minutes):
|
| 11 |
+
"""
|
| 12 |
+
Delete files in the given directory which are older than the given number of minutes.
|
| 13 |
+
"""
|
| 14 |
+
import time
|
| 15 |
+
|
| 16 |
+
current_time = time.time()
|
| 17 |
+
|
| 18 |
+
for file in os.listdir(directory):
|
| 19 |
+
file_path = os.path.join(directory, file)
|
| 20 |
+
|
| 21 |
+
if os.path.isfile(file_path):
|
| 22 |
+
file_time = os.path.getmtime(file_path)
|
| 23 |
+
|
| 24 |
+
if current_time - file_time >= minutes * 60:
|
| 25 |
+
os.remove(file_path)
|
| 26 |
+
|
| 27 |
+
@staticmethod
|
| 28 |
+
def abspath(path):
|
| 29 |
+
return str(os.path.abspath(os.path.expandvars(path))).replace("\\", "/")
|
| 30 |
+
|
| 31 |
+
vars = {
|
| 32 |
+
|
| 33 |
+
# $script is the path to the folder containing the pwdl.py file
|
| 34 |
+
# Since the userPrefs.py is in the startup folder,
|
| 35 |
+
# we need to go one level up however we make the exception that if the pwdl.py is in the same folder as
|
| 36 |
+
# the startup folder, we don't need to go one level up
|
| 37 |
+
"$script": BasicUtils.abspath(os.path.dirname(__file__) + (
|
| 38 |
+
'/../..' if not os.path.exists(os.path.dirname(__file__) + '../pwdl.py') else '')),
|
| 39 |
+
"$home": os.path.expanduser("~") if os.name == 'posix' else os.getenv('USERPROFILE'),
|
| 40 |
+
}
|
| 41 |
+
|
| 42 |
+
debugger = Debugger(enabled=True,show_location=True)
|
| 43 |
+
|
| 44 |
+
env_file = os.getenv('PWDL_PREF_FILE')
|
| 45 |
+
sys_verbose = os.getenv('PWDL_VERBOSE')
|
| 46 |
+
if env_file and os.path.exists(env_file):
|
| 47 |
+
if sys_verbose: print(f"Using preferences file: {env_file}")
|
| 48 |
+
PREFS_FILE = env_file
|
| 49 |
+
else:
|
| 50 |
+
if sys_verbose: print(f"Using default preferences file: {os.path.join(vars['$script'], 'preferences.json')}")
|
| 51 |
+
PREFS_FILE = os.path.join(vars["$script"], 'preferences.json')
|
| 52 |
+
|
| 53 |
+
api_webdl_directory = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../webdl'))
|
| 54 |
+
EXECUTABLES = ['ffmpeg', 'mp4decrypt']
|
| 55 |
+
|
| 56 |
+
|
| 57 |
+
MINIMUM_PORT = 1024
|
| 58 |
+
|
| 59 |
+
class ENDPOINTS_NAME:
|
| 60 |
+
|
| 61 |
+
base = 'api'
|
| 62 |
+
|
| 63 |
+
@staticmethod
|
| 64 |
+
def GET_PVT_FILE_FOR_A_CLIENT(client_id="<client_id>",name="<name>"):
|
| 65 |
+
return f"/{ENDPOINTS_NAME.base}/get-private-file/{client_id}/{name}"
|
| 66 |
+
|
main.py
ADDED
|
@@ -0,0 +1,1382 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import asyncio
|
| 2 |
+
import os
|
| 3 |
+
import shutil
|
| 4 |
+
import subprocess
|
| 5 |
+
import socket
|
| 6 |
+
import time
|
| 7 |
+
import uuid
|
| 8 |
+
from collections import deque
|
| 9 |
+
from pathlib import Path
|
| 10 |
+
from typing import Dict, List, Optional
|
| 11 |
+
from urllib.parse import urlparse, unquote
|
| 12 |
+
import re
|
| 13 |
+
import unicodedata
|
| 14 |
+
|
| 15 |
+
import telnetlib
|
| 16 |
+
import requests
|
| 17 |
+
from fastapi import FastAPI, HTTPException
|
| 18 |
+
from fastapi.middleware.cors import CORSMiddleware
|
| 19 |
+
from pydantic import BaseModel, Field
|
| 20 |
+
|
| 21 |
+
# ---------------- Config ----------------
|
| 22 |
+
|
| 23 |
+
default_movies_dir = Path.home()
|
| 24 |
+
|
| 25 |
+
BASE_MOVIES_DIR = Path(os.getenv("BASE_MOVIES_DIR", default_movies_dir)).resolve()
|
| 26 |
+
PASSWORD = os.getenv("VLC_PASSWORD", "pass")
|
| 27 |
+
TELNET_HOST = "localhost"
|
| 28 |
+
VLC_EXECUTABLE = os.getenv("VLC_EXECUTABLE", "vlc")
|
| 29 |
+
|
| 30 |
+
|
| 31 |
+
class SimpleDownload:
|
| 32 |
+
def __init__(self, url: str):
|
| 33 |
+
self.gid = str(uuid.uuid4())[:16]
|
| 34 |
+
self.url = url
|
| 35 |
+
self.status = "waiting" # waiting, active, paused, complete, error, removed
|
| 36 |
+
self.total_length = 0
|
| 37 |
+
self.completed_length = 0
|
| 38 |
+
self.download_speed = 0
|
| 39 |
+
self.download_speed_str = "0 B/s"
|
| 40 |
+
self.eta = "—"
|
| 41 |
+
self.name = ""
|
| 42 |
+
self.error_message = ""
|
| 43 |
+
self.file_path = None
|
| 44 |
+
self._cancel_event = False
|
| 45 |
+
self._pause_event = False
|
| 46 |
+
|
| 47 |
+
|
| 48 |
+
class InHouseDownloader:
|
| 49 |
+
def __init__(self):
|
| 50 |
+
self.downloads = {} # gid -> SimpleDownload
|
| 51 |
+
self._tasks = {} # gid -> asyncio.Task
|
| 52 |
+
|
| 53 |
+
def get_downloads(self):
|
| 54 |
+
return list(self.downloads.values())
|
| 55 |
+
|
| 56 |
+
def get_download(self, gid: str):
|
| 57 |
+
return self.downloads.get(gid)
|
| 58 |
+
|
| 59 |
+
def add(self, url: str, filename: Optional[str] = None, subfolder: Optional[str] = None):
|
| 60 |
+
dl = SimpleDownload(url)
|
| 61 |
+
|
| 62 |
+
if filename:
|
| 63 |
+
name = sanitize_filename(filename)
|
| 64 |
+
else:
|
| 65 |
+
parsed = urlparse(url)
|
| 66 |
+
name = os.path.basename(unquote(parsed.path))
|
| 67 |
+
if not name:
|
| 68 |
+
name = "download_" + dl.gid
|
| 69 |
+
|
| 70 |
+
dl.name = name
|
| 71 |
+
|
| 72 |
+
target_dir = BASE_MOVIES_DIR
|
| 73 |
+
if subfolder:
|
| 74 |
+
# Allow nested directories by splitting on slashes
|
| 75 |
+
parts = [re.sub(r'[?:*""<>|]', "", p).strip() for p in re.split(r'[\\/]', subfolder)]
|
| 76 |
+
parts = [p for p in parts if p]
|
| 77 |
+
if parts:
|
| 78 |
+
target_dir = BASE_MOVIES_DIR.joinpath(*parts)
|
| 79 |
+
target_dir.mkdir(parents=True, exist_ok=True)
|
| 80 |
+
|
| 81 |
+
dl.file_path = target_dir / name
|
| 82 |
+
self.downloads[dl.gid] = dl
|
| 83 |
+
|
| 84 |
+
# Start download task
|
| 85 |
+
self.resume(dl.gid)
|
| 86 |
+
return dl
|
| 87 |
+
|
| 88 |
+
def pause(self, gid: str):
|
| 89 |
+
dl = self.downloads.get(gid)
|
| 90 |
+
if dl and dl.status == "active":
|
| 91 |
+
dl.status = "paused"
|
| 92 |
+
dl._pause_event = True
|
| 93 |
+
|
| 94 |
+
def resume(self, gid: str):
|
| 95 |
+
dl = self.downloads.get(gid)
|
| 96 |
+
if not dl:
|
| 97 |
+
return
|
| 98 |
+
|
| 99 |
+
dl.status = "active"
|
| 100 |
+
dl._pause_event = False
|
| 101 |
+
dl._cancel_event = False
|
| 102 |
+
|
| 103 |
+
task = asyncio.create_task(self._download_loop(dl))
|
| 104 |
+
self._tasks[dl.gid] = task
|
| 105 |
+
|
| 106 |
+
def remove(self, gid: str):
|
| 107 |
+
dl = self.downloads.get(gid)
|
| 108 |
+
if dl:
|
| 109 |
+
dl.status = "removed"
|
| 110 |
+
dl._cancel_event = True
|
| 111 |
+
if dl.file_path and dl.file_path.exists():
|
| 112 |
+
try:
|
| 113 |
+
dl.file_path.unlink()
|
| 114 |
+
except Exception:
|
| 115 |
+
pass
|
| 116 |
+
self.downloads.pop(gid, None)
|
| 117 |
+
self._tasks.pop(gid, None)
|
| 118 |
+
|
| 119 |
+
def autopurge(self):
|
| 120 |
+
to_purge = [gid for gid, dl in self.downloads.items() if dl.status in ("complete", "error", "removed")]
|
| 121 |
+
for gid in to_purge:
|
| 122 |
+
self.downloads.pop(gid, None)
|
| 123 |
+
self._tasks.pop(gid, None)
|
| 124 |
+
|
| 125 |
+
async def _download_loop(self, dl: SimpleDownload):
|
| 126 |
+
try:
|
| 127 |
+
headers = {}
|
| 128 |
+
if dl.completed_length > 0:
|
| 129 |
+
headers["Range"] = f"bytes={dl.completed_length}-"
|
| 130 |
+
|
| 131 |
+
response = await asyncio.to_thread(
|
| 132 |
+
requests.get,
|
| 133 |
+
dl.url,
|
| 134 |
+
headers=headers,
|
| 135 |
+
stream=True,
|
| 136 |
+
timeout=15,
|
| 137 |
+
)
|
| 138 |
+
|
| 139 |
+
if "content-disposition" in response.headers:
|
| 140 |
+
cd = response.headers["content-disposition"]
|
| 141 |
+
for part in cd.split(";"):
|
| 142 |
+
if "filename=" in part:
|
| 143 |
+
dl.name = part.split("=")[1].strip('"\'')
|
| 144 |
+
parent_dir = dl.file_path.parent if dl.file_path else BASE_MOVIES_DIR
|
| 145 |
+
dl.file_path = parent_dir / dl.name
|
| 146 |
+
|
| 147 |
+
is_resume = response.status_code == 206
|
| 148 |
+
if not is_resume and dl.completed_length > 0:
|
| 149 |
+
dl.completed_length = 0
|
| 150 |
+
|
| 151 |
+
if "content-length" in response.headers:
|
| 152 |
+
total_len = int(response.headers["content-length"])
|
| 153 |
+
dl.total_length = total_len + (dl.completed_length if is_resume else 0)
|
| 154 |
+
|
| 155 |
+
mode = "ab" if (is_resume and dl.file_path.exists()) else "wb"
|
| 156 |
+
|
| 157 |
+
start_time = time.time()
|
| 158 |
+
bytes_since_start = 0
|
| 159 |
+
|
| 160 |
+
with open(dl.file_path, mode) as f:
|
| 161 |
+
for chunk in response.iter_content(chunk_size=128 * 1024):
|
| 162 |
+
if dl._cancel_event or dl.status == "removed":
|
| 163 |
+
return
|
| 164 |
+
if dl._pause_event or dl.status == "paused":
|
| 165 |
+
return
|
| 166 |
+
|
| 167 |
+
if chunk:
|
| 168 |
+
f.write(chunk)
|
| 169 |
+
dl.completed_length += len(chunk)
|
| 170 |
+
bytes_since_start += len(chunk)
|
| 171 |
+
|
| 172 |
+
elapsed = time.time() - start_time
|
| 173 |
+
if elapsed > 0.5:
|
| 174 |
+
dl.download_speed = bytes_since_start / elapsed
|
| 175 |
+
speed = dl.download_speed
|
| 176 |
+
if speed >= 1024**2:
|
| 177 |
+
dl.download_speed_str = f"{speed / 1024**2:.2f} MB/s"
|
| 178 |
+
elif speed >= 1024:
|
| 179 |
+
dl.download_speed_str = f"{speed / 1024:.2f} KB/s"
|
| 180 |
+
else:
|
| 181 |
+
dl.download_speed_str = f"{speed:.2f} B/s"
|
| 182 |
+
|
| 183 |
+
remaining = dl.total_length - dl.completed_length
|
| 184 |
+
if remaining > 0 and dl.download_speed > 0:
|
| 185 |
+
eta_secs = int(remaining / dl.download_speed)
|
| 186 |
+
if eta_secs >= 3600:
|
| 187 |
+
dl.eta = f"{eta_secs // 3600}h {(eta_secs % 3600) // 60}m"
|
| 188 |
+
elif eta_secs >= 60:
|
| 189 |
+
dl.eta = f"{eta_secs // 60}m {eta_secs % 60}s"
|
| 190 |
+
else:
|
| 191 |
+
dl.eta = f"{eta_secs}s"
|
| 192 |
+
else:
|
| 193 |
+
dl.eta = "0s"
|
| 194 |
+
|
| 195 |
+
await asyncio.sleep(0.001)
|
| 196 |
+
|
| 197 |
+
dl.status = "complete"
|
| 198 |
+
dl.download_speed_str = "0 B/s"
|
| 199 |
+
dl.eta = "done"
|
| 200 |
+
|
| 201 |
+
except Exception as e:
|
| 202 |
+
dl.status = "error"
|
| 203 |
+
dl.error_message = str(e)
|
| 204 |
+
dl.download_speed_str = "0 B/s"
|
| 205 |
+
dl.eta = "—"
|
| 206 |
+
|
| 207 |
+
|
| 208 |
+
aria2_manager = InHouseDownloader()
|
| 209 |
+
|
| 210 |
+
app = FastAPI(title="VLC Control API", debug=True)
|
| 211 |
+
|
| 212 |
+
app.add_middleware(
|
| 213 |
+
CORSMiddleware,
|
| 214 |
+
allow_origins=["*"],
|
| 215 |
+
allow_methods=["*"],
|
| 216 |
+
allow_headers=["*"],
|
| 217 |
+
)
|
| 218 |
+
|
| 219 |
+
# ---------------- Utilities ----------------
|
| 220 |
+
|
| 221 |
+
def find_free_port() -> int:
|
| 222 |
+
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
|
| 223 |
+
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
| 224 |
+
s.bind(("localhost", 0))
|
| 225 |
+
return s.getsockname()[1]
|
| 226 |
+
|
| 227 |
+
|
| 228 |
+
# ---------------- Models ----------------
|
| 229 |
+
|
| 230 |
+
class StartVLCRequest(BaseModel):
|
| 231 |
+
video_path: str = Field(..., description="Path relative to BASE_MOVIES_DIR, or absolute")
|
| 232 |
+
stream_key: Optional[str] = Field(None, description="Twitch stream key")
|
| 233 |
+
rtmp_url: Optional[str] = Field(None, description="Full RTMP dst, overrides stream_key")
|
| 234 |
+
loop: bool = True
|
| 235 |
+
video_bitrate: int = 3000
|
| 236 |
+
audio_bitrate: int = 128
|
| 237 |
+
fps: int = 60
|
| 238 |
+
name: Optional[str] = None
|
| 239 |
+
audio_track: Optional[int] = Field(None, description="Audio track index (0 to n)")
|
| 240 |
+
sub_track: Optional[int] = Field(None, description="Subtitle track index (0 to n)")
|
| 241 |
+
scale: str = "Auto"
|
| 242 |
+
vcodec: str = "h264"
|
| 243 |
+
acodec: str = "mp4a"
|
| 244 |
+
samplerate: int = 44100
|
| 245 |
+
preset: str = "veryfast"
|
| 246 |
+
keyint: int = 60
|
| 247 |
+
start_time: Optional[int] = Field(None, description="Start playback time in seconds")
|
| 248 |
+
sort_by: Optional[str] = Field(None, description="Sorting logic for folders (natural, ctime_oldest, ctime_newest)")
|
| 249 |
+
|
| 250 |
+
|
| 251 |
+
class InstanceInfo(BaseModel):
|
| 252 |
+
id: str
|
| 253 |
+
name: str
|
| 254 |
+
pid: Optional[int]
|
| 255 |
+
telnet_port: int
|
| 256 |
+
http_port: int
|
| 257 |
+
video_path: str
|
| 258 |
+
status: str
|
| 259 |
+
started_at: Optional[float]
|
| 260 |
+
returncode: Optional[int]
|
| 261 |
+
start_req: Optional[StartVLCRequest] = None
|
| 262 |
+
|
| 263 |
+
|
| 264 |
+
class ExecRequest(BaseModel):
|
| 265 |
+
command: str
|
| 266 |
+
|
| 267 |
+
|
| 268 |
+
class AddDownloadRequest(BaseModel):
|
| 269 |
+
uri: str
|
| 270 |
+
|
| 271 |
+
|
| 272 |
+
class DeleteFileRequest(BaseModel):
|
| 273 |
+
path: str
|
| 274 |
+
|
| 275 |
+
|
| 276 |
+
class UpdateConfigRequest(BaseModel):
|
| 277 |
+
movies_dir: str
|
| 278 |
+
create_if_missing: bool = True
|
| 279 |
+
|
| 280 |
+
|
| 281 |
+
class SearchRequest(BaseModel):
|
| 282 |
+
query: str
|
| 283 |
+
|
| 284 |
+
|
| 285 |
+
class SourceQualityRequest(BaseModel):
|
| 286 |
+
url: str
|
| 287 |
+
|
| 288 |
+
|
| 289 |
+
class SourceEpisodesRequest(BaseModel):
|
| 290 |
+
url: str
|
| 291 |
+
|
| 292 |
+
|
| 293 |
+
class AcerDownloadRequest(BaseModel):
|
| 294 |
+
url: str
|
| 295 |
+
filename: str
|
| 296 |
+
series_type: str = "episode"
|
| 297 |
+
subfolder: Optional[str] = None
|
| 298 |
+
|
| 299 |
+
|
| 300 |
+
def sanitize_filename(filename):
|
| 301 |
+
normalized = unicodedata.normalize('NFKD', filename).encode('ascii', 'ignore').decode('ascii')
|
| 302 |
+
sanitized = re.sub(r'[\\/*?:"<>|]', "", normalized)
|
| 303 |
+
sanitized = sanitized.replace(' ', '_')
|
| 304 |
+
sanitized = re.sub(r'_+', '_', sanitized).strip('._')
|
| 305 |
+
if not sanitized:
|
| 306 |
+
return 'download'
|
| 307 |
+
stem, ext = os.path.splitext(sanitized)
|
| 308 |
+
max_length = 180
|
| 309 |
+
if len(sanitized) <= max_length:
|
| 310 |
+
return sanitized
|
| 311 |
+
allowed_stem_length = max_length - len(ext)
|
| 312 |
+
shortened_stem = stem[:allowed_stem_length].rstrip('._')
|
| 313 |
+
return f"{shortened_stem}{ext}" if shortened_stem else f"download{ext}"
|
| 314 |
+
|
| 315 |
+
|
| 316 |
+
# ---------------- VLC instance / manager ----------------
|
| 317 |
+
|
| 318 |
+
class VLCInstance:
|
| 319 |
+
def __init__(self, instance_id: str, name: str, video_path: str, telnet_port: int, http_port: int):
|
| 320 |
+
self.id = instance_id
|
| 321 |
+
self.name = name
|
| 322 |
+
self.video_path = video_path
|
| 323 |
+
self.telnet_port = telnet_port
|
| 324 |
+
self.http_port = http_port
|
| 325 |
+
self.process: Optional[subprocess.Popen] = None
|
| 326 |
+
self.status = "starting"
|
| 327 |
+
self.started_at: Optional[float] = None
|
| 328 |
+
self.log_lines: deque = deque(maxlen=200)
|
| 329 |
+
self._reader_task: Optional[asyncio.Task] = None
|
| 330 |
+
self.start_req: Optional[StartVLCRequest] = None
|
| 331 |
+
|
| 332 |
+
def to_info(self) -> InstanceInfo:
|
| 333 |
+
return InstanceInfo(
|
| 334 |
+
id=self.id,
|
| 335 |
+
name=self.name,
|
| 336 |
+
pid=self.process.pid if self.process else None,
|
| 337 |
+
telnet_port=self.telnet_port,
|
| 338 |
+
http_port=self.http_port,
|
| 339 |
+
video_path=self.video_path,
|
| 340 |
+
status=self.status,
|
| 341 |
+
started_at=self.started_at,
|
| 342 |
+
returncode=self.process.poll() if self.process else None,
|
| 343 |
+
start_req=self.start_req,
|
| 344 |
+
)
|
| 345 |
+
|
| 346 |
+
async def _read_logs(self):
|
| 347 |
+
if not self.process or not self.process.stderr:
|
| 348 |
+
return
|
| 349 |
+
|
| 350 |
+
def read_loop():
|
| 351 |
+
try:
|
| 352 |
+
for line in self.process.stderr:
|
| 353 |
+
self.log_lines.append(line.decode(errors="replace").strip())
|
| 354 |
+
except Exception as e:
|
| 355 |
+
self.log_lines.append(f"[log reader error] {e}")
|
| 356 |
+
finally:
|
| 357 |
+
if self.status not in ("stopped", "killed"):
|
| 358 |
+
self.status = "exited"
|
| 359 |
+
|
| 360 |
+
await asyncio.to_thread(read_loop)
|
| 361 |
+
|
| 362 |
+
|
| 363 |
+
class VLCManager:
|
| 364 |
+
def __init__(self):
|
| 365 |
+
self.instances: Dict[str, VLCInstance] = {}
|
| 366 |
+
self._lock = asyncio.Lock()
|
| 367 |
+
|
| 368 |
+
def _resolve_video_path(self, raw: str) -> Path:
|
| 369 |
+
p = Path(raw)
|
| 370 |
+
if not p.is_absolute():
|
| 371 |
+
p = BASE_MOVIES_DIR / raw
|
| 372 |
+
return p.resolve()
|
| 373 |
+
async def start(self, req: StartVLCRequest, instance_id: Optional[str] = None, telnet_port: Optional[int] = None, http_port: Optional[int] = None) -> VLCInstance:
|
| 374 |
+
async with self._lock:
|
| 375 |
+
video_path = self._resolve_video_path(req.video_path)
|
| 376 |
+
if not video_path.exists():
|
| 377 |
+
raise HTTPException(status_code=404, detail=f"Video not found: {video_path}")
|
| 378 |
+
if shutil.which(VLC_EXECUTABLE) is None:
|
| 379 |
+
raise HTTPException(status_code=500, detail="vlc executable not found on PATH")
|
| 380 |
+
|
| 381 |
+
dst = req.rtmp_url
|
| 382 |
+
if not dst:
|
| 383 |
+
if not req.stream_key:
|
| 384 |
+
raise HTTPException(status_code=400, detail="Provide rtmp_url or stream_key")
|
| 385 |
+
dst = f"rtmp://live.twitch.tv/app/{req.stream_key}"
|
| 386 |
+
|
| 387 |
+
if not instance_id:
|
| 388 |
+
instance_id = uuid.uuid4().hex[:8]
|
| 389 |
+
name = req.name or instance_id
|
| 390 |
+
if not telnet_port:
|
| 391 |
+
telnet_port = find_free_port()
|
| 392 |
+
if not http_port:
|
| 393 |
+
http_port = find_free_port()
|
| 394 |
+
|
| 395 |
+
# If path is a directory, gather all media files and sort them. Otherwise just use it as a single file.
|
| 396 |
+
input_items = []
|
| 397 |
+
if video_path.is_dir():
|
| 398 |
+
media_exts = {".mp4", ".mkv", ".avi", ".mov", ".m4v", ".flv", ".mp3", ".wav", ".aac"}
|
| 399 |
+
media_files = [f for f in video_path.iterdir() if f.is_file() and f.suffix.lower() in media_exts]
|
| 400 |
+
if not media_files:
|
| 401 |
+
raise HTTPException(status_code=400, detail="No streamable media files found in directory")
|
| 402 |
+
|
| 403 |
+
# Sorting
|
| 404 |
+
if req.sort_by == "ctime_oldest":
|
| 405 |
+
media_files.sort(key=lambda f: f.stat().st_ctime)
|
| 406 |
+
elif req.sort_by == "ctime_newest":
|
| 407 |
+
media_files.sort(key=lambda f: f.stat().st_ctime, reverse=True)
|
| 408 |
+
else: # Default: Natural Alphanumeric Sort
|
| 409 |
+
def natural_keys(path):
|
| 410 |
+
text = path.name
|
| 411 |
+
return [int(c) if c.isdigit() else c.lower() for c in re.split(r'(\d+)', text)]
|
| 412 |
+
media_files.sort(key=natural_keys)
|
| 413 |
+
|
| 414 |
+
input_items = [str(f.resolve()) for f in media_files]
|
| 415 |
+
else:
|
| 416 |
+
input_items = [str(video_path)]
|
| 417 |
+
|
| 418 |
+
# Generate dynamic SOUT options based on request params
|
| 419 |
+
transcode_opts = (
|
| 420 |
+
f"vcodec={req.vcodec},vb={req.video_bitrate},"
|
| 421 |
+
f"scale={req.scale},acodec={req.acodec},ab={req.audio_bitrate},"
|
| 422 |
+
f"channels=2,samplerate={req.samplerate},fps={req.fps}"
|
| 423 |
+
)
|
| 424 |
+
|
| 425 |
+
if req.preset or req.keyint:
|
| 426 |
+
venc_opts = []
|
| 427 |
+
if req.preset:
|
| 428 |
+
venc_opts.append(f"preset={req.preset}")
|
| 429 |
+
if req.keyint:
|
| 430 |
+
venc_opts.append(f"keyint={req.keyint}")
|
| 431 |
+
transcode_opts += f",venc=x264{{{','.join(venc_opts)}}}"
|
| 432 |
+
|
| 433 |
+
if req.sub_track is not None:
|
| 434 |
+
transcode_opts += ",soverlay"
|
| 435 |
+
|
| 436 |
+
sout = (
|
| 437 |
+
f"#transcode{{{transcode_opts}}}"
|
| 438 |
+
f":std{{access=rtmp,mux=flv,dst={dst}}}"
|
| 439 |
+
)
|
| 440 |
+
|
| 441 |
+
args = [
|
| 442 |
+
VLC_EXECUTABLE,
|
| 443 |
+
]
|
| 444 |
+
args.extend(input_items)
|
| 445 |
+
args.extend([
|
| 446 |
+
f"--sout={sout}",
|
| 447 |
+
"--intf", "telnet",
|
| 448 |
+
"--telnet-password", PASSWORD,
|
| 449 |
+
"--telnet-port", str(telnet_port),
|
| 450 |
+
"--extraintf", "http",
|
| 451 |
+
"--http-password", PASSWORD,
|
| 452 |
+
"--http-port", str(http_port),
|
| 453 |
+
"--no-sout-all",
|
| 454 |
+
"--sout-keep",
|
| 455 |
+
"-vv",
|
| 456 |
+
])
|
| 457 |
+
if req.loop:
|
| 458 |
+
args.append("--loop")
|
| 459 |
+
if req.audio_track is not None:
|
| 460 |
+
args.append(f"--audio-track={req.audio_track}")
|
| 461 |
+
if req.sub_track is not None:
|
| 462 |
+
args.append(f"--sub-track={req.sub_track}")
|
| 463 |
+
if req.start_time is not None and req.start_time > 0:
|
| 464 |
+
args.append(f"--start-time={req.start_time}")
|
| 465 |
+
|
| 466 |
+
# Reuse existing instance configuration if reconfiguring
|
| 467 |
+
if instance_id in self.instances:
|
| 468 |
+
instance = self.instances[instance_id]
|
| 469 |
+
instance.video_path = str(video_path)
|
| 470 |
+
instance.status = "starting"
|
| 471 |
+
instance.process = None
|
| 472 |
+
instance.log_lines.clear()
|
| 473 |
+
else:
|
| 474 |
+
instance = VLCInstance(instance_id, name, str(video_path), telnet_port, http_port)
|
| 475 |
+
|
| 476 |
+
instance.start_req = req
|
| 477 |
+
|
| 478 |
+
import traceback
|
| 479 |
+
print("--- Launching VLC ---")
|
| 480 |
+
print(f"Executable: {VLC_EXECUTABLE}")
|
| 481 |
+
print(f"Resolved executable: {shutil.which(VLC_EXECUTABLE)}")
|
| 482 |
+
print(f"Arguments: {args}")
|
| 483 |
+
try:
|
| 484 |
+
process = await asyncio.to_thread(
|
| 485 |
+
subprocess.Popen,
|
| 486 |
+
args,
|
| 487 |
+
stdout=subprocess.PIPE,
|
| 488 |
+
stderr=subprocess.PIPE,
|
| 489 |
+
)
|
| 490 |
+
print(f"Successfully launched VLC. PID: {process.pid}")
|
| 491 |
+
except Exception as e:
|
| 492 |
+
print(f"Exception while launching VLC: {e}")
|
| 493 |
+
traceback.print_exc()
|
| 494 |
+
raise HTTPException(status_code=500, detail=f"Failed to launch VLC: {e}")
|
| 495 |
+
|
| 496 |
+
instance.process = process
|
| 497 |
+
instance.started_at = time.time()
|
| 498 |
+
instance._reader_task = asyncio.create_task(instance._read_logs())
|
| 499 |
+
self.instances[instance_id] = instance
|
| 500 |
+
|
| 501 |
+
ok = await self._wait_for_telnet(instance, timeout=8)
|
| 502 |
+
instance.status = "running" if ok else "error"
|
| 503 |
+
if ok:
|
| 504 |
+
# Headless VLC often starts muted (volume 0) when no soundcard is detected.
|
| 505 |
+
# Explicitly initialize VLC volume to 256 (100%) so stream audio works.
|
| 506 |
+
try:
|
| 507 |
+
await asyncio.to_thread(
|
| 508 |
+
requests.get,
|
| 509 |
+
f"http://localhost:{instance.http_port}/requests/status.json?command=volume&val=256",
|
| 510 |
+
auth=("", PASSWORD),
|
| 511 |
+
timeout=2,
|
| 512 |
+
)
|
| 513 |
+
except Exception:
|
| 514 |
+
pass
|
| 515 |
+
if not ok:
|
| 516 |
+
instance.log_lines.append("Telnet interface did not become ready in time.")
|
| 517 |
+
return instance
|
| 518 |
+
|
| 519 |
+
async def _wait_for_telnet(self, instance: VLCInstance, timeout: float = 8) -> bool:
|
| 520 |
+
deadline = time.time() + timeout
|
| 521 |
+
while time.time() < deadline:
|
| 522 |
+
if instance.process.poll() is not None:
|
| 523 |
+
return False
|
| 524 |
+
try:
|
| 525 |
+
if await asyncio.to_thread(self._telnet_probe, instance.telnet_port):
|
| 526 |
+
return True
|
| 527 |
+
except Exception:
|
| 528 |
+
pass
|
| 529 |
+
await asyncio.sleep(0.5)
|
| 530 |
+
return False
|
| 531 |
+
|
| 532 |
+
@staticmethod
|
| 533 |
+
def _telnet_probe(port: int) -> bool:
|
| 534 |
+
tn = None
|
| 535 |
+
try:
|
| 536 |
+
tn = telnetlib.Telnet(TELNET_HOST, port, timeout=2)
|
| 537 |
+
tn.read_until(b"Password: ", timeout=2)
|
| 538 |
+
tn.write(PASSWORD.encode("ascii") + b"\n")
|
| 539 |
+
tn.read_until(b"> ", timeout=2)
|
| 540 |
+
return True
|
| 541 |
+
except Exception:
|
| 542 |
+
return False
|
| 543 |
+
finally:
|
| 544 |
+
if tn:
|
| 545 |
+
tn.close()
|
| 546 |
+
|
| 547 |
+
def get(self, instance_id: str) -> VLCInstance:
|
| 548 |
+
inst = self.instances.get(instance_id)
|
| 549 |
+
if not inst:
|
| 550 |
+
raise HTTPException(status_code=404, detail=f"No such instance: {instance_id}")
|
| 551 |
+
return inst
|
| 552 |
+
|
| 553 |
+
def list(self) -> List[VLCInstance]:
|
| 554 |
+
return list(self.instances.values())
|
| 555 |
+
|
| 556 |
+
async def stop(self, instance_id: str, force: bool = False) -> VLCInstance:
|
| 557 |
+
inst = self.get(instance_id)
|
| 558 |
+
if inst.process is None or inst.process.poll() is not None:
|
| 559 |
+
inst.status = "stopped" if inst.process is None else "exited"
|
| 560 |
+
return inst
|
| 561 |
+
try:
|
| 562 |
+
if force:
|
| 563 |
+
inst.process.kill()
|
| 564 |
+
else:
|
| 565 |
+
inst.process.terminate()
|
| 566 |
+
try:
|
| 567 |
+
await asyncio.wait_for(asyncio.to_thread(inst.process.wait), timeout=6)
|
| 568 |
+
except asyncio.TimeoutError:
|
| 569 |
+
if not force:
|
| 570 |
+
inst.process.kill()
|
| 571 |
+
await asyncio.wait_for(asyncio.to_thread(inst.process.wait), timeout=6)
|
| 572 |
+
inst.status = "killed" if force else "stopped"
|
| 573 |
+
except ProcessLookupError:
|
| 574 |
+
inst.status = "stopped"
|
| 575 |
+
except Exception as e:
|
| 576 |
+
inst.log_lines.append(f"[stop error] {e}")
|
| 577 |
+
raise HTTPException(status_code=500, detail=f"Failed to stop instance: {e}")
|
| 578 |
+
return inst
|
| 579 |
+
|
| 580 |
+
def remove(self, instance_id: str):
|
| 581 |
+
self.instances.pop(instance_id, None)
|
| 582 |
+
|
| 583 |
+
|
| 584 |
+
manager = VLCManager()
|
| 585 |
+
|
| 586 |
+
|
| 587 |
+
def _telnet_exec(port: int, command: str, timeout: float = 5) -> str:
|
| 588 |
+
tn = telnetlib.Telnet(TELNET_HOST, port, timeout=timeout)
|
| 589 |
+
try:
|
| 590 |
+
tn.read_until(b"Password: ", timeout=timeout)
|
| 591 |
+
tn.write(PASSWORD.encode("ascii") + b"\n")
|
| 592 |
+
tn.read_until(b"> ", timeout=timeout)
|
| 593 |
+
tn.write(command.encode("ascii", errors="replace") + b"\n")
|
| 594 |
+
return tn.read_until(b"> ", timeout=timeout).decode("ascii", errors="replace")
|
| 595 |
+
finally:
|
| 596 |
+
tn.close()
|
| 597 |
+
|
| 598 |
+
|
| 599 |
+
# ---------------- Routes ----------------
|
| 600 |
+
|
| 601 |
+
# @app.get("/")
|
| 602 |
+
# async def root():
|
| 603 |
+
# return {"message": "VLC Control API"}
|
| 604 |
+
|
| 605 |
+
|
| 606 |
+
@app.get("/movies/probe/{path:path}")
|
| 607 |
+
async def probe_movie(path: str):
|
| 608 |
+
import json
|
| 609 |
+
target = (BASE_MOVIES_DIR / path).resolve()
|
| 610 |
+
try:
|
| 611 |
+
target.relative_to(BASE_MOVIES_DIR)
|
| 612 |
+
except ValueError:
|
| 613 |
+
raise HTTPException(status_code=400, detail="Path escapes movies directory")
|
| 614 |
+
if not target.exists():
|
| 615 |
+
raise HTTPException(status_code=404, detail="Path not found")
|
| 616 |
+
if target.is_dir():
|
| 617 |
+
raise HTTPException(status_code=400, detail="Path is a directory")
|
| 618 |
+
|
| 619 |
+
cmd = [
|
| 620 |
+
"ffprobe",
|
| 621 |
+
"-v", "error",
|
| 622 |
+
"-show_entries", "stream=index,codec_type,codec_name:stream_tags=language,title",
|
| 623 |
+
"-of", "json",
|
| 624 |
+
str(target)
|
| 625 |
+
]
|
| 626 |
+
try:
|
| 627 |
+
process = await asyncio.to_thread(
|
| 628 |
+
subprocess.run,
|
| 629 |
+
cmd,
|
| 630 |
+
stdout=subprocess.PIPE,
|
| 631 |
+
stderr=subprocess.PIPE,
|
| 632 |
+
text=True,
|
| 633 |
+
check=True
|
| 634 |
+
)
|
| 635 |
+
data = json.loads(process.stdout)
|
| 636 |
+
except Exception as e:
|
| 637 |
+
raise HTTPException(status_code=500, detail=f"Failed to probe file: {e}")
|
| 638 |
+
|
| 639 |
+
streams = data.get("streams", [])
|
| 640 |
+
audio_tracks = []
|
| 641 |
+
sub_tracks = []
|
| 642 |
+
|
| 643 |
+
audio_index = 0
|
| 644 |
+
sub_index = 0
|
| 645 |
+
|
| 646 |
+
for stream in streams:
|
| 647 |
+
t = stream.get("codec_type")
|
| 648 |
+
tags = stream.get("tags", {})
|
| 649 |
+
language = tags.get("language", "und")
|
| 650 |
+
title = tags.get("title", "")
|
| 651 |
+
codec = stream.get("codec_name", "")
|
| 652 |
+
|
| 653 |
+
info = {
|
| 654 |
+
"vlc_index": None,
|
| 655 |
+
"ffprobe_index": stream.get("index"),
|
| 656 |
+
"codec": codec,
|
| 657 |
+
"language": language,
|
| 658 |
+
"title": title
|
| 659 |
+
}
|
| 660 |
+
|
| 661 |
+
if t == "audio":
|
| 662 |
+
info["vlc_index"] = audio_index
|
| 663 |
+
audio_tracks.append(info)
|
| 664 |
+
audio_index += 1
|
| 665 |
+
elif t == "subtitle":
|
| 666 |
+
info["vlc_index"] = sub_index
|
| 667 |
+
sub_tracks.append(info)
|
| 668 |
+
sub_index += 1
|
| 669 |
+
|
| 670 |
+
return {
|
| 671 |
+
"audio": audio_tracks,
|
| 672 |
+
"subtitle": sub_tracks
|
| 673 |
+
}
|
| 674 |
+
|
| 675 |
+
|
| 676 |
+
@app.get("/movies")
|
| 677 |
+
@app.get("/movies/{path:path}")
|
| 678 |
+
async def get_movies(path: str = ""):
|
| 679 |
+
target = (BASE_MOVIES_DIR / path).resolve()
|
| 680 |
+
try:
|
| 681 |
+
target.relative_to(BASE_MOVIES_DIR)
|
| 682 |
+
except ValueError:
|
| 683 |
+
raise HTTPException(status_code=400, detail="Path escapes movies directory")
|
| 684 |
+
if not target.exists():
|
| 685 |
+
raise HTTPException(status_code=404, detail="Path not found")
|
| 686 |
+
if not target.is_dir():
|
| 687 |
+
raise HTTPException(status_code=400, detail="Path is not a directory")
|
| 688 |
+
|
| 689 |
+
try:
|
| 690 |
+
subfolders = [f.name for f in os.scandir(target) if f.is_dir() and not f.name.startswith(".")]
|
| 691 |
+
files = [f.name for f in os.scandir(target) if not f.is_dir() and not f.name.startswith(".")]
|
| 692 |
+
except PermissionError:
|
| 693 |
+
raise HTTPException(status_code=403, detail=f"Permission denied accessing directory: {target}")
|
| 694 |
+
except Exception as e:
|
| 695 |
+
raise HTTPException(status_code=500, detail=f"Failed to scan directory: {e}")
|
| 696 |
+
return {"message": {"files": files, "subfolders": subfolders}}
|
| 697 |
+
|
| 698 |
+
|
| 699 |
+
@app.post("/vlc/start", response_model=InstanceInfo)
|
| 700 |
+
async def start_vlc(req: StartVLCRequest):
|
| 701 |
+
instance = await manager.start(req)
|
| 702 |
+
return instance.to_info()
|
| 703 |
+
|
| 704 |
+
|
| 705 |
+
@app.post("/vlc/{instance_id}/reconfigure", response_model=InstanceInfo)
|
| 706 |
+
async def reconfigure_instance(instance_id: str, req: StartVLCRequest):
|
| 707 |
+
inst = manager.get(instance_id)
|
| 708 |
+
# Stop the current process
|
| 709 |
+
await manager.stop(instance_id, force=True)
|
| 710 |
+
# Start it again on the same ports!
|
| 711 |
+
new_inst = await manager.start(
|
| 712 |
+
req,
|
| 713 |
+
instance_id=instance_id,
|
| 714 |
+
telnet_port=inst.telnet_port,
|
| 715 |
+
http_port=inst.http_port
|
| 716 |
+
)
|
| 717 |
+
return new_inst.to_info()
|
| 718 |
+
|
| 719 |
+
|
| 720 |
+
@app.get("/vlc/instances", response_model=List[InstanceInfo])
|
| 721 |
+
async def list_instances():
|
| 722 |
+
return [i.to_info() for i in manager.list()]
|
| 723 |
+
|
| 724 |
+
|
| 725 |
+
@app.get("/vlc/{instance_id}", response_model=InstanceInfo)
|
| 726 |
+
async def get_instance(instance_id: str):
|
| 727 |
+
return manager.get(instance_id).to_info()
|
| 728 |
+
|
| 729 |
+
|
| 730 |
+
@app.get("/vlc/{instance_id}/logs")
|
| 731 |
+
async def get_logs(instance_id: str, lines: int = 50):
|
| 732 |
+
inst = manager.get(instance_id)
|
| 733 |
+
return {"status": "success", "message": list(inst.log_lines)[-lines:]}
|
| 734 |
+
|
| 735 |
+
|
| 736 |
+
@app.post("/vlc/{instance_id}/stop", response_model=InstanceInfo)
|
| 737 |
+
async def stop_instance(instance_id: str):
|
| 738 |
+
return (await manager.stop(instance_id, force=False)).to_info()
|
| 739 |
+
|
| 740 |
+
|
| 741 |
+
@app.post("/vlc/{instance_id}/kill", response_model=InstanceInfo)
|
| 742 |
+
async def kill_instance(instance_id: str):
|
| 743 |
+
return (await manager.stop(instance_id, force=True)).to_info()
|
| 744 |
+
|
| 745 |
+
|
| 746 |
+
@app.delete("/vlc/{instance_id}")
|
| 747 |
+
async def delete_instance(instance_id: str):
|
| 748 |
+
inst = manager.get(instance_id)
|
| 749 |
+
if inst.process and inst.process.poll() is None:
|
| 750 |
+
await manager.stop(instance_id, force=True)
|
| 751 |
+
manager.remove(instance_id)
|
| 752 |
+
return {"status": "success", "message": f"Removed instance {instance_id}"}
|
| 753 |
+
|
| 754 |
+
|
| 755 |
+
@app.post("/vlc/{instance_id}/exec")
|
| 756 |
+
async def exec_command(instance_id: str, body: ExecRequest):
|
| 757 |
+
inst = manager.get(instance_id)
|
| 758 |
+
if inst.process is None or inst.process.poll() is not None:
|
| 759 |
+
raise HTTPException(status_code=409, detail="Instance is not running")
|
| 760 |
+
try:
|
| 761 |
+
output = await asyncio.to_thread(_telnet_exec, inst.telnet_port, body.command)
|
| 762 |
+
return {"status": "success", "message": output}
|
| 763 |
+
except (ConnectionRefusedError, OSError) as e:
|
| 764 |
+
raise HTTPException(status_code=502, detail=f"Could not connect to VLC telnet: {e}")
|
| 765 |
+
except Exception as e:
|
| 766 |
+
raise HTTPException(status_code=500, detail=f"Exec failed: {e}")
|
| 767 |
+
|
| 768 |
+
|
| 769 |
+
@app.get("/vlc/{instance_id}/status")
|
| 770 |
+
async def instance_status(instance_id: str):
|
| 771 |
+
inst = manager.get(instance_id)
|
| 772 |
+
if inst.process is None or inst.process.poll() is not None:
|
| 773 |
+
return {"status": "error", "message": "Instance is not running"}
|
| 774 |
+
try:
|
| 775 |
+
res = await asyncio.to_thread(
|
| 776 |
+
requests.get,
|
| 777 |
+
f"http://localhost:{inst.http_port}/requests/status.json",
|
| 778 |
+
auth=("", PASSWORD),
|
| 779 |
+
timeout=5,
|
| 780 |
+
)
|
| 781 |
+
return {"status": "success", "message": res.json()}
|
| 782 |
+
except Exception as e:
|
| 783 |
+
return {"status": "error", "message": f"Could not connect to VLC HTTP interface. Error: {e}"}
|
| 784 |
+
|
| 785 |
+
|
| 786 |
+
@app.post("/vlc/{instance_id}/volume")
|
| 787 |
+
async def change_volume(instance_id: str, val: str):
|
| 788 |
+
inst = manager.get(instance_id)
|
| 789 |
+
if inst.process is None or inst.process.poll() is not None:
|
| 790 |
+
raise HTTPException(status_code=409, detail="Instance is not running")
|
| 791 |
+
try:
|
| 792 |
+
res = await asyncio.to_thread(
|
| 793 |
+
requests.get,
|
| 794 |
+
f"http://localhost:{inst.http_port}/requests/status.json?command=volume&val={val}",
|
| 795 |
+
auth=("", PASSWORD),
|
| 796 |
+
timeout=5,
|
| 797 |
+
)
|
| 798 |
+
return {"status": "success", "message": res.json()}
|
| 799 |
+
except Exception as e:
|
| 800 |
+
raise HTTPException(status_code=500, detail=f"Failed to change volume: {e}")
|
| 801 |
+
|
| 802 |
+
|
| 803 |
+
@app.post("/vlc/{instance_id}/track")
|
| 804 |
+
async def change_track(instance_id: str, type: str, val: int):
|
| 805 |
+
inst = manager.get(instance_id)
|
| 806 |
+
if inst.process is None or inst.process.poll() is not None:
|
| 807 |
+
raise HTTPException(status_code=409, detail="Instance is not running")
|
| 808 |
+
|
| 809 |
+
command = "audio_track" if type == "audio" else "subtitle_track"
|
| 810 |
+
try:
|
| 811 |
+
res = await asyncio.to_thread(
|
| 812 |
+
requests.get,
|
| 813 |
+
f"http://localhost:{inst.http_port}/requests/status.json?command={command}&val={val}",
|
| 814 |
+
auth=("", PASSWORD),
|
| 815 |
+
timeout=5,
|
| 816 |
+
)
|
| 817 |
+
return {"status": "success", "message": res.json()}
|
| 818 |
+
except Exception as e:
|
| 819 |
+
raise HTTPException(status_code=500, detail=f"Failed to change track: {e}")
|
| 820 |
+
|
| 821 |
+
|
| 822 |
+
# ---------------- Aria2 / Explorer API routes ----------------
|
| 823 |
+
|
| 824 |
+
@app.get("/aria2/downloads")
|
| 825 |
+
async def get_downloads():
|
| 826 |
+
try:
|
| 827 |
+
downloads = aria2_manager.get_downloads()
|
| 828 |
+
results = []
|
| 829 |
+
for dl in downloads:
|
| 830 |
+
total = dl.total_length
|
| 831 |
+
completed = dl.completed_length
|
| 832 |
+
pct = (completed / total * 100) if total > 0 else 0
|
| 833 |
+
|
| 834 |
+
results.append({
|
| 835 |
+
"gid": dl.gid,
|
| 836 |
+
"name": dl.name,
|
| 837 |
+
"status": dl.status,
|
| 838 |
+
"total_length": total,
|
| 839 |
+
"completed_length": completed,
|
| 840 |
+
"progress": round(pct, 2),
|
| 841 |
+
"download_speed": dl.download_speed,
|
| 842 |
+
"download_speed_str": dl.download_speed_str,
|
| 843 |
+
"eta": dl.eta,
|
| 844 |
+
"files": [str(dl.file_path)] if dl.file_path else [],
|
| 845 |
+
"error_message": dl.error_message
|
| 846 |
+
})
|
| 847 |
+
return {"status": "success", "downloads": results}
|
| 848 |
+
except Exception as e:
|
| 849 |
+
raise HTTPException(status_code=500, detail=f"Failed to fetch downloads: {e}")
|
| 850 |
+
|
| 851 |
+
|
| 852 |
+
@app.post("/aria2/add")
|
| 853 |
+
async def add_download(req: AddDownloadRequest):
|
| 854 |
+
try:
|
| 855 |
+
dl = aria2_manager.add(req.uri)
|
| 856 |
+
return {"status": "success", "gid": dl.gid}
|
| 857 |
+
except Exception as e:
|
| 858 |
+
raise HTTPException(status_code=400, detail=f"Failed to add download: {e}")
|
| 859 |
+
|
| 860 |
+
|
| 861 |
+
@app.post("/aria2/pause/{gid}")
|
| 862 |
+
async def pause_download(gid: str):
|
| 863 |
+
try:
|
| 864 |
+
aria2_manager.pause(gid)
|
| 865 |
+
return {"status": "success"}
|
| 866 |
+
except Exception as e:
|
| 867 |
+
raise HTTPException(status_code=500, detail=str(e))
|
| 868 |
+
|
| 869 |
+
|
| 870 |
+
@app.post("/aria2/resume/{gid}")
|
| 871 |
+
async def resume_download(gid: str):
|
| 872 |
+
try:
|
| 873 |
+
aria2_manager.resume(gid)
|
| 874 |
+
return {"status": "success"}
|
| 875 |
+
except Exception as e:
|
| 876 |
+
raise HTTPException(status_code=500, detail=str(e))
|
| 877 |
+
|
| 878 |
+
|
| 879 |
+
@app.post("/aria2/remove/{gid}")
|
| 880 |
+
async def remove_download(gid: str):
|
| 881 |
+
try:
|
| 882 |
+
aria2_manager.remove(gid)
|
| 883 |
+
return {"status": "success"}
|
| 884 |
+
except Exception as e:
|
| 885 |
+
raise HTTPException(status_code=500, detail=str(e))
|
| 886 |
+
|
| 887 |
+
|
| 888 |
+
@app.post("/aria2/purge")
|
| 889 |
+
async def purge_downloads():
|
| 890 |
+
try:
|
| 891 |
+
aria2_manager.autopurge()
|
| 892 |
+
return {"status": "success"}
|
| 893 |
+
except Exception as e:
|
| 894 |
+
raise HTTPException(status_code=500, detail=str(e))
|
| 895 |
+
|
| 896 |
+
|
| 897 |
+
# ---------------- Acer Scraper APIs ----------------
|
| 898 |
+
|
| 899 |
+
API_BASE_URL = 'https://api2.acermovies.fun/api'
|
| 900 |
+
DEFAULT_HEADERS = {
|
| 901 |
+
"Accept": "*/*",
|
| 902 |
+
"Accept-Language": "en-US,en;q=0.9",
|
| 903 |
+
"Content-Type": "application/json",
|
| 904 |
+
"Origin": "https://acermovies.fun",
|
| 905 |
+
"Referer": "https://acermovies.fun/",
|
| 906 |
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36 Edg/150.0.0.0",
|
| 907 |
+
"sec-ch-ua": '"Not;A=Brand";v="8", "Chromium";v="150", "Microsoft Edge";v="150"',
|
| 908 |
+
"sec-ch-ua-mobile": "?0",
|
| 909 |
+
"sec-ch-ua-platform": '"Windows"',
|
| 910 |
+
"sec-fetch-dest": "empty",
|
| 911 |
+
"sec-fetch-mode": "cors",
|
| 912 |
+
"sec-fetch-site": "same-site"
|
| 913 |
+
}
|
| 914 |
+
|
| 915 |
+
|
| 916 |
+
@app.post("/acer/search")
|
| 917 |
+
async def acer_search(req: SearchRequest):
|
| 918 |
+
try:
|
| 919 |
+
res = await asyncio.to_thread(
|
| 920 |
+
requests.post,
|
| 921 |
+
f"{API_BASE_URL}/search",
|
| 922 |
+
headers=DEFAULT_HEADERS,
|
| 923 |
+
json={"searchQuery": req.query},
|
| 924 |
+
timeout=10
|
| 925 |
+
)
|
| 926 |
+
res.raise_for_status()
|
| 927 |
+
return res.json()
|
| 928 |
+
except Exception as e:
|
| 929 |
+
raise HTTPException(status_code=500, detail=f"Search failed: {e}")
|
| 930 |
+
|
| 931 |
+
|
| 932 |
+
@app.post("/acer/qualities")
|
| 933 |
+
async def acer_qualities(req: SourceQualityRequest):
|
| 934 |
+
try:
|
| 935 |
+
res = await asyncio.to_thread(
|
| 936 |
+
requests.post,
|
| 937 |
+
f"{API_BASE_URL}/sourceQuality",
|
| 938 |
+
headers=DEFAULT_HEADERS,
|
| 939 |
+
json={"url": req.url},
|
| 940 |
+
timeout=10
|
| 941 |
+
)
|
| 942 |
+
res.raise_for_status()
|
| 943 |
+
return res.json()
|
| 944 |
+
except Exception as e:
|
| 945 |
+
raise HTTPException(status_code=500, detail=f"Failed to fetch qualities: {e}")
|
| 946 |
+
|
| 947 |
+
|
| 948 |
+
@app.post("/acer/episodes")
|
| 949 |
+
async def acer_episodes(req: SourceEpisodesRequest):
|
| 950 |
+
try:
|
| 951 |
+
res = await asyncio.to_thread(
|
| 952 |
+
requests.post,
|
| 953 |
+
f"{API_BASE_URL}/sourceEpisodes",
|
| 954 |
+
headers=DEFAULT_HEADERS,
|
| 955 |
+
json={"url": req.url},
|
| 956 |
+
timeout=10
|
| 957 |
+
)
|
| 958 |
+
res.raise_for_status()
|
| 959 |
+
return res.json()
|
| 960 |
+
except Exception as e:
|
| 961 |
+
raise HTTPException(status_code=500, detail=f"Failed to fetch episodes: {e}")
|
| 962 |
+
|
| 963 |
+
|
| 964 |
+
@app.post("/acer/download")
|
| 965 |
+
async def acer_download(req: AcerDownloadRequest):
|
| 966 |
+
try:
|
| 967 |
+
# 1. Resolve sourceUrl
|
| 968 |
+
res = await asyncio.to_thread(
|
| 969 |
+
requests.post,
|
| 970 |
+
f"{API_BASE_URL}/sourceUrl",
|
| 971 |
+
headers=DEFAULT_HEADERS,
|
| 972 |
+
json={"url": req.url, "seriesType": req.series_type},
|
| 973 |
+
timeout=15
|
| 974 |
+
)
|
| 975 |
+
res.raise_for_status()
|
| 976 |
+
data = res.json()
|
| 977 |
+
direct_url = data.get("sourceUrl")
|
| 978 |
+
if not direct_url:
|
| 979 |
+
raise HTTPException(status_code=400, detail="Could not resolve download URL")
|
| 980 |
+
|
| 981 |
+
# Decode URL
|
| 982 |
+
direct_url = unquote(direct_url)
|
| 983 |
+
|
| 984 |
+
# 2. Add to downloader
|
| 985 |
+
dl = aria2_manager.add(direct_url, filename=req.filename, subfolder=req.subfolder)
|
| 986 |
+
return {"status": "success", "gid": dl.gid, "filename": dl.name}
|
| 987 |
+
except Exception as e:
|
| 988 |
+
raise HTTPException(status_code=500, detail=f"Download queue failed: {e}")
|
| 989 |
+
|
| 990 |
+
|
| 991 |
+
@app.get("/config")
|
| 992 |
+
async def get_config():
|
| 993 |
+
return {
|
| 994 |
+
"status": "success",
|
| 995 |
+
"default_movies_dir": str(default_movies_dir),
|
| 996 |
+
"current_movies_dir": str(BASE_MOVIES_DIR),
|
| 997 |
+
}
|
| 998 |
+
|
| 999 |
+
|
| 1000 |
+
@app.post("/config")
|
| 1001 |
+
async def update_config(req: UpdateConfigRequest):
|
| 1002 |
+
global BASE_MOVIES_DIR
|
| 1003 |
+
target = Path(req.movies_dir).expanduser().resolve()
|
| 1004 |
+
|
| 1005 |
+
if not target.exists():
|
| 1006 |
+
if req.create_if_missing:
|
| 1007 |
+
try:
|
| 1008 |
+
target.mkdir(parents=True, exist_ok=True)
|
| 1009 |
+
except Exception as e:
|
| 1010 |
+
raise HTTPException(status_code=500, detail=f"Failed to create directory: {e}")
|
| 1011 |
+
else:
|
| 1012 |
+
raise HTTPException(status_code=400, detail="Directory does not exist")
|
| 1013 |
+
|
| 1014 |
+
BASE_MOVIES_DIR = target
|
| 1015 |
+
return {
|
| 1016 |
+
"status": "success",
|
| 1017 |
+
"current_movies_dir": str(BASE_MOVIES_DIR),
|
| 1018 |
+
"message": f"Updated active movies directory to {BASE_MOVIES_DIR}"
|
| 1019 |
+
}
|
| 1020 |
+
|
| 1021 |
+
|
| 1022 |
+
@app.get("/explorer")
|
| 1023 |
+
@app.get("/explorer/{path:path}")
|
| 1024 |
+
async def explorer_list(path: str = ""):
|
| 1025 |
+
target = (BASE_MOVIES_DIR / path).resolve()
|
| 1026 |
+
try:
|
| 1027 |
+
target.relative_to(BASE_MOVIES_DIR)
|
| 1028 |
+
except ValueError:
|
| 1029 |
+
raise HTTPException(status_code=400, detail="Access denied")
|
| 1030 |
+
|
| 1031 |
+
if not target.exists():
|
| 1032 |
+
raise HTTPException(status_code=404, detail="Path not found")
|
| 1033 |
+
|
| 1034 |
+
if not target.is_dir():
|
| 1035 |
+
raise HTTPException(status_code=400, detail="Not a directory")
|
| 1036 |
+
|
| 1037 |
+
entries = []
|
| 1038 |
+
try:
|
| 1039 |
+
for item in os.scandir(target):
|
| 1040 |
+
if item.name.startswith("."):
|
| 1041 |
+
continue
|
| 1042 |
+
|
| 1043 |
+
stat = item.stat()
|
| 1044 |
+
relative = str(Path(item.path).relative_to(BASE_MOVIES_DIR)).replace("\\", "/")
|
| 1045 |
+
|
| 1046 |
+
is_directory = item.is_dir()
|
| 1047 |
+
size_bytes = stat.st_size if not is_directory else 0
|
| 1048 |
+
|
| 1049 |
+
if is_directory:
|
| 1050 |
+
size_str = "dir"
|
| 1051 |
+
else:
|
| 1052 |
+
if size_bytes >= 1024**3:
|
| 1053 |
+
size_str = f"{size_bytes / 1024**3:.2f} GB"
|
| 1054 |
+
elif size_bytes >= 1024**2:
|
| 1055 |
+
size_str = f"{size_bytes / 1024**2:.2f} MB"
|
| 1056 |
+
elif size_bytes >= 1024:
|
| 1057 |
+
size_str = f"{size_bytes / 1024:.2f} KB"
|
| 1058 |
+
else:
|
| 1059 |
+
size_str = f"{size_bytes} B"
|
| 1060 |
+
|
| 1061 |
+
entries.append({
|
| 1062 |
+
"name": item.name,
|
| 1063 |
+
"type": "directory" if is_directory else "file",
|
| 1064 |
+
"size": size_bytes,
|
| 1065 |
+
"size_str": size_str,
|
| 1066 |
+
"modified_at": stat.st_mtime,
|
| 1067 |
+
"path": relative
|
| 1068 |
+
})
|
| 1069 |
+
except PermissionError:
|
| 1070 |
+
raise HTTPException(status_code=403, detail="Permission denied")
|
| 1071 |
+
|
| 1072 |
+
entries.sort(key=lambda x: (x["type"] != "directory", x["name"].lower()))
|
| 1073 |
+
return {"status": "success", "entries": entries, "current_path": path}
|
| 1074 |
+
|
| 1075 |
+
|
| 1076 |
+
@app.post("/explorer/delete")
|
| 1077 |
+
async def explorer_delete(req: DeleteFileRequest):
|
| 1078 |
+
target = (BASE_MOVIES_DIR / req.path).resolve()
|
| 1079 |
+
try:
|
| 1080 |
+
target.relative_to(BASE_MOVIES_DIR)
|
| 1081 |
+
except ValueError:
|
| 1082 |
+
raise HTTPException(status_code=400, detail="Access denied")
|
| 1083 |
+
|
| 1084 |
+
if not target.exists():
|
| 1085 |
+
raise HTTPException(status_code=404, detail="File or directory not found")
|
| 1086 |
+
|
| 1087 |
+
try:
|
| 1088 |
+
if target.is_dir():
|
| 1089 |
+
shutil.rmtree(target)
|
| 1090 |
+
else:
|
| 1091 |
+
target.unlink()
|
| 1092 |
+
return {"status": "success", "message": f"Successfully deleted {req.path}"}
|
| 1093 |
+
except Exception as e:
|
| 1094 |
+
raise HTTPException(status_code=500, detail=f"Failed to delete: {e}")
|
| 1095 |
+
|
| 1096 |
+
|
| 1097 |
+
from fastapi import UploadFile, Form
|
| 1098 |
+
import zipfile
|
| 1099 |
+
|
| 1100 |
+
class CreateFolderRequest(BaseModel):
|
| 1101 |
+
parent_path: str
|
| 1102 |
+
folder_name: str
|
| 1103 |
+
|
| 1104 |
+
class RenameRequest(BaseModel):
|
| 1105 |
+
old_path: str
|
| 1106 |
+
new_name: str
|
| 1107 |
+
|
| 1108 |
+
class CopyMoveRequest(BaseModel):
|
| 1109 |
+
source_paths: List[str]
|
| 1110 |
+
target_dir: str
|
| 1111 |
+
|
| 1112 |
+
class ZipRequest(BaseModel):
|
| 1113 |
+
paths: List[str]
|
| 1114 |
+
target_zip_name: str
|
| 1115 |
+
current_dir: str
|
| 1116 |
+
|
| 1117 |
+
class UnzipRequest(BaseModel):
|
| 1118 |
+
zip_path: str
|
| 1119 |
+
target_dir: str
|
| 1120 |
+
|
| 1121 |
+
class ResumePositionRequest(BaseModel):
|
| 1122 |
+
file_path: str
|
| 1123 |
+
resume_position: int
|
| 1124 |
+
|
| 1125 |
+
# Watch History JSON file storage helpers
|
| 1126 |
+
HISTORY_FILE = Path.home() / ".watchparty_history.json"
|
| 1127 |
+
|
| 1128 |
+
def _load_history() -> List[dict]:
|
| 1129 |
+
if not HISTORY_FILE.exists():
|
| 1130 |
+
return []
|
| 1131 |
+
try:
|
| 1132 |
+
import json
|
| 1133 |
+
with open(HISTORY_FILE, "r", encoding="utf-8") as f:
|
| 1134 |
+
return json.load(f)
|
| 1135 |
+
except Exception:
|
| 1136 |
+
return []
|
| 1137 |
+
|
| 1138 |
+
def _save_history(history: List[dict]):
|
| 1139 |
+
try:
|
| 1140 |
+
import json
|
| 1141 |
+
with open(HISTORY_FILE, "w", encoding="utf-8") as f:
|
| 1142 |
+
json.dump(history, f, indent=2, ensure_ascii=False)
|
| 1143 |
+
except Exception:
|
| 1144 |
+
pass
|
| 1145 |
+
|
| 1146 |
+
@app.get("/history")
|
| 1147 |
+
async def get_history():
|
| 1148 |
+
return {"status": "success", "history": _load_history()}
|
| 1149 |
+
|
| 1150 |
+
@app.post("/history/resume")
|
| 1151 |
+
async def update_resume_position(req: ResumePositionRequest):
|
| 1152 |
+
history = _load_history()
|
| 1153 |
+
history = [item for item in history if item.get("file_path") != req.file_path]
|
| 1154 |
+
history.insert(0, {
|
| 1155 |
+
"file_path": req.file_path,
|
| 1156 |
+
"last_streamed": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()),
|
| 1157 |
+
"resume_position": req.resume_position
|
| 1158 |
+
})
|
| 1159 |
+
_save_history(history[:50])
|
| 1160 |
+
return {"status": "success"}
|
| 1161 |
+
|
| 1162 |
+
@app.post("/explorer/mkdir")
|
| 1163 |
+
async def explorer_mkdir(req: CreateFolderRequest):
|
| 1164 |
+
parent = (BASE_MOVIES_DIR / req.parent_path).resolve()
|
| 1165 |
+
try:
|
| 1166 |
+
parent.relative_to(BASE_MOVIES_DIR)
|
| 1167 |
+
except ValueError:
|
| 1168 |
+
raise HTTPException(status_code=400, detail="Access denied")
|
| 1169 |
+
|
| 1170 |
+
# Sanitize folder name
|
| 1171 |
+
sanitized = re.sub(r'[\\/*?:"<>|]', "", req.folder_name).strip()
|
| 1172 |
+
if not sanitized:
|
| 1173 |
+
raise HTTPException(status_code=400, detail="Invalid folder name")
|
| 1174 |
+
|
| 1175 |
+
target = parent / sanitized
|
| 1176 |
+
try:
|
| 1177 |
+
target.mkdir(parents=True, exist_ok=True)
|
| 1178 |
+
return {"status": "success", "message": f"Created folder {sanitized}"}
|
| 1179 |
+
except Exception as e:
|
| 1180 |
+
raise HTTPException(status_code=500, detail=str(e))
|
| 1181 |
+
|
| 1182 |
+
@app.post("/explorer/rename")
|
| 1183 |
+
async def explorer_rename(req: RenameRequest):
|
| 1184 |
+
old_target = (BASE_MOVIES_DIR / req.old_path).resolve()
|
| 1185 |
+
try:
|
| 1186 |
+
old_target.relative_to(BASE_MOVIES_DIR)
|
| 1187 |
+
except ValueError:
|
| 1188 |
+
raise HTTPException(status_code=400, detail="Access denied")
|
| 1189 |
+
|
| 1190 |
+
if not old_target.exists():
|
| 1191 |
+
raise HTTPException(status_code=404, detail="Path not found")
|
| 1192 |
+
|
| 1193 |
+
sanitized = re.sub(r'[\\/*?:"<>|]', "", req.new_name).strip()
|
| 1194 |
+
if not sanitized:
|
| 1195 |
+
raise HTTPException(status_code=400, detail="Invalid target name")
|
| 1196 |
+
|
| 1197 |
+
new_target = old_target.parent / sanitized
|
| 1198 |
+
if new_target.exists():
|
| 1199 |
+
raise HTTPException(status_code=400, detail="Target name already exists")
|
| 1200 |
+
|
| 1201 |
+
try:
|
| 1202 |
+
shutil.move(str(old_target), str(new_target))
|
| 1203 |
+
return {"status": "success", "message": f"Renamed to {sanitized}"}
|
| 1204 |
+
except Exception as e:
|
| 1205 |
+
raise HTTPException(status_code=500, detail=str(e))
|
| 1206 |
+
|
| 1207 |
+
@app.post("/explorer/copy")
|
| 1208 |
+
async def explorer_copy(req: CopyMoveRequest):
|
| 1209 |
+
target_dir = (BASE_MOVIES_DIR / req.target_dir).resolve()
|
| 1210 |
+
try:
|
| 1211 |
+
target_dir.relative_to(BASE_MOVIES_DIR)
|
| 1212 |
+
except ValueError:
|
| 1213 |
+
raise HTTPException(status_code=400, detail="Access denied")
|
| 1214 |
+
|
| 1215 |
+
if not target_dir.exists() or not target_dir.is_dir():
|
| 1216 |
+
raise HTTPException(status_code=400, detail="Target directory invalid")
|
| 1217 |
+
|
| 1218 |
+
copied = []
|
| 1219 |
+
errors = []
|
| 1220 |
+
for sp in req.source_paths:
|
| 1221 |
+
src = (BASE_MOVIES_DIR / sp).resolve()
|
| 1222 |
+
try:
|
| 1223 |
+
src.relative_to(BASE_MOVIES_DIR)
|
| 1224 |
+
dest = target_dir / src.name
|
| 1225 |
+
if src.is_dir():
|
| 1226 |
+
shutil.copytree(src, dest, dirs_exist_ok=True)
|
| 1227 |
+
else:
|
| 1228 |
+
shutil.copy2(src, dest)
|
| 1229 |
+
copied.append(sp)
|
| 1230 |
+
except Exception as e:
|
| 1231 |
+
errors.append(f"Failed to copy {sp}: {e}")
|
| 1232 |
+
|
| 1233 |
+
return {"status": "success", "copied": copied, "errors": errors}
|
| 1234 |
+
|
| 1235 |
+
@app.post("/explorer/move")
|
| 1236 |
+
async def explorer_move(req: CopyMoveRequest):
|
| 1237 |
+
target_dir = (BASE_MOVIES_DIR / req.target_dir).resolve()
|
| 1238 |
+
try:
|
| 1239 |
+
target_dir.relative_to(BASE_MOVIES_DIR)
|
| 1240 |
+
except ValueError:
|
| 1241 |
+
raise HTTPException(status_code=400, detail="Access denied")
|
| 1242 |
+
|
| 1243 |
+
if not target_dir.exists() or not target_dir.is_dir():
|
| 1244 |
+
raise HTTPException(status_code=400, detail="Target directory invalid")
|
| 1245 |
+
|
| 1246 |
+
moved = []
|
| 1247 |
+
errors = []
|
| 1248 |
+
for sp in req.source_paths:
|
| 1249 |
+
src = (BASE_MOVIES_DIR / sp).resolve()
|
| 1250 |
+
try:
|
| 1251 |
+
src.relative_to(BASE_MOVIES_DIR)
|
| 1252 |
+
dest = target_dir / src.name
|
| 1253 |
+
shutil.move(str(src), str(dest))
|
| 1254 |
+
moved.append(sp)
|
| 1255 |
+
except Exception as e:
|
| 1256 |
+
errors.append(f"Failed to move {sp}: {e}")
|
| 1257 |
+
|
| 1258 |
+
return {"status": "success", "moved": moved, "errors": errors}
|
| 1259 |
+
|
| 1260 |
+
@app.post("/explorer/upload")
|
| 1261 |
+
async def explorer_upload(
|
| 1262 |
+
target_dir: str = Form(""),
|
| 1263 |
+
file: UploadFile = Form(...)
|
| 1264 |
+
):
|
| 1265 |
+
dest_dir = (BASE_MOVIES_DIR / target_dir).resolve()
|
| 1266 |
+
try:
|
| 1267 |
+
dest_dir.relative_to(BASE_MOVIES_DIR)
|
| 1268 |
+
except ValueError:
|
| 1269 |
+
raise HTTPException(status_code=400, detail="Access denied")
|
| 1270 |
+
|
| 1271 |
+
if not dest_dir.exists() or not dest_dir.is_dir():
|
| 1272 |
+
raise HTTPException(status_code=400, detail="Target directory invalid")
|
| 1273 |
+
|
| 1274 |
+
dest_path = dest_dir / file.filename
|
| 1275 |
+
try:
|
| 1276 |
+
with open(dest_path, "wb") as f:
|
| 1277 |
+
f.write(await file.read())
|
| 1278 |
+
return {"status": "success", "filename": file.filename}
|
| 1279 |
+
except Exception as e:
|
| 1280 |
+
raise HTTPException(status_code=500, detail=str(e))
|
| 1281 |
+
|
| 1282 |
+
@app.post("/explorer/zip")
|
| 1283 |
+
async def explorer_zip(req: ZipRequest):
|
| 1284 |
+
curr_dir = (BASE_MOVIES_DIR / req.current_dir).resolve()
|
| 1285 |
+
try:
|
| 1286 |
+
curr_dir.relative_to(BASE_MOVIES_DIR)
|
| 1287 |
+
except ValueError:
|
| 1288 |
+
raise HTTPException(status_code=400, detail="Access denied")
|
| 1289 |
+
|
| 1290 |
+
zip_name = req.target_zip_name.strip()
|
| 1291 |
+
if not zip_name.endswith(".zip"):
|
| 1292 |
+
zip_name += ".zip"
|
| 1293 |
+
|
| 1294 |
+
zip_path = curr_dir / zip_name
|
| 1295 |
+
try:
|
| 1296 |
+
with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
|
| 1297 |
+
for sp in req.paths:
|
| 1298 |
+
src = (BASE_MOVIES_DIR / sp).resolve()
|
| 1299 |
+
src.relative_to(BASE_MOVIES_DIR)
|
| 1300 |
+
if src.is_dir():
|
| 1301 |
+
for root, dirs, files in os.walk(src):
|
| 1302 |
+
for f in files:
|
| 1303 |
+
fpath = Path(root) / f
|
| 1304 |
+
arcname = fpath.relative_to(curr_dir)
|
| 1305 |
+
zipf.write(fpath, arcname)
|
| 1306 |
+
else:
|
| 1307 |
+
zipf.write(src, src.name)
|
| 1308 |
+
return {"status": "success", "zip_file": zip_name}
|
| 1309 |
+
except Exception as e:
|
| 1310 |
+
raise HTTPException(status_code=500, detail=str(e))
|
| 1311 |
+
|
| 1312 |
+
@app.post("/explorer/unzip")
|
| 1313 |
+
async def explorer_unzip(req: UnzipRequest):
|
| 1314 |
+
zip_target = (BASE_MOVIES_DIR / req.zip_path).resolve()
|
| 1315 |
+
target_dir = (BASE_MOVIES_DIR / req.target_dir).resolve()
|
| 1316 |
+
try:
|
| 1317 |
+
zip_target.relative_to(BASE_MOVIES_DIR)
|
| 1318 |
+
target_dir.relative_to(BASE_MOVIES_DIR)
|
| 1319 |
+
except ValueError:
|
| 1320 |
+
raise HTTPException(status_code=400, detail="Access denied")
|
| 1321 |
+
|
| 1322 |
+
if not zip_target.exists() or zip_target.suffix.lower() != ".zip":
|
| 1323 |
+
raise HTTPException(status_code=400, detail="Invalid zip file source")
|
| 1324 |
+
|
| 1325 |
+
try:
|
| 1326 |
+
with zipfile.ZipFile(zip_target, 'r') as zipf:
|
| 1327 |
+
zipf.extractall(target_dir)
|
| 1328 |
+
return {"status": "success", "message": f"Successfully unzipped to {req.target_dir}"}
|
| 1329 |
+
except Exception as e:
|
| 1330 |
+
raise HTTPException(status_code=500, detail=str(e))
|
| 1331 |
+
|
| 1332 |
+
|
| 1333 |
+
|
| 1334 |
+
|
| 1335 |
+
@app.on_event("shutdown")
|
| 1336 |
+
async def shutdown_event():
|
| 1337 |
+
for task in list(aria2_manager._tasks.values()):
|
| 1338 |
+
task.cancel()
|
| 1339 |
+
for inst in list(manager.instances.values()):
|
| 1340 |
+
if inst.process and inst.process.poll() is None:
|
| 1341 |
+
try:
|
| 1342 |
+
inst.process.kill()
|
| 1343 |
+
except Exception:
|
| 1344 |
+
pass
|
| 1345 |
+
|
| 1346 |
+
|
| 1347 |
+
from fastapi.responses import FileResponse
|
| 1348 |
+
|
| 1349 |
+
# Serve Next.js static export files from 'out' folder
|
| 1350 |
+
OUT_DIR = Path(__file__).parent / "out"
|
| 1351 |
+
|
| 1352 |
+
@app.get('/')
|
| 1353 |
+
@app.get("/{catchall:path}", include_in_schema=False)
|
| 1354 |
+
async def serve_static(catchall: str):
|
| 1355 |
+
if not OUT_DIR.exists():
|
| 1356 |
+
return {"message": "VLC Control API (Frontend static files 'out' folder not found)"}
|
| 1357 |
+
|
| 1358 |
+
# Try to serve exact file requested
|
| 1359 |
+
file_path = (OUT_DIR / catchall).resolve()
|
| 1360 |
+
try:
|
| 1361 |
+
file_path.relative_to(OUT_DIR)
|
| 1362 |
+
if file_path.is_file():
|
| 1363 |
+
return FileResponse(file_path)
|
| 1364 |
+
|
| 1365 |
+
# Try appending .html (Next.js default static routing)
|
| 1366 |
+
html_file = file_path.with_suffix(".html")
|
| 1367 |
+
if html_file.is_file():
|
| 1368 |
+
return FileResponse(html_file)
|
| 1369 |
+
|
| 1370 |
+
if file_path.is_dir():
|
| 1371 |
+
index_file = file_path / "index.html"
|
| 1372 |
+
if index_file.is_file():
|
| 1373 |
+
return FileResponse(index_file)
|
| 1374 |
+
except ValueError:
|
| 1375 |
+
pass
|
| 1376 |
+
|
| 1377 |
+
# Otherwise fall back to index.html (SPA routing)
|
| 1378 |
+
index_path = OUT_DIR / "index.html"
|
| 1379 |
+
if index_path.exists():
|
| 1380 |
+
return FileResponse(index_path)
|
| 1381 |
+
|
| 1382 |
+
return {"message": "VLC Control API (index.html not found)"}
|
movies/bbb_sunflower_1080p_30fps_normal.mp4
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:ae51005850b0ff757fe60c3dd7a12d754d3cd2397d87d939b55235e457f97658
|
| 3 |
+
size 276134947
|
out/404.html
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html><html lang="en" data-mantine-color-scheme="light"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/2v-rv291cn1b-.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/1u8kf-cumb-f7.js"/><script src="/_next/static/chunks/2dkoocrktt9k-.js" async=""></script><script src="/_next/static/chunks/3rxl-jt3pdxgx.js" async=""></script><script src="/_next/static/chunks/turbopack-3v560ngbdsqcf.js" async=""></script><script src="/_next/static/chunks/0d-c12mml-h6p.js" async=""></script><script src="/_next/static/chunks/158myu8e_yme3.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>My Mantine app</title><meta name="description" content="I have followed setup instructions carefully"/><link rel="icon" href="/favicon.ico?favicon.2vob68tjqpejf.ico" sizes="256x256" type="image/x-icon"/><script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><style data-mantine-styles="true">
|
| 2 |
+
|
| 3 |
+
|
| 4 |
+
|
| 5 |
+
</style><style data-mantine-styles="classes">@media (max-width: 35.99375em) {.mantine-visible-from-xs {display: none !important;}}@media (min-width: 36em) {.mantine-hidden-from-xs {display: none !important;}}@media (max-width: 47.99375em) {.mantine-visible-from-sm {display: none !important;}}@media (min-width: 48em) {.mantine-hidden-from-sm {display: none !important;}}@media (max-width: 61.99375em) {.mantine-visible-from-md {display: none !important;}}@media (min-width: 62em) {.mantine-hidden-from-md {display: none !important;}}@media (max-width: 74.99375em) {.mantine-visible-from-lg {display: none !important;}}@media (min-width: 75em) {.mantine-hidden-from-lg {display: none !important;}}@media (max-width: 87.99375em) {.mantine-visible-from-xl {display: none !important;}}@media (min-width: 88em) {.mantine-hidden-from-xl {display: none !important;}}</style><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/1u8kf-cumb-f7.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[29765,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"MantineProvider\"]\n3:I[39756,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"default\"]\n4:I[37457,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"default\"]\n5:I[97367,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"OutletBoundary\"]\n6:\"$Sreact.suspense\"\n9:I[97367,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"ViewportBoundary\"]\nb:I[97367,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"MetadataBoundary\"]\nd:I[68027,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/2v-rv291cn1b-.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_not-found\",\"\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/2v-rv291cn1b-.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0d-c12mml-h6p.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/158myu8e_yme3.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"data-mantine-color-scheme\":\"light\",\"children\":[[\"$\",\"head\",null,{}],[\"$\",\"body\",null,{\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L5\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@7\"}]}]]}],{},null,false,null]},null,false,\"$@8\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L9\",null,{\"children\":\"$La\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lb\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lc\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/2v-rv291cn1b-.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"nBKcDuA1Pt7_3iMhIbjDI\"}\n"])</script><script>self.__next_f.push([1,"e:[]\n8:\"$We\"\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"f:I[27201,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"IconMark\"]\n7:null\nc:[[\"$\",\"title\",\"0\",{\"children\":\"My Mantine app\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"I have followed setup instructions carefully\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.2vob68tjqpejf.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$Lf\",\"3\",{}]]\n"])</script></body></html>
|
out/404/index.html
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html><html lang="en" data-mantine-color-scheme="light"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/2v-rv291cn1b-.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/1u8kf-cumb-f7.js"/><script src="/_next/static/chunks/2dkoocrktt9k-.js" async=""></script><script src="/_next/static/chunks/3rxl-jt3pdxgx.js" async=""></script><script src="/_next/static/chunks/turbopack-3v560ngbdsqcf.js" async=""></script><script src="/_next/static/chunks/0d-c12mml-h6p.js" async=""></script><script src="/_next/static/chunks/158myu8e_yme3.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>My Mantine app</title><meta name="description" content="I have followed setup instructions carefully"/><link rel="icon" href="/favicon.ico?favicon.2vob68tjqpejf.ico" sizes="256x256" type="image/x-icon"/><script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><style data-mantine-styles="true">
|
| 2 |
+
|
| 3 |
+
|
| 4 |
+
|
| 5 |
+
</style><style data-mantine-styles="classes">@media (max-width: 35.99375em) {.mantine-visible-from-xs {display: none !important;}}@media (min-width: 36em) {.mantine-hidden-from-xs {display: none !important;}}@media (max-width: 47.99375em) {.mantine-visible-from-sm {display: none !important;}}@media (min-width: 48em) {.mantine-hidden-from-sm {display: none !important;}}@media (max-width: 61.99375em) {.mantine-visible-from-md {display: none !important;}}@media (min-width: 62em) {.mantine-hidden-from-md {display: none !important;}}@media (max-width: 74.99375em) {.mantine-visible-from-lg {display: none !important;}}@media (min-width: 75em) {.mantine-hidden-from-lg {display: none !important;}}@media (max-width: 87.99375em) {.mantine-visible-from-xl {display: none !important;}}@media (min-width: 88em) {.mantine-hidden-from-xl {display: none !important;}}</style><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/1u8kf-cumb-f7.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[29765,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"MantineProvider\"]\n3:I[39756,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"default\"]\n4:I[37457,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"default\"]\n5:I[97367,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"OutletBoundary\"]\n6:\"$Sreact.suspense\"\n9:I[97367,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"ViewportBoundary\"]\nb:I[97367,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"MetadataBoundary\"]\nd:I[68027,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/2v-rv291cn1b-.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_not-found\",\"\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/2v-rv291cn1b-.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0d-c12mml-h6p.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/158myu8e_yme3.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"data-mantine-color-scheme\":\"light\",\"children\":[[\"$\",\"head\",null,{}],[\"$\",\"body\",null,{\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L5\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@7\"}]}]]}],{},null,false,null]},null,false,\"$@8\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L9\",null,{\"children\":\"$La\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lb\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lc\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/2v-rv291cn1b-.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"nBKcDuA1Pt7_3iMhIbjDI\"}\n"])</script><script>self.__next_f.push([1,"e:[]\n8:\"$We\"\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"f:I[27201,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"IconMark\"]\n7:null\nc:[[\"$\",\"title\",\"0\",{\"children\":\"My Mantine app\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"I have followed setup instructions carefully\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.2vob68tjqpejf.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$Lf\",\"3\",{}]]\n"])</script></body></html>
|
out/__next.__PAGE__.txt
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
1:"$Sreact.fragment"
|
| 2 |
+
2:I[47257,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"ClientPageRoot"]
|
| 3 |
+
3:I[31713,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js","/_next/static/chunks/2fc-6082kgcrk.js","/_next/static/chunks/3y0d2nz4u4vwb.js"],"default"]
|
| 4 |
+
6:I[97367,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"OutletBoundary"]
|
| 5 |
+
7:"$Sreact.suspense"
|
| 6 |
+
0:{"rsc":["$","$1","c",{"children":[["$","$L2",null,{"Component":"$3","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@4","$@5"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/2fc-6082kgcrk.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/3y0d2nz4u4vwb.js","async":true}]],["$","$L6",null,{"children":["$","$7",null,{"name":"Next.MetadataOutlet","children":"$@8"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"nBKcDuA1Pt7_3iMhIbjDI"}
|
| 7 |
+
4:{}
|
| 8 |
+
5:"$0:rsc:props:children:0:props:serverProvidedParams:params"
|
| 9 |
+
8:null
|
out/__next._full.txt
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
1:"$Sreact.fragment"
|
| 2 |
+
2:I[29765,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"MantineProvider"]
|
| 3 |
+
3:I[39756,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"default"]
|
| 4 |
+
4:I[37457,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"default"]
|
| 5 |
+
5:I[47257,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"ClientPageRoot"]
|
| 6 |
+
6:I[31713,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js","/_next/static/chunks/2fc-6082kgcrk.js","/_next/static/chunks/3y0d2nz4u4vwb.js"],"default"]
|
| 7 |
+
9:I[97367,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"OutletBoundary"]
|
| 8 |
+
a:"$Sreact.suspense"
|
| 9 |
+
c:I[97367,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"ViewportBoundary"]
|
| 10 |
+
e:I[97367,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"MetadataBoundary"]
|
| 11 |
+
10:I[68027,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"default",1]
|
| 12 |
+
:HL["/_next/static/chunks/2v-rv291cn1b-.css","style"]
|
| 13 |
+
0:{"P":null,"c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/2v-rv291cn1b-.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/0d-c12mml-h6p.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/158myu8e_yme3.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"data-mantine-color-scheme":"light","children":[["$","head",null,{}],["$","body",null,{"children":["$","$L2",null,{"children":["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]]}]]}],{"children":[["$","$1","c",{"children":[["$","$L5",null,{"Component":"$6","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@7","$@8"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/2fc-6082kgcrk.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3y0d2nz4u4vwb.js","async":true,"nonce":"$undefined"}]],["$","$L9",null,{"children":["$","$a",null,{"name":"Next.MetadataOutlet","children":"$@b"}]}]]}],{},null,false,null]},null,false,null],["$","$1","h",{"children":[null,["$","$Lc",null,{"children":"$Ld"}],["$","div",null,{"hidden":true,"children":["$","$Le",null,{"children":["$","$a",null,{"name":"Next.Metadata","children":"$Lf"}]}]}],null]}],false]],"m":"$undefined","G":["$10",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/2v-rv291cn1b-.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"nBKcDuA1Pt7_3iMhIbjDI"}
|
| 14 |
+
7:{}
|
| 15 |
+
8:"$0:f:0:1:1:children:0:props:children:0:props:serverProvidedParams:params"
|
| 16 |
+
d:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
|
| 17 |
+
11:I[27201,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"IconMark"]
|
| 18 |
+
b:null
|
| 19 |
+
f:[["$","title","0",{"children":"My Mantine app"}],["$","meta","1",{"name":"description","content":"I have followed setup instructions carefully"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.2vob68tjqpejf.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L11","3",{}]]
|
out/__next._head.txt
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
1:"$Sreact.fragment"
|
| 2 |
+
2:I[97367,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"ViewportBoundary"]
|
| 3 |
+
3:I[97367,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"MetadataBoundary"]
|
| 4 |
+
4:"$Sreact.suspense"
|
| 5 |
+
5:I[27201,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"IconMark"]
|
| 6 |
+
0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"My Mantine app"}],["$","meta","1",{"name":"description","content":"I have followed setup instructions carefully"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.2vob68tjqpejf.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L5","3",{}]]}]}]}],null]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"nBKcDuA1Pt7_3iMhIbjDI"}
|
out/__next._index.txt
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
1:"$Sreact.fragment"
|
| 2 |
+
2:I[29765,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"MantineProvider"]
|
| 3 |
+
3:I[39756,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"default"]
|
| 4 |
+
4:I[37457,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"default"]
|
| 5 |
+
:HL["/_next/static/chunks/2v-rv291cn1b-.css","style"]
|
| 6 |
+
0:{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/2v-rv291cn1b-.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/0d-c12mml-h6p.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/158myu8e_yme3.js","async":true}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"data-mantine-color-scheme":"light","children":[["$","head",null,{}],["$","body",null,{"children":["$","$L2",null,{"children":["$","$L3",null,{"parallelRouterKey":"children","template":["$","$L4",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}]}]]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"nBKcDuA1Pt7_3iMhIbjDI"}
|
out/__next._tree.txt
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
:HL["/_next/static/chunks/2v-rv291cn1b-.css","style"]
|
| 2 |
+
0:{"tree":{"name":"","param":null,"prefetchHints":16,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}},"staleTime":300,"buildId":"nBKcDuA1Pt7_3iMhIbjDI"}
|
out/_next/static/chunks/0cz1d0mv5g_q7.js
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
out/_next/static/chunks/0d-c12mml-h6p.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,91375,e=>{"use strict";function r(e){return"auto"===e||"dark"===e||"light"===e}e.s(["localStorageColorSchemeManager",0,function({key:e="mantine-color-scheme-value"}={}){let o;return{get:o=>{if("u"<typeof window)return o;try{let a=window.localStorage.getItem(e);return r(a)?a:o}catch{return o}},set:r=>{try{window.localStorage.setItem(e,r)}catch(e){console.warn("[@mantine/core] Local storage color scheme manager was unable to save color scheme.",e)}},subscribe:a=>{o=o=>{o.storageArea===window.localStorage&&o.key===e&&r(o.newValue)&&a(o.newValue)},window.addEventListener("storage",o)},unsubscribe:()=>{window.removeEventListener("storage",o)},clear:()=>{window.localStorage.removeItem(e)}}}],91375)},90098,e=>{"use strict";var r=e.i(71645);let o=(0,r.createContext)(null);function a(){let e=(0,r.use)(o);if(!e)throw Error("[@mantine/core] MantineProvider was not found in tree");return e}e.s(["MantineContext",0,o,"useMantineClassNamesPrefix",0,function(){return a().classNamesPrefix},"useMantineContext",0,a,"useMantineCssVariablesResolver",0,function(){return a().cssVariablesResolver},"useMantineDeduplicateInlineStyles",0,function(){return a().deduplicateInlineStyles},"useMantineEnv",0,function(){return a().env||"default"},"useMantineIsHeadless",0,function(){return a().headless},"useMantineStyleNonce",0,function(){return a().getStyleNonce},"useMantineStylesTransform",0,function(){return a().stylesTransform?.styles},"useMantineSxTransform",0,function(){return a().stylesTransform?.sx},"useMantineWithStaticClasses",0,function(){return a().withStaticClasses}])},31141,e=>{"use strict";var r=e.i(71645);let o="u">typeof document?r.useLayoutEffect:r.useEffect;e.s(["useIsomorphicEffect",0,o])},27515,e=>{"use strict";var r=e.i(71645),o=e.i(31141);function a(e,r){let o="u">typeof window&&"matchMedia"in window&&window.matchMedia("(prefers-color-scheme: dark)")?.matches;r()?.setAttribute("data-mantine-color-scheme","auto"!==e?e:o?"dark":"light")}e.s(["useProviderColorScheme",0,function({manager:e,defaultColorScheme:n,getRootElement:t,forceColorScheme:i}){let l=(0,r.useRef)(null),[c,s]=(0,r.useState)(()=>e.get(n)),m=i||c,d=(0,r.useCallback)(r=>{i||(a(r,t),s(r),e.set(r))},[e.set,m,i]),u=(0,r.useCallback)(()=>{s(n),a(n,t),e.clear()},[e.clear,n]);return(0,r.useEffect)(()=>(e.subscribe(d),e.unsubscribe),[e.subscribe,e.unsubscribe]),(0,o.useIsomorphicEffect)(()=>{a(e.get(n),t)},[]),(0,r.useEffect)(()=>{if(i)return a(i,t),()=>{};void 0===i&&a(c,t),"u">typeof window&&"matchMedia"in window&&(l.current=window.matchMedia("(prefers-color-scheme: dark)"));let e=e=>{"auto"===c&&a(e.matches?"dark":"light",t)};return l.current?.addEventListener("change",e),()=>l.current?.removeEventListener("change",e)},[c,i]),{colorScheme:m,setColorScheme:d,clearColorScheme:u}}])},22442,82451,55634,82360,89825,93738,15259,19715,71255,38944,95335,e=>{"use strict";function r(e){return"0rem"===e?"0rem":`calc(${e} * var(--mantine-scale))`}function o(e,{shouldScale:a=!1}={}){return function o(n){if(0===n||"0"===n)return`0${e}`;if("number"==typeof n){let o=`${n/16}${e}`;return a?r(o):o}if("string"==typeof n){if(""===n||n.startsWith("calc(")||n.startsWith("clamp(")||n.includes("rgba("))return n;if(n.includes(","))return n.split(",").map(e=>o(e)).join(",");if(n.includes(" "))return n.split(" ").map(e=>o(e)).join(" ");let t=n.replace("px","");if(!Number.isNaN(Number(t))){let o=`${Number(t)/16}${e}`;return a?r(o):o}}return n}}let a=o("rem",{shouldScale:!0}),n=o("em");function t(e,r){return"number"==typeof e.primaryShade?e.primaryShade:"dark"===r?e.primaryShade.dark:e.primaryShade.light}function i(e){if(/^#?([0-9A-F]{3}){1,2}([0-9A-F]{2})?$/i.test(e)){let r=e.replace("#","");if(3===r.length){let e=r.split("");r=[e[0],e[0],e[1],e[1],e[2],e[2]].join("")}if(8===r.length){let e=parseInt(r.slice(6,8),16)/255;return{r:parseInt(r.slice(0,2),16),g:parseInt(r.slice(2,4),16),b:parseInt(r.slice(4,6),16),a:e}}let o=parseInt(r,16);return{r:o>>16&255,g:o>>8&255,b:255&o,a:1}}return e.startsWith("rgb")?function(e){let[r,o,a,n]=e.replace(/[^0-9,./]/g,"").split(/[/,]/).map(Number);return{r,g:o,b:a,a:void 0===n?1:n}}(e):e.startsWith("hsl")?function(e){let r,o,a,n=e.match(/^hsla?\(\s*(\d+)\s*,\s*(\d+%)\s*,\s*(\d+%)\s*(,\s*(0?\.\d+|\d+(\.\d+)?))?\s*\)$/i);if(!n)return{r:0,g:0,b:0,a:1};let t=parseInt(n[1],10),i=parseInt(n[2],10)/100,l=parseInt(n[3],10)/100,c=n[5]?parseFloat(n[5]):void 0,s=(1-Math.abs(2*l-1))*i,m=t/60,d=s*(1-Math.abs(m%2-1)),u=l-s/2;return m>=0&&m<1?(r=s,o=d,a=0):m>=1&&m<2?(r=d,o=s,a=0):m>=2&&m<3?(r=0,o=s,a=d):m>=3&&m<4?(r=0,o=d,a=s):m>=4&&m<5?(r=d,o=0,a=s):(r=s,o=0,a=d),{r:Math.round((r+u)*255),g:Math.round((o+u)*255),b:Math.round((a+u)*255),a:c||1}}(e):{r:0,g:0,b:0,a:1}}function l(e){return e<=.03928?e/12.92:((e+.055)/1.055)**2.4}function c(e,r=.179){return!e.startsWith("var(")&&function(e){if(e.startsWith("oklch(")){let r;return(((r=e.match(/oklch\((.*?)%\s/))?parseFloat(r[1]):null)||0)/100}let{r,g:o,b:a}=i(e);return .2126*l(r/255)+.7152*l(o/255)+.0722*l(a/255)}(e)>r}function s({color:e,theme:r,colorScheme:o}){if("string"!=typeof e)throw Error(`[@mantine/core] Failed to parse color. Expected color to be a string, instead got ${typeof e}`);if("bright"===e)return{color:e,value:"dark"===o?r.white:r.black,shade:void 0,isThemeColor:!1,isLight:c("dark"===o?r.white:r.black,r.luminanceThreshold),variable:"--mantine-color-bright"};if("dimmed"===e)return{color:e,value:"dark"===o?r.colors.dark[2]:r.colors.gray[7],shade:void 0,isThemeColor:!1,isLight:c("dark"===o?r.colors.dark[2]:r.colors.gray[6],r.luminanceThreshold),variable:"--mantine-color-dimmed"};if("white"===e||"black"===e)return{color:e,value:"white"===e?r.white:r.black,shade:void 0,isThemeColor:!1,isLight:c("white"===e?r.white:r.black,r.luminanceThreshold),variable:`--mantine-color-${e}`};let[a,n]=e.split("."),i=n?Number(n):void 0,l=a in r.colors;if(l){let e=void 0!==i?r.colors[a][i]:r.colors[a][t(r,o||"light")];return{color:a,value:e,shade:i,isThemeColor:l,isLight:c(e,r.luminanceThreshold),variable:n?`--mantine-color-${a}-${i}`:`--mantine-color-${a}-filled`}}return{color:e,value:e,isThemeColor:l,isLight:c(e,r.luminanceThreshold),shade:i,variable:void 0}}function m(e){return!!e&&"object"==typeof e&&"mantine-virtual-color"in e}function d(e,r){if(e.startsWith("var("))return`color-mix(in srgb, ${e}, black ${100*r}%)`;let{r:o,g:a,b:n,a:t}=i(e),l=1-r,c=e=>Math.round(e*l);return`rgba(${c(o)}, ${c(a)}, ${c(n)}, ${t})`}function u(e,r){let o=s({color:e||r.primaryColor,theme:r});return o.variable?`var(${o.variable})`:e}function f(e,r){let o={from:e?.from||r.defaultGradient.from,to:e?.to||r.defaultGradient.to,deg:e?.deg??r.defaultGradient.deg??0},a=u(o.from,r),n=u(o.to,r);return`linear-gradient(${o.deg}deg, ${a} 0%, ${n} 100%)`}function h(e,r){if("string"!=typeof e||r>1||r<0)return"rgba(0, 0, 0, 1)";if(e.startsWith("var("))return`color-mix(in srgb, ${e}, transparent ${(1-r)*100}%)`;if(e.startsWith("oklch"))return e.includes("/")?e.replace(/\/\s*[\d.]+\s*\)/,`/ ${r})`):e.replace(")",` / ${r})`);let{r:o,g:a,b:n}=i(e);return`rgba(${o}, ${a}, ${n}, ${r})`}e.s(["em",0,n,"rem",0,a],82451),e.s(["getPrimaryShade",0,t],55634),e.s(["parseThemeColor",0,s],82360),e.s(["isVirtualColor",0,m],89825),e.s(["darken",0,d],93738),e.s(["getThemeColor",0,u],15259),e.s(["getGradient",0,f],19715),e.s(["alpha",0,h,"rgba",0,h],71255);let b="-apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji",g={scale:1,fontSmoothing:!0,focusRing:"auto",white:"#fff",black:"#000",colors:{dark:["#C9C9C9","#b8b8b8","#828282","#696969","#424242","#3b3b3b","#2e2e2e","#242424","#1f1f1f","#141414"],gray:["#f8f9fa","#f1f3f5","#e9ecef","#dee2e6","#ced4da","#adb5bd","#868e96","#495057","#343a40","#212529"],red:["#fff5f5","#ffe3e3","#ffc9c9","#ffa8a8","#ff8787","#ff6b6b","#fa5252","#f03e3e","#e03131","#c92a2a"],pink:["#fff0f6","#ffdeeb","#fcc2d7","#faa2c1","#f783ac","#f06595","#e64980","#d6336c","#c2255c","#a61e4d"],grape:["#f8f0fc","#f3d9fa","#eebefa","#e599f7","#da77f2","#cc5de8","#be4bdb","#ae3ec9","#9c36b5","#862e9c"],violet:["#f3f0ff","#e5dbff","#d0bfff","#b197fc","#9775fa","#845ef7","#7950f2","#7048e8","#6741d9","#5f3dc4"],indigo:["#edf2ff","#dbe4ff","#bac8ff","#91a7ff","#748ffc","#5c7cfa","#4c6ef5","#4263eb","#3b5bdb","#364fc7"],blue:["#e7f5ff","#d0ebff","#a5d8ff","#74c0fc","#4dabf7","#339af0","#228be6","#1c7ed6","#1971c2","#1864ab"],cyan:["#e3fafc","#c5f6fa","#99e9f2","#66d9e8","#3bc9db","#22b8cf","#15aabf","#1098ad","#0c8599","#0b7285"],teal:["#e6fcf5","#c3fae8","#96f2d7","#63e6be","#38d9a9","#20c997","#12b886","#0ca678","#099268","#087f5b"],green:["#ebfbee","#d3f9d8","#b2f2bb","#8ce99a","#69db7c","#51cf66","#40c057","#37b24d","#2f9e44","#2b8a3e"],lime:["#f4fce3","#e9fac8","#d8f5a2","#c0eb75","#a9e34b","#94d82d","#82c91e","#74b816","#66a80f","#5c940d"],yellow:["#fff9db","#fff3bf","#ffec99","#ffe066","#ffd43b","#fcc419","#fab005","#f59f00","#f08c00","#e67700"],orange:["#fff4e6","#ffe8cc","#ffd8a8","#ffc078","#ffa94d","#ff922b","#fd7e14","#f76707","#e8590c","#d9480f"]},primaryShade:{light:6,dark:8},primaryColor:"blue",variantColorResolver:({color:e,theme:r,variant:o,gradient:n,autoContrast:t})=>{let i=s({color:e,theme:r}),l="boolean"==typeof t?t:r.autoContrast;if("none"===o)return{background:"transparent",hover:"transparent",color:"inherit",border:"none"};if("filled"===o){let o=i.isThemeColor&&void 0===i.shade&&m(r.colors[i.color]),n=l?o?`var(--mantine-color-${i.color}-contrast)`:i.isLight?"var(--mantine-color-black)":"var(--mantine-color-white)":"var(--mantine-color-white)";return i.isThemeColor?void 0===i.shade?{background:`var(--mantine-color-${e}-filled)`,hover:`var(--mantine-color-${e}-filled-hover)`,color:n,border:`${a(1)} solid transparent`}:{background:`var(--mantine-color-${i.color}-${i.shade})`,hover:`var(--mantine-color-${i.color}-${9===i.shade?8:i.shade+1})`,color:n,border:`${a(1)} solid transparent`}:{background:e,hover:d(e,.1),color:n,border:`${a(1)} solid transparent`}}if("light"===o){if(i.isThemeColor){if(void 0===i.shade)return{background:`var(--mantine-color-${e}-light)`,hover:`var(--mantine-color-${e}-light-hover)`,color:`var(--mantine-color-${e}-light-color)`,border:`${a(1)} solid transparent`};let o=r.colors[i.color][i.shade];return{background:o,hover:d(o,.1),color:`var(--mantine-color-${i.color}-light-color)`,border:`${a(1)} solid transparent`}}return{background:h(e,.1),hover:h(e,.12),color:e,border:`${a(1)} solid transparent`}}if("outline"===o)return i.isThemeColor?void 0===i.shade?{background:"transparent",hover:`var(--mantine-color-${e}-outline-hover)`,color:`var(--mantine-color-${e}-outline)`,border:`${a(1)} solid var(--mantine-color-${e}-outline)`}:{background:"transparent",hover:h(r.colors[i.color][i.shade],.05),color:`var(--mantine-color-${i.color}-${i.shade})`,border:`${a(1)} solid var(--mantine-color-${i.color}-${i.shade})`}:{background:"transparent",hover:h(e,.05),color:e,border:`${a(1)} solid ${e}`};if("subtle"===o)return i.isThemeColor?void 0===i.shade?{background:"transparent",hover:`var(--mantine-color-${e}-light-hover)`,color:`var(--mantine-color-${e}-light-color)`,border:`${a(1)} solid transparent`}:{background:"transparent",hover:h(r.colors[i.color][i.shade],.12),color:`var(--mantine-color-${i.color}-${Math.min(i.shade,6)})`,border:`${a(1)} solid transparent`}:{background:"transparent",hover:h(e,.12),color:e,border:`${a(1)} solid transparent`};if("transparent"===o)return i.isThemeColor?void 0===i.shade?{background:"transparent",hover:"transparent",color:`var(--mantine-color-${e}-light-color)`,border:`${a(1)} solid transparent`}:{background:"transparent",hover:"transparent",color:`var(--mantine-color-${i.color}-${Math.min(i.shade,6)})`,border:`${a(1)} solid transparent`}:{background:"transparent",hover:"transparent",color:e,border:`${a(1)} solid transparent`};if("white"===o)return i.isThemeColor?void 0===i.shade?{background:"var(--mantine-color-white)",hover:d(r.white,.01),color:`var(--mantine-color-${e}-filled)`,border:`${a(1)} solid transparent`}:{background:"var(--mantine-color-white)",hover:d(r.white,.01),color:`var(--mantine-color-${i.color}-${i.shade})`,border:`${a(1)} solid transparent`}:{background:"var(--mantine-color-white)",hover:d(r.white,.01),color:e,border:`${a(1)} solid transparent`};return"gradient"===o?{background:f(n,r),hover:f(n,r),color:"var(--mantine-color-white)",border:"none"}:"default"===o?{background:"var(--mantine-color-default)",hover:"var(--mantine-color-default-hover)",color:"var(--mantine-color-default-color)",border:`${a(1)} solid var(--mantine-color-default-border)`}:{}},autoContrast:!1,luminanceThreshold:.3,fontFamily:b,fontFamilyMonospace:"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, Liberation Mono, Courier New, monospace",respectReducedMotion:!1,cursorType:"default",defaultGradient:{from:"blue",to:"cyan",deg:45},defaultRadius:"md",activeClassName:"mantine-active",focusClassName:"",headings:{fontFamily:b,fontWeight:"700",textWrap:"wrap",sizes:{h1:{fontSize:a(34),lineHeight:"1.3"},h2:{fontSize:a(26),lineHeight:"1.35"},h3:{fontSize:a(22),lineHeight:"1.4"},h4:{fontSize:a(18),lineHeight:"1.45"},h5:{fontSize:a(16),lineHeight:"1.5"},h6:{fontSize:a(14),lineHeight:"1.5"}}},fontSizes:{xs:a(12),sm:a(14),md:a(16),lg:a(18),xl:a(20)},lineHeights:{xs:"1.4",sm:"1.45",md:"1.55",lg:"1.6",xl:"1.65"},fontWeights:{regular:"400",medium:"600",bold:"700"},radius:{xs:a(2),sm:a(4),md:a(8),lg:a(16),xl:a(32)},spacing:{xs:a(10),sm:a(12),md:a(16),lg:a(20),xl:a(32)},breakpoints:{xs:"36em",sm:"48em",md:"62em",lg:"75em",xl:"88em"},shadows:{xs:`0 ${a(1)} ${a(3)} rgba(0, 0, 0, 0.05), 0 ${a(1)} ${a(2)} rgba(0, 0, 0, 0.1)`,sm:`0 ${a(1)} ${a(3)} rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.05) 0 ${a(10)} ${a(15)} ${a(-5)}, rgba(0, 0, 0, 0.04) 0 ${a(7)} ${a(7)} ${a(-5)}`,md:`0 ${a(1)} ${a(3)} rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.05) 0 ${a(20)} ${a(25)} ${a(-5)}, rgba(0, 0, 0, 0.04) 0 ${a(10)} ${a(10)} ${a(-5)}`,lg:`0 ${a(1)} ${a(3)} rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.05) 0 ${a(28)} ${a(23)} ${a(-7)}, rgba(0, 0, 0, 0.04) 0 ${a(12)} ${a(12)} ${a(-7)}`,xl:`0 ${a(1)} ${a(3)} rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.05) 0 ${a(36)} ${a(28)} ${a(-7)}, rgba(0, 0, 0, 0.04) 0 ${a(17)} ${a(17)} ${a(-7)}`},other:{},components:{}};function v(e){return e&&"object"==typeof e&&!Array.isArray(e)}function $(e,r){let o={...e};return v(e)&&v(r)&&Object.keys(r).forEach(a=>{v(r[a])&&a in e?o[a]=$(o[a],r[a]):o[a]=r[a]}),o}e.s(["DEFAULT_THEME",0,g],38944),e.s(["deepMerge",0,$],95335);function p(e){return!(e<0)&&!(e>9)&&parseInt(e.toString(),10)===e}function y(e){if(!(e.primaryColor in e.colors))throw Error("[@mantine/core] MantineProvider: Invalid theme.primaryColor, it accepts only key of theme.colors, learn more – https://mantine.dev/theming/colors/#primary-color");if("object"==typeof e.primaryShade&&(!p(e.primaryShade.dark)||!p(e.primaryShade.light))||"number"==typeof e.primaryShade&&!p(e.primaryShade))throw Error("[@mantine/core] MantineProvider: Invalid theme.primaryShade, it accepts only 0-9 integers or an object { light: 0-9, dark: 0-9 }")}var k=e.i(71645),C=e.i(43476);let w=(0,k.createContext)(null);function S({theme:e,children:r,inherit:o=!0}){let a=(0,k.use)(w)||g;return(0,C.jsx)(w,{value:(0,k.useMemo)(()=>(function(e,r){if(!r)return y(e),e;let o=$(e,r);return r.fontFamily&&!r.headings?.fontFamily&&(o.headings={...o.headings,fontFamily:r.fontFamily}),y(o),o})(o?a:g,e),[e,a,o]),children:r})}S.displayName="@mantine/core/MantineThemeProvider",e.s(["MantineThemeProvider",0,S,"useMantineTheme",0,function(){let e=(0,k.use)(w);if(!e)throw Error("@mantine/core: MantineProvider was not found in component tree, make sure you have it in your app");return e}],22442)},45981,e=>{"use strict";e.s(["keys",0,function(e){return Object.keys(e)}])},71033,e=>{"use strict";e.s(["px",0,function(e){let r="string"==typeof e&&e.includes("var(--mantine-scale)")?e.match(/^calc\((.*?)\)$/)?.[1].split("*")[0].trim():e;return"number"==typeof r?r:"string"==typeof r?r.includes("calc")||r.includes("var")?r:r.includes("px")?Number(r.replace("px","")):r.includes("rem")?16*Number(r.replace("rem","")):r.includes("em")?16*Number(r.replace("em","")):Number(r):NaN}])},86812,39143,e=>{"use strict";var r=e.i(45981),o=e.i(71033),a=e.i(82451),n=e.i(90098),t=e.i(22442),i=e.i(43476);function l(e){return Object.entries(e).map(([e,r])=>`${e}: ${r};`).join("")}e.s(["MantineClasses",0,function(){let e=(0,t.useMantineTheme)(),l=(0,n.useMantineStyleNonce)(),c=(0,r.keys)(e.breakpoints).reduce((r,n)=>{let t=e.breakpoints[n].includes("px"),i=(0,o.px)(e.breakpoints[n]);return`${r}@media (max-width: ${t?`${i-.1}px`:(0,a.em)(i-.1)}) {.mantine-visible-from-${n} {display: none !important;}}@media (min-width: ${t?`${i}px`:(0,a.em)(i)}) {.mantine-hidden-from-${n} {display: none !important;}}`},"");return(0,i.jsx)("style",{"data-mantine-styles":"classes",nonce:l?.(),dangerouslySetInnerHTML:{__html:c}})}],86812),e.s(["convertCssVariables",0,function(e,r){let o=r?[r]:[":root",":host"],a=l(e.variables),n=a?`${o.join(", ")}{${a}}`:"",t=l(e.dark),i=l(e.light),c=e=>o.map(r=>":host"===r?`${r}([data-mantine-color-scheme="${e}"])`:`${r}[data-mantine-color-scheme="${e}"]`).join(", ");return`${n}
|
| 2 |
+
|
| 3 |
+
${t?`${c("dark")}{${t}}`:""}
|
| 4 |
+
|
| 5 |
+
${i?`${c("light")}{${i}}`:""}`}],39143)},35783,e=>{"use strict";var r=e.i(55634),o=e.i(82360),a=e.i(89825);function n({color:e,theme:r,autoContrast:a,colorScheme:t}){return("boolean"==typeof a?a:r.autoContrast)&&(0,o.parseThemeColor)({color:e||r.primaryColor,theme:r,colorScheme:t}).isLight?"var(--mantine-color-black)":"var(--mantine-color-white)"}function t(e,r,o){return n({color:"dark"===o?e.dark:e.light,theme:r,colorScheme:o,autoContrast:!0})}e.s(["getContrastColor",0,n,"getPrimaryContrastColor",0,function(e,o){let i=e.colors[e.primaryColor];return(0,a.isVirtualColor)(i)?e.autoContrast?t(i,e,o):"var(--mantine-color-white)":n({color:i[(0,r.getPrimaryShade)(e,o)],theme:e,autoContrast:null})},"getVirtualColorContrast",0,t])},29765,e=>{"use strict";var r=e.i(91375),o=e.i(90098),a=e.i(27515),n=e.i(22442),t=e.i(86812),i=e.i(39143),l=e.i(95335),c=e.i(45981),s=e.i(82451),m=e.i(55634),d=e.i(89825),u=e.i(35783),f=e.i(93738),h=e.i(71255);function b({theme:e,color:r,colorScheme:o,name:a=r,withColorValues:n=!0}){if(!e.colors[r])return{};if("light"===o){let o=(0,m.getPrimaryShade)(e,"light"),t={[`--mantine-color-${a}-text`]:`var(--mantine-color-${a}-filled)`,[`--mantine-color-${a}-filled`]:`var(--mantine-color-${a}-${o})`,[`--mantine-color-${a}-filled-hover`]:`var(--mantine-color-${a}-${9===o?8:o+1})`,[`--mantine-color-${a}-light`]:`var(--mantine-color-${a}-1)`,[`--mantine-color-${a}-light-hover`]:`var(--mantine-color-${a}-2)`,[`--mantine-color-${a}-light-color`]:`var(--mantine-color-${a}-9)`,[`--mantine-color-${a}-outline`]:`var(--mantine-color-${a}-${o})`,[`--mantine-color-${a}-outline-hover`]:(0,h.alpha)(e.colors[r][o],.05)};return n?{[`--mantine-color-${a}-0`]:e.colors[r][0],[`--mantine-color-${a}-1`]:e.colors[r][1],[`--mantine-color-${a}-2`]:e.colors[r][2],[`--mantine-color-${a}-3`]:e.colors[r][3],[`--mantine-color-${a}-4`]:e.colors[r][4],[`--mantine-color-${a}-5`]:e.colors[r][5],[`--mantine-color-${a}-6`]:e.colors[r][6],[`--mantine-color-${a}-7`]:e.colors[r][7],[`--mantine-color-${a}-8`]:e.colors[r][8],[`--mantine-color-${a}-9`]:e.colors[r][9],...t}:t}let t=(0,m.getPrimaryShade)(e,"dark"),i={[`--mantine-color-${a}-text`]:`var(--mantine-color-${a}-4)`,[`--mantine-color-${a}-filled`]:`var(--mantine-color-${a}-${t})`,[`--mantine-color-${a}-filled-hover`]:`var(--mantine-color-${a}-${9===t?8:t+1})`,[`--mantine-color-${a}-light`]:(0,f.darken)(e.colors[r][9],.5),[`--mantine-color-${a}-light-hover`]:(0,f.darken)(e.colors[r][9],.3),[`--mantine-color-${a}-light-color`]:`var(--mantine-color-${a}-0)`,[`--mantine-color-${a}-outline`]:`var(--mantine-color-${a}-${Math.max(t-4,0)})`,[`--mantine-color-${a}-outline-hover`]:(0,h.alpha)(e.colors[r][Math.max(t-4,0)],.05)};return n?{[`--mantine-color-${a}-0`]:e.colors[r][0],[`--mantine-color-${a}-1`]:e.colors[r][1],[`--mantine-color-${a}-2`]:e.colors[r][2],[`--mantine-color-${a}-3`]:e.colors[r][3],[`--mantine-color-${a}-4`]:e.colors[r][4],[`--mantine-color-${a}-5`]:e.colors[r][5],[`--mantine-color-${a}-6`]:e.colors[r][6],[`--mantine-color-${a}-7`]:e.colors[r][7],[`--mantine-color-${a}-8`]:e.colors[r][8],[`--mantine-color-${a}-9`]:e.colors[r][9],...i}:i}function g(e,r,o){(0,c.keys)(r).forEach(a=>Object.assign(e,{[`--mantine-${o}-${a}`]:r[a]}))}let v=e=>{let r=(0,m.getPrimaryShade)(e,"light"),o=e.defaultRadius in e.radius?e.radius[e.defaultRadius]:(0,s.rem)(e.defaultRadius),a={variables:{"--mantine-z-index-app":"100","--mantine-z-index-modal":"200","--mantine-z-index-popover":"300","--mantine-z-index-overlay":"400","--mantine-z-index-max":"9999","--mantine-scale":e.scale.toString(),"--mantine-cursor-type":e.cursorType,"--mantine-webkit-font-smoothing":e.fontSmoothing?"antialiased":"unset","--mantine-moz-font-smoothing":e.fontSmoothing?"grayscale":"unset","--mantine-color-white":e.white,"--mantine-color-black":e.black,"--mantine-line-height":e.lineHeights.md,"--mantine-font-family":e.fontFamily,"--mantine-font-family-monospace":e.fontFamilyMonospace,"--mantine-font-family-headings":e.headings.fontFamily,"--mantine-heading-font-weight":e.headings.fontWeight,"--mantine-heading-text-wrap":e.headings.textWrap,"--mantine-radius-default":o,"--mantine-primary-color-filled":`var(--mantine-color-${e.primaryColor}-filled)`,"--mantine-primary-color-filled-hover":`var(--mantine-color-${e.primaryColor}-filled-hover)`,"--mantine-primary-color-light":`var(--mantine-color-${e.primaryColor}-light)`,"--mantine-primary-color-light-hover":`var(--mantine-color-${e.primaryColor}-light-hover)`,"--mantine-primary-color-light-color":`var(--mantine-color-${e.primaryColor}-light-color)`},light:{"--mantine-color-scheme":"light","--mantine-primary-color-contrast":(0,u.getPrimaryContrastColor)(e,"light"),"--mantine-color-bright":"var(--mantine-color-black)","--mantine-color-text":e.black,"--mantine-color-body":e.white,"--mantine-color-error":"var(--mantine-color-red-6)","--mantine-color-success":"var(--mantine-color-teal-8)","--mantine-color-placeholder":"var(--mantine-color-gray-5)","--mantine-color-anchor":`var(--mantine-color-${e.primaryColor}-${r})`,"--mantine-color-default":"var(--mantine-color-white)","--mantine-color-default-hover":"var(--mantine-color-gray-0)","--mantine-color-default-color":"var(--mantine-color-black)","--mantine-color-default-border":"var(--mantine-color-gray-4)","--mantine-color-dimmed":"var(--mantine-color-gray-6)","--mantine-color-disabled":"var(--mantine-color-gray-2)","--mantine-color-disabled-color":"var(--mantine-color-gray-5)","--mantine-color-disabled-border":"var(--mantine-color-gray-3)"},dark:{"--mantine-color-scheme":"dark","--mantine-primary-color-contrast":(0,u.getPrimaryContrastColor)(e,"dark"),"--mantine-color-bright":"var(--mantine-color-white)","--mantine-color-text":"var(--mantine-color-dark-0)","--mantine-color-body":"var(--mantine-color-dark-7)","--mantine-color-error":"var(--mantine-color-red-8)","--mantine-color-success":"var(--mantine-color-teal-8)","--mantine-color-placeholder":"var(--mantine-color-dark-3)","--mantine-color-anchor":`var(--mantine-color-${e.primaryColor}-4)`,"--mantine-color-default":"var(--mantine-color-dark-6)","--mantine-color-default-hover":"var(--mantine-color-dark-5)","--mantine-color-default-color":"var(--mantine-color-white)","--mantine-color-default-border":"var(--mantine-color-dark-4)","--mantine-color-dimmed":"var(--mantine-color-dark-2)","--mantine-color-disabled":"var(--mantine-color-dark-6)","--mantine-color-disabled-color":"var(--mantine-color-dark-3)","--mantine-color-disabled-border":"var(--mantine-color-dark-4)"}};g(a.variables,e.breakpoints,"breakpoint"),g(a.variables,e.spacing,"spacing"),g(a.variables,e.fontSizes,"font-size"),g(a.variables,e.lineHeights,"line-height"),g(a.variables,e.shadows,"shadow"),g(a.variables,e.radius,"radius"),g(a.variables,e.fontWeights,"font-weight"),e.colors[e.primaryColor].forEach((r,o)=>{a.variables[`--mantine-primary-color-${o}`]=`var(--mantine-color-${e.primaryColor}-${o})`}),(0,c.keys)(e.colors).forEach(r=>{let o=e.colors[r];if((0,d.isVirtualColor)(o)){Object.assign(a.light,b({theme:e,name:o.name,color:o.light,colorScheme:"light",withColorValues:!0})),Object.assign(a.dark,b({theme:e,name:o.name,color:o.dark,colorScheme:"dark",withColorValues:!0})),a.light[`--mantine-color-${o.name}-contrast`]=(0,u.getVirtualColorContrast)(o,e,"light"),a.dark[`--mantine-color-${o.name}-contrast`]=(0,u.getVirtualColorContrast)(o,e,"dark");return}o.forEach((e,o)=>{a.variables[`--mantine-color-${r}-${o}`]=e}),Object.assign(a.light,b({theme:e,color:r,colorScheme:"light",withColorValues:!1})),Object.assign(a.dark,b({theme:e,color:r,colorScheme:"dark",withColorValues:!1}))});let n=e.headings.sizes;return(0,c.keys)(n).forEach(r=>{a.variables[`--mantine-${r}-font-size`]=n[r].fontSize,a.variables[`--mantine-${r}-line-height`]=n[r].lineHeight,a.variables[`--mantine-${r}-font-weight`]=n[r].fontWeight||e.headings.fontWeight}),a},$=v(e.i(38944).DEFAULT_THEME);var p=e.i(43476);function y({cssVariablesSelector:e,deduplicateCssVariables:r}){let a,t=(0,n.useMantineTheme)(),s=(0,o.useMantineStyleNonce)(),m=function({theme:e,generator:r}){let o=v(e),a=r?.(e);return a?(0,l.deepMerge)(o,a):o}({theme:t,generator:(0,o.useMantineCssVariablesResolver)()}),d=(void 0===e||":root"===e||":host"===e)&&r,u=(0,i.convertCssVariables)(d?(a={variables:{},light:{},dark:{}},(0,c.keys)(m.variables).forEach(e=>{$.variables[e]!==m.variables[e]&&(a.variables[e]=m.variables[e])}),(0,c.keys)(m.light).forEach(e=>{$.light[e]!==m.light[e]&&(a.light[e]=m.light[e])}),(0,c.keys)(m.dark).forEach(e=>{$.dark[e]!==m.dark[e]&&(a.dark[e]=m.dark[e])}),a):m,e);return u?(0,p.jsx)("style",{"data-mantine-styles":!0,nonce:s?.(),dangerouslySetInnerHTML:{__html:`${u}${d?"":(0,i.convertCssVariables)({variables:{},dark:{"--mantine-color-scheme":"dark"},light:{"--mantine-color-scheme":"light"}},e)}`}}):null}y.displayName="@mantine/CssVariables";var k=e.i(31141);function C({theme:e,children:i,getStyleNonce:l,withStaticClasses:c=!0,withGlobalClasses:s=!0,deduplicateCssVariables:m=!0,withCssVariables:d=!0,cssVariablesSelector:u,classNamesPrefix:f="mantine",colorSchemeManager:h=(0,r.localStorageColorSchemeManager)(),defaultColorScheme:b="light",getRootElement:g=()=>document.documentElement,cssVariablesResolver:v,forceColorScheme:$,stylesTransform:w,env:S,deduplicateInlineStyles:M=!1}){let{colorScheme:x,setColorScheme:T,clearColorScheme:E}=(0,a.useProviderColorScheme)({defaultColorScheme:b,forceColorScheme:$,manager:h,getRootElement:g});return!function({respectReducedMotion:e,getRootElement:r}){(0,k.useIsomorphicEffect)(()=>{e&&r()?.setAttribute("data-respect-reduced-motion","true")},[e])}({respectReducedMotion:e?.respectReducedMotion||!1,getRootElement:g}),(0,p.jsx)(o.MantineContext,{value:{colorScheme:x,setColorScheme:T,clearColorScheme:E,getRootElement:g,classNamesPrefix:f,getStyleNonce:l,cssVariablesResolver:v,cssVariablesSelector:u??":root",withStaticClasses:c,stylesTransform:w,env:S,deduplicateInlineStyles:M},children:(0,p.jsxs)(n.MantineThemeProvider,{theme:e,children:[d&&(0,p.jsx)(y,{cssVariablesSelector:u,deduplicateCssVariables:m}),s&&(0,p.jsx)(t.MantineClasses,{}),i]})})}function w({children:e,theme:r,env:a}){return(0,p.jsx)(o.MantineContext,{value:{colorScheme:"auto",setColorScheme:()=>{},clearColorScheme:()=>{},getRootElement:()=>document.documentElement,classNamesPrefix:"mantine",cssVariablesSelector:":root",withStaticClasses:!1,headless:!0,env:a},children:(0,p.jsx)(n.MantineThemeProvider,{theme:r,children:e})})}C.displayName="@mantine/core/MantineProvider",w.displayName="@mantine/core/HeadlessMantineProvider",e.s(["HeadlessMantineProvider",0,w,"MantineProvider",0,C],29765)}]);
|
out/_next/static/chunks/0xm351i8abo9i.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,10555,e=>{"use strict";var t=e.i(43476),r=e.i(71645),a=e.i(24848),l=e.i(43798),i=e.i(89549),o=e.i(14037),n=e.i(21879),s=e.i(44662),d={root:"m_7485cace"};let c={strategy:"block"},h=(0,l.createVarsResolver)((e,{size:t,fluid:r})=>({root:{"--container-size":r?void 0:(0,a.getSize)(t,"container-size")}})),u=(0,n.factory)(e=>{let r=(0,i.useProps)("Container",c,e),{classNames:a,className:l,style:n,styles:u,unstyled:p,vars:m,fluid:f,mod:x,attributes:g,strategy:v,...y}=r,j=(0,o.useStyles)({name:"Container",classes:d,props:r,className:l,style:n,classNames:a,styles:u,unstyled:p,attributes:g,vars:m,varsResolver:h});return(0,t.jsx)(s.Box,{mod:[{fluid:f,strategy:v},x],...j("root"),...y})});u.classes=d,u.varsResolver=h,u.displayName="@mantine/core/Container";var p=e.i(51501),m=e.i(98323),f=e.i(77936),x=e.i(64384),g=e.i(26200),v=e.i(92181),y=e.i(94229),j=e.i(25293),b=e.i(33372),S=e.i(82451),T=e.i(15259),w=e.i(84660);let[k,C]=(0,w.createSafeContext)("Table component was not found in the tree");var P={table:"m_b23fa0ef",th:"m_4e7aa4f3",tr:"m_4e7aa4fd",td:"m_4e7aa4ef",tbody:"m_b2404537",thead:"m_b242d975",caption:"m_9e5a3ac7",scrollContainer:"m_a100c15",scrollContainerInner:"m_62259741"};function _(e,r){let a=`Table${e.charAt(0).toUpperCase()}${e.slice(1)}`,l=(0,n.factory)(l=>{let o=(0,i.useProps)(a,{},l),{classNames:n,className:d,style:c,styles:h,...u}=o,p=C();return(0,t.jsx)(s.Box,{component:e,...function(e,t){if(!t)return;let r={};return t.columnBorder&&e.withColumnBorders&&(r["data-with-column-border"]=!0),t.rowBorder&&e.withRowBorders&&(r["data-with-row-border"]=!0),t.striped&&e.striped&&(r["data-striped"]=e.striped),t.highlightOnHover&&e.highlightOnHover&&(r["data-hover"]=!0),t.captionSide&&e.captionSide&&(r["data-side"]=e.captionSide),t.stickyHeader&&e.stickyHeader&&(r["data-sticky"]=!0),r}(p,r),...p.getStyles(e,{className:d,classNames:n,style:c,styles:h,props:o}),...u})});return l.displayName=`@mantine/core/${a}`,l.classes=P,l}let R=_("th",{columnBorder:!0}),E=_("td",{columnBorder:!0}),z=_("tr",{rowBorder:!0,striped:!0,highlightOnHover:!0}),M=_("thead",{stickyHeader:!0}),B=_("tbody"),I=_("tfoot"),A=_("caption",{captionSide:!0});function O({data:e}){return(0,t.jsxs)(t.Fragment,{children:[e.caption&&(0,t.jsx)(A,{children:e.caption}),e.head&&(0,t.jsx)(M,{children:(0,t.jsx)(z,{children:e.head.map((e,r)=>(0,t.jsx)(R,{children:e},r))})}),e.body&&(0,t.jsx)(B,{children:e.body.map((e,r)=>(0,t.jsx)(z,{children:e.map((e,r)=>(0,t.jsx)(E,{children:e},r))},r))}),e.foot&&(0,t.jsx)(I,{children:(0,t.jsx)(z,{children:e.foot.map((e,r)=>(0,t.jsx)(R,{children:e},r))})})]})}O.displayName="@mantine/core/TableDataRenderer";var D=e.i(47596);let N={type:"scrollarea"},F=(0,l.createVarsResolver)((e,{minWidth:t,maxHeight:r,type:a})=>({scrollContainer:{"--table-min-width":(0,S.rem)(t),"--table-max-height":(0,S.rem)(r),"--table-overflow":"native"===a?"auto":void 0}})),L=(0,n.factory)(e=>{let r=(0,i.useProps)("TableScrollContainer",N,e),{classNames:a,className:l,style:n,styles:d,unstyled:c,vars:h,children:u,minWidth:p,maxHeight:m,type:f,scrollAreaProps:x,attributes:g,...v}=r,y=(0,o.useStyles)({name:"TableScrollContainer",classes:P,props:r,className:l,style:n,classNames:a,styles:d,unstyled:c,attributes:g,vars:h,varsResolver:F,rootSelector:"scrollContainer"});return(0,t.jsx)(s.Box,{component:"scrollarea"===f?D.ScrollArea:"div",..."scrollarea"===f?m?{offsetScrollbars:"xy",...x}:{offsetScrollbars:"x",...x}:{},...y("scrollContainer"),...v,children:(0,t.jsx)("div",{...y("scrollContainerInner"),children:u})})});L.classes=P,L.varsResolver=F,L.displayName="@mantine/core/TableScrollContainer";let G={withRowBorders:!0,verticalSpacing:7},$=(0,l.createVarsResolver)((e,{layout:t,captionSide:r,horizontalSpacing:l,verticalSpacing:i,borderColor:o,stripedColor:n,highlightOnHoverColor:s,striped:d,highlightOnHover:c,stickyHeaderOffset:h,stickyHeader:u})=>({table:{"--table-layout":t,"--table-caption-side":r,"--table-horizontal-spacing":(0,a.getSpacing)(l),"--table-vertical-spacing":(0,a.getSpacing)(i),"--table-border-color":o?(0,T.getThemeColor)(o,e):void 0,"--table-striped-color":d&&n?(0,T.getThemeColor)(n,e):void 0,"--table-highlight-on-hover-color":c&&s?(0,T.getThemeColor)(s,e):void 0,"--table-sticky-header-offset":u?(0,S.rem)(h):void 0}})),U=(0,n.factory)(e=>{let r=(0,i.useProps)("Table",G,e),{classNames:a,className:l,style:n,styles:d,unstyled:c,vars:h,horizontalSpacing:u,verticalSpacing:p,captionSide:m,stripedColor:f,highlightOnHoverColor:x,striped:g,highlightOnHover:v,withColumnBorders:y,withRowBorders:j,withTableBorder:b,borderColor:S,layout:T,data:w,children:C,stickyHeader:_,stickyHeaderOffset:R,mod:E,tabularNums:z,attributes:M,...B}=r,I=(0,o.useStyles)({name:"Table",props:r,className:l,style:n,classes:P,classNames:a,styles:d,unstyled:c,attributes:M,rootSelector:"table",vars:h,varsResolver:$});return(0,t.jsx)(k,{value:{getStyles:I,stickyHeader:_,striped:!0===g?"odd":g||void 0,highlightOnHover:v,withColumnBorders:y,withRowBorders:j,captionSide:m||"bottom"},children:(0,t.jsx)(s.Box,{component:"table",mod:[{"data-with-table-border":b,"data-tabular-nums":z},E],...I("table"),...B,children:C||!!w&&(0,t.jsx)(O,{data:w})})})});U.classes=P,U.varsResolver=$,U.displayName="@mantine/core/Table",U.Td=E,U.Th=R,U.Tr=z,U.Thead=M,U.Tbody=B,U.Tfoot=I,U.Caption=A,U.ScrollContainer=L,U.DataRenderer=O;var H=e.i(56684),V=e.i(69625),q=e.i(73404);function W(e,t){return r=>{if("string"!=typeof r||0===r.trim().length)throw Error(t);return`${e}-${r}`}}var J=e.i(35783),X=e.i(12761);let[Z,K]=(0,w.createSafeContext)("Tabs component was not found in the tree");var Y={root:"m_89d60db1","list--default":"m_576c9d4",list:"m_89d33d6d",tab:"m_4ec4dce6",panel:"m_b0c91715",tabSection:"m_fc420b1f",tabLabel:"m_42bbd1ae","tab--default":"m_539e827b","list--outline":"m_6772fbd5","tab--outline":"m_b59ab47c","tab--pills":"m_c3381914"};let Q=(0,n.factory)(e=>{let r=(0,i.useProps)("TabsList",null,e),{children:a,className:l,grow:o,justify:n,classNames:d,styles:c,style:h,mod:u,...p}=r,m=K();return(0,t.jsx)(s.Box,{...m.getStyles("list",{className:l,style:h,classNames:d,styles:c,props:r,variant:m.variant}),role:"tablist",variant:m.variant,mod:[{grow:o,orientation:m.orientation,placement:"vertical"===m.orientation&&m.placement,inverted:m.inverted},u],"aria-orientation":m.orientation,__vars:{"--tabs-justify":n},...p,children:a})});Q.classes=Y,Q.displayName="@mantine/core/TabsList";var ee=e.i(90098);let et=(0,n.factory)(e=>{let a=(0,i.useProps)("TabsPanel",null,e),{children:l,className:o,value:n,classNames:d,styles:c,style:h,mod:u,keepMounted:p,...m}=a,f=(0,ee.useMantineEnv)(),x=K();(0,r.useEffect)(()=>(x.setMountedPanel(n,!0),()=>{x.setMountedPanel(n,!1)}),[n]);let g=x.value===n,v=x.keepMounted||p,y="display-none"!==x.keepMountedMode,j=v&&y&&"test"!==f?(0,t.jsx)(r.Activity,{mode:g?"visible":"hidden",children:l}):v||g?l:null;return(0,t.jsx)(s.Box,{...x.getStyles("panel",{className:o,classNames:d,styles:c,style:[h,g?void 0:{display:"none"}],props:a}),mod:[{orientation:x.orientation},u],role:"tabpanel",id:x.getPanelId(n),"aria-labelledby":x.getTabId(n),...m,children:j})});function er(e,t){let r=e;for(;(r=r.parentElement)&&!r.matches(t););return r}function ea(e,t,r){for(let r=e-1;r>=0;r-=1)if(!t[r].disabled)return r;if(r){for(let e=t.length-1;e>-1;e-=1)if(!t[e].disabled)return e}return e}function el(e,t,r){for(let r=e+1;r<t.length;r+=1)if(!t[r].disabled)return r;if(r){for(let e=0;e<t.length;e+=1)if(!t[e].disabled)return e}return e}et.classes=Y,et.displayName="@mantine/core/TabsPanel";var ei=e.i(22442),eo=e.i(17303),en=e.i(25436);let es=(0,n.factory)(e=>{let r=(0,i.useProps)("TabsTab",null,e),{className:a,children:l,rightSection:o,leftSection:n,value:s,onClick:d,onKeyDown:c,disabled:h,color:u,style:p,classNames:m,styles:f,vars:x,mod:g,tabIndex:v,...y}=r,j=(0,ei.useMantineTheme)(),{dir:b}=(0,eo.useDirection)(),S=K(),w=s===S.value,k={classNames:m,styles:f,props:r};return(0,t.jsxs)(en.UnstyledButton,{...S.getStyles("tab",{className:a,style:p,variant:S.variant,...k}),disabled:h,unstyled:S.unstyled,variant:S.variant,mod:[{active:w,disabled:h,orientation:S.orientation,inverted:S.inverted,placement:"vertical"===S.orientation&&S.placement},g],role:"tab",id:S.getTabId(s),"aria-selected":w,tabIndex:void 0!==v?v:w||null===S.value?0:-1,"aria-controls":S.mountedPanels.current.has(s)?S.getPanelId(s):void 0,onClick:e=>{S.onChange(S.allowTabDeactivation&&s===S.value?null:s),d?.(e)},__vars:{"--tabs-color":u?(0,T.getThemeColor)(u,j):void 0},onKeyDown:function({parentSelector:e,siblingSelector:t,onKeyDown:r,loop:a=!0,activateOnFocus:l=!1,dir:i="rtl",orientation:o}){return n=>{r?.(n);let s=Array.from(er(n.currentTarget,e)?.querySelectorAll(t)||[]).filter(t=>{var r;return r=n.currentTarget,er(r,e)===er(t,e)}),d=s.findIndex(e=>n.currentTarget===e),c=el(d,s,a),h=ea(d,s,a),u="rtl"===i?h:c,p="rtl"===i?c:h;switch(n.key){case"ArrowRight":"horizontal"===o&&(n.stopPropagation(),n.preventDefault(),s[u].focus(),l&&s[u].click());break;case"ArrowLeft":"horizontal"===o&&(n.stopPropagation(),n.preventDefault(),s[p].focus(),l&&s[p].click());break;case"ArrowUp":"vertical"===o&&(n.stopPropagation(),n.preventDefault(),s[h].focus(),l&&s[h].click());break;case"ArrowDown":"vertical"===o&&(n.stopPropagation(),n.preventDefault(),s[c].focus(),l&&s[c].click());break;case"Home":n.stopPropagation(),n.preventDefault(),s[el(-1,s,!1)]?.focus();break;case"End":n.stopPropagation(),n.preventDefault(),s[ea(s.length,s,!1)]?.focus()}}}({siblingSelector:'[role="tab"]',parentSelector:'[role="tablist"]',activateOnFocus:S.activateTabWithKeyboard,loop:S.loop,orientation:S.orientation||"horizontal",dir:b,onKeyDown:c}),...y,children:[n&&(0,t.jsx)("span",{...S.getStyles("tabSection",k),"data-position":"left",children:n}),l&&(0,t.jsx)("span",{...S.getStyles("tabLabel",k),children:l}),o&&(0,t.jsx)("span",{...S.getStyles("tabSection",k),"data-position":"right",children:o})]})});es.classes=Y,es.displayName="@mantine/core/TabsTab";let ed=e=>(e+1)%1e6;var ec=e.i(51937),eh=e.i(46614);let eu="Tabs.Tab or Tabs.Panel component was rendered with invalid value or without value",ep={keepMounted:!0,keepMountedMode:"activity",orientation:"horizontal",loop:!0,activateTabWithKeyboard:!0,variant:"default",placement:"left"},em=(0,l.createVarsResolver)((e,{radius:t,color:r,autoContrast:l})=>({root:{"--tabs-radius":(0,a.getRadius)(t),"--tabs-color":(0,T.getThemeColor)(r,e),"--tabs-text-color":(0,X.getAutoContrastValue)(l,e)?(0,J.getContrastColor)({color:r,theme:e,autoContrast:l}):void 0}})),ef=(0,n.factory)(e=>{let a=(0,i.useProps)("Tabs",ep,e),{defaultValue:l,value:n,onChange:d,orientation:c,children:h,loop:u,id:p,activateTabWithKeyboard:m,allowTabDeactivation:f,variant:x,color:g,radius:v,inverted:y,placement:j,keepMounted:b,keepMountedMode:S,classNames:T,styles:w,unstyled:k,className:C,style:P,vars:_,autoContrast:R,mod:E,attributes:z,...M}=a,B=(0,ec.useId)(p),I=(0,r.useRef)(new Set),A=function(){let[,e]=(0,r.useReducer)(ed,0);return e}(),O=(0,r.useCallback)((e,t)=>{let r=I.current;t&&!r.has(e)?(r.add(e),A()):!t&&r.has(e)&&(r.delete(e),A())},[]),[D,N]=(0,eh.useUncontrolled)({value:n,defaultValue:l,finalValue:null,onChange:d}),F=(0,o.useStyles)({name:"Tabs",props:a,classes:Y,className:C,style:P,classNames:T,styles:w,unstyled:k,attributes:z,vars:_,varsResolver:em});return(0,t.jsx)(Z,{value:{placement:j,value:D,orientation:c,id:B,loop:u,activateTabWithKeyboard:m,getTabId:W(`${B}-tab`,eu),getPanelId:W(`${B}-panel`,eu),onChange:N,allowTabDeactivation:f,variant:x,color:g,radius:v,inverted:y,keepMounted:b,keepMountedMode:S,unstyled:k,getStyles:F,mountedPanels:I,setMountedPanel:O},children:(0,t.jsx)(s.Box,{id:B,variant:x,mod:[{orientation:c,inverted:"horizontal"===c&&y,placement:"vertical"===c&&j},E],...F("root"),...M,children:h})})});ef.classes=Y,ef.varsResolver=em,ef.displayName="@mantine/core/Tabs",ef.Tab=es,ef.Panel=et,ef.List=Q;var ex=e.i(95991),eg={root:"m_8b3717df",breadcrumb:"m_f678d540",separator:"m_3b8f2208"};let ev={separator:"/"},ey=(0,l.createVarsResolver)((e,{separatorMargin:t})=>({root:{"--bc-separator-margin":(0,a.getSpacing)(t)}})),ej=(0,n.factory)(e=>{let a=(0,i.useProps)("Breadcrumbs",ev,e),{classNames:l,className:n,style:d,styles:c,unstyled:h,vars:u,children:p,separator:m,separatorMargin:f,attributes:x,...g}=a,v=(0,o.useStyles)({name:"Breadcrumbs",classes:eg,props:a,className:n,style:d,classNames:l,styles:c,unstyled:h,attributes:x,vars:u,varsResolver:ey}),y=r.Children.toArray(p).reduce((e,t,a,l)=>{let i=(0,ex.isElement)(t)?(0,r.cloneElement)(t,{...v("breadcrumb",{className:t.props?.className}),key:a}):(0,r.createElement)("div",{...v("breadcrumb"),key:a},t);return e.push(i),a!==l.length-1&&e.push((0,r.createElement)(s.Box,{...v("separator"),key:`separator-${a}`},m)),e},[]);return(0,t.jsx)(s.Box,{...v("root"),...g,children:y})});ej.classes=eg,ej.varsResolver=ey,ej.displayName="@mantine/core/Breadcrumbs";var eb=e.i(57942),eS={root:"m_849cf0da"},eT=e.i(7670);let ew={underline:"hover"},ek=(0,eb.polymorphicFactory)(e=>{let{underline:r,className:a,unstyled:l,mod:o,...n}=(0,i.useProps)("Anchor",ew,e);return(0,t.jsx)(y.Text,{component:"a",className:(0,eT.default)({[eS.root]:!l},a),...n,mod:[{underline:r},o],__staticSelector:"Anchor",unstyled:l})});ek.classes=eS,ek.displayName="@mantine/core/Anchor";var eC=e.i(81363),eP=e.i(653),e_=e.i(98526),eR=e.i(32503),eE=e.i(67775),ez=e.i(39194),eM=e.i(68637),eB=e.i(68598),eI=e.i(95556),eA=e.i(98193);let eO={duration:100,transition:"fade"};function eD(e,t){return{...eO,...t,...e}}var eN={tooltip:"m_1b3c8819",arrow:"m_f898399f"},eF=e.i(29315),eL=e.i(58950),eG=e.i(43489),e$=e.i(31316);let eU={refProp:"ref",withinPortal:!0,offset:10,position:"right",zIndex:(0,e_.getDefaultZIndex)("popover")},eH=(0,l.createVarsResolver)((e,{radius:t,color:r})=>({tooltip:{"--tooltip-radius":void 0===t?void 0:(0,a.getRadius)(t),"--tooltip-bg":r?(0,T.getThemeColor)(r,e):void 0,"--tooltip-color":r?"var(--mantine-color-white)":void 0}})),eV=(0,n.factory)(e=>{let a=(0,i.useProps)("TooltipFloating",eU,e),{children:l,refProp:n,withinPortal:d,style:c,className:h,classNames:u,styles:p,unstyled:m,radius:f,color:x,label:g,offset:v,position:y,multiline:j,zIndex:b,disabled:S,defaultOpened:T,variant:w,vars:k,portalProps:C,attributes:P,ref:_,...R}=a,E=(0,ei.useMantineTheme)(),z=(0,o.useStyles)({name:"TooltipFloating",props:a,classes:eN,className:h,style:c,classNames:u,styles:p,unstyled:m,attributes:P,rootSelector:"tooltip",vars:k,varsResolver:eH}),{handleMouseMove:M,x:B,y:I,opened:A,boundaryRef:O,floating:D,setOpened:N}=function({offset:e,position:t,defaultOpened:a}){let[l,i]=(0,r.useState)(a),o=(0,r.useRef)(null),{x:n,y:s,elements:d,refs:c,update:h,placement:u}=(0,eG.useFloating)({placement:t,middleware:[(0,eL.shift)({crossAxis:!0,padding:5,rootBoundary:"document"})]}),p=u.includes("right")?e:t.includes("left")?-1*e:0,m=u.includes("bottom")?e:t.includes("top")?-1*e:0,f=(0,r.useCallback)(({clientX:e,clientY:t})=>{c.setPositionReference({getBoundingClientRect:()=>({width:0,height:0,x:e,y:t,left:e+p,top:t+m,right:e,bottom:t})})},[d.reference]);return(0,r.useEffect)(()=>{if(c.floating.current){let e=o.current;e.addEventListener("mousemove",f);let t=(0,eF.getOverflowAncestors)(c.floating.current);return t.forEach(e=>{e.addEventListener("scroll",h)}),()=>{e.removeEventListener("mousemove",f),t.forEach(e=>{e.removeEventListener("scroll",h)})}}},[d.reference,c.floating.current,h,f,l]),{handleMouseMove:f,x:n,y:s,opened:l,setOpened:i,boundaryRef:o,floating:c.setFloating}}({offset:v,position:y,defaultOpened:T}),F=(0,eE.getSingleElementChild)(l);if(!F)throw Error("[@mantine/core] Tooltip.Floating component children should be an element or a component that accepts ref, fragments, strings, numbers and other primitive values are not supported");let L=(0,e$.useMergedRef)(O,(0,eR.getRefProp)(F),_),G=F.props;return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(eI.OptionalPortal,{...C,withinPortal:d,children:(0,t.jsx)(s.Box,{...R,...z("tooltip",{style:{...function e(t,r){return Array.isArray(t)?[...t].reduce((t,a)=>({...t,...e(a,r)}),{}):"function"==typeof t?t(r):null==t?{}:t}(c,E),zIndex:b,display:!S&&A?"block":"none",top:(I&&Math.round(I))??"",left:(B&&Math.round(B))??""}}),variant:w,ref:D,mod:{multiline:j},children:g})}),(0,r.cloneElement)(F,{...G,[n]:L,onMouseEnter:e=>{G.onMouseEnter?.(e),M(e),N(!0)},onMouseLeave:e=>{G.onMouseLeave?.(e),N(!1)}})]})});eV.classes=eN,eV.varsResolver=eH,eV.displayName="@mantine/core/TooltipFloating";let eq=(0,r.createContext)({withinGroup:!1}),eW={openDelay:0,closeDelay:0};function eJ(e){let{openDelay:r,closeDelay:a,children:l}=(0,i.useProps)("TooltipGroup",eW,e);return(0,t.jsx)(eq,{value:{withinGroup:!0},children:(0,t.jsx)(eG.FloatingDelayGroup,{delay:{open:r,close:a},children:l})})}eJ.displayName="@mantine/core/TooltipGroup",eJ.extend=e=>e;var eX=e.i(31141),eZ=e.i(53760);let eK={position:"top",refProp:"ref",withinPortal:!0,arrowSize:4,arrowOffset:5,arrowRadius:0,arrowPosition:"side",offset:5,transitionProps:{duration:100,transition:"fade"},events:{hover:!0,focus:!1,touch:!1},zIndex:(0,e_.getDefaultZIndex)("popover"),middlewares:{flip:!0,shift:!0,inline:!1}},eY=(0,l.createVarsResolver)((e,{radius:t,color:r,variant:l,autoContrast:i})=>{let o=e.variantColorResolver({theme:e,color:r||e.primaryColor,autoContrast:i,variant:l||"filled"});return{tooltip:{"--tooltip-radius":void 0===t?void 0:(0,a.getRadius)(t),"--tooltip-bg":r?o.background:void 0,"--tooltip-color":r?o.color:void 0}}}),eQ=(0,n.factory)(e=>{let a=(0,i.useProps)("Tooltip",eK,e),{children:l,position:n,refProp:d,label:c,openDelay:h,closeDelay:u,onPositionChange:p,opened:m,defaultOpened:f,withinPortal:x,radius:g,color:v,classNames:y,styles:j,unstyled:b,style:S,className:T,withArrow:w,arrowSize:k,arrowOffset:C,arrowRadius:P,arrowPosition:_,offset:R,transitionProps:E,multiline:z,events:M,zIndex:B,disabled:I,onClick:A,onMouseEnter:O,onMouseLeave:D,inline:N,variant:F,keepMounted:L,vars:G,portalProps:$,mod:U,floatingStrategy:H,middlewares:V,autoContrast:q,attributes:W,target:J,ref:X,...Z}=a,{dir:K}=(0,eo.useDirection)(),Y=(0,r.useRef)(null),Q=function(e){let t,a,[l,i]=(0,r.useState)(e.defaultOpened),o="boolean"==typeof e.opened?e.opened:l,n=(0,r.use)(eq).withinGroup,s=(0,ec.useId)(),d=(0,r.useCallback)(e=>{i(e),e&&y(s)},[s]),{x:c,y:h,context:u,refs:p,placement:m,middlewareData:{arrow:{x:f,y:x}={}}}=(0,eG.useFloating)({strategy:e.strategy,placement:e.position,open:o,onOpenChange:d,middleware:(t=function(e){if(void 0===e)return{shift:!0,flip:!0};let t={...e};return void 0===e.shift&&(t.shift=!0),void 0===e.flip&&(t.flip=!0),t}(e.middlewares),a=[(0,eL.offset)(e.offset)],t.shift&&a.push((0,eL.shift)("boolean"==typeof t.shift?{padding:8}:{padding:8,...t.shift})),t.flip&&a.push("boolean"==typeof t.flip?(0,eL.flip)():(0,eL.flip)(t.flip)),a.push((0,eL.arrow)({element:e.arrowRef,padding:e.arrowOffset})),t.inline?a.push("boolean"==typeof t.inline?(0,eL.inline)():(0,eL.inline)(t.inline)):e.inline&&a.push((0,eL.inline)()),a),whileElementsMounted:eZ.autoUpdate}),{delay:g,currentId:v,setCurrentId:y}=(0,eG.useDelayGroup)(u,{id:s}),{getReferenceProps:j,getFloatingProps:b}=(0,eG.useInteractions)([(0,eG.useHover)(u,{enabled:e.events?.hover,delay:n?g:{open:e.openDelay,close:e.closeDelay},mouseOnly:!e.events?.touch}),(0,eG.useFocus)(u,{enabled:e.events?.focus,visibleOnly:!0}),(0,eG.useRole)(u,{role:"tooltip"}),(0,eG.useDismiss)(u,{enabled:void 0===e.opened})]),S=(0,r.useRef)(m);(0,eX.useIsomorphicEffect)(()=>{S.current!==m&&(S.current=m,e.onPositionChange?.(m))},[m]);let T=o&&v&&v!==s;return{x:c,y:h,arrowX:f,arrowY:x,reference:p.setReference,floating:p.setFloating,getFloatingProps:b,getReferenceProps:j,isGroupPhase:T,opened:o,placement:m}}({position:(0,eB.getFloatingPosition)(K,n),closeDelay:u,openDelay:h,onPositionChange:p,opened:m,defaultOpened:f,events:M,arrowRef:Y,arrowOffset:C,offset:"number"==typeof R?R+(w?k/2:0):R,inline:N,strategy:H,middlewares:V});(0,r.useEffect)(()=>{let e=J instanceof HTMLElement?J:"string"==typeof J?document.querySelector(J):J?.current||null;e&&Q.reference(e)},[J,Q]);let ee=(0,o.useStyles)({name:"Tooltip",props:a,classes:eN,className:T,style:S,classNames:y,styles:j,unstyled:b,attributes:W,rootSelector:"tooltip",vars:G,varsResolver:eY}),et=(0,eE.getSingleElementChild)(l);if(!J&&!et)throw Error("[@mantine/core] Tooltip component children should be an element or a component that accepts ref, fragments, strings, numbers and other primitive values are not supported");let er=ee("tooltip"),ea="merge"===_&&w?(0,ez.getArrowMergeDropdownStyles)({position:Q.placement,dir:K}):void 0;if(J){let e=eD(E,{duration:100,transition:"fade"});return(0,t.jsx)(t.Fragment,{children:(0,t.jsx)(eI.OptionalPortal,{...$,withinPortal:x,children:(0,t.jsx)(eA.Transition,{...e,keepMounted:L,mounted:!I&&!!Q.opened,duration:Q.isGroupPhase?10:e.duration,children:e=>(0,t.jsxs)(s.Box,{...Z,"data-fixed":"fixed"===H||void 0,variant:F,mod:[{multiline:z},U],...er,...Q.getFloatingProps({ref:Q.floating,className:er.className,style:{...er.style,...e,...ea,zIndex:B,top:Q.y??0,left:Q.x??0}}),children:[c,(0,t.jsx)(eM.FloatingArrow,{ref:Y,arrowX:Q.arrowX,arrowY:Q.arrowY,visible:w,position:Q.placement,arrowSize:k,arrowOffset:C,arrowRadius:P,arrowPosition:_,...ee("arrow")})]})})})})}let el=et.props,ei=(0,e$.useMergedRef)(Q.reference,(0,eR.getRefProp)(et),X),en=eD(E,{duration:100,transition:"fade"});return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(eI.OptionalPortal,{...$,withinPortal:x,children:(0,t.jsx)(eA.Transition,{...en,keepMounted:L,mounted:!I&&!!Q.opened,duration:Q.isGroupPhase?10:en.duration,children:e=>(0,t.jsxs)(s.Box,{...Z,"data-fixed":"fixed"===H||void 0,variant:F,mod:[{multiline:z},U],...Q.getFloatingProps({ref:Q.floating,className:ee("tooltip").className,style:{...ee("tooltip").style,...e,...ea,zIndex:B,top:Q.y??0,left:Q.x??0}}),children:[c,(0,t.jsx)(eM.FloatingArrow,{ref:Y,arrowX:Q.arrowX,arrowY:Q.arrowY,visible:w,position:Q.placement,arrowSize:k,arrowOffset:C,arrowRadius:P,arrowPosition:_,...ee("arrow")})]})})}),(0,r.cloneElement)(et,Q.getReferenceProps({onClick:A,onMouseEnter:O,onMouseLeave:D,onMouseMove:a.onMouseMove,onPointerDown:a.onPointerDown,onPointerEnter:a.onPointerEnter,...el,className:(0,eT.default)(T,el.className),[d]:ei}))]})});eQ.classes=eN,eQ.varsResolver=eY,eQ.displayName="@mantine/core/Tooltip",eQ.Floating=eV,eQ.Group=eJ;var e0=e.i(27556),e1={root:"m_66836ed3",wrapper:"m_a5d60502",body:"m_667c2793",title:"m_6a03f287",label:"m_698f4f23",icon:"m_667f2a6a",message:"m_7fa78076",closeButton:"m_87f54839"};let e2=(0,l.createVarsResolver)((e,{radius:t,color:r,variant:l,autoContrast:i})=>{let o=e.variantColorResolver({color:r||e.primaryColor,theme:e,variant:l||"light",autoContrast:i});return{root:{"--alert-radius":void 0===t?void 0:(0,a.getRadius)(t),"--alert-bg":r||l?o.background:void 0,"--alert-color":o.color,"--alert-bd":r||l?o.border:void 0}}}),e6=(0,n.factory)(e=>{let r=(0,i.useProps)("Alert",null,e),{classNames:a,className:l,style:n,styles:d,unstyled:c,vars:h,radius:u,color:p,title:m,children:f,id:x,icon:g,withCloseButton:v,onClose:y,closeButtonLabel:j,variant:b,autoContrast:S,role:T,attributes:w,...k}=r,C=(0,o.useStyles)({name:"Alert",classes:e1,props:r,className:l,style:n,classNames:a,styles:d,unstyled:c,attributes:w,vars:h,varsResolver:e2}),P=(0,ec.useId)(x),_=m&&`${P}-title`||void 0,R=`${P}-body`;return(0,t.jsx)(s.Box,{id:P,...C("root",{variant:b}),variant:b,...k,role:T||"alert","aria-describedby":f?R:void 0,"aria-labelledby":m?_:void 0,children:(0,t.jsxs)("div",{...C("wrapper"),children:[g&&(0,t.jsx)("div",{...C("icon"),children:g}),(0,t.jsxs)("div",{...C("body"),children:[m&&(0,t.jsx)("div",{...C("title"),"data-with-close-button":v||void 0,children:(0,t.jsx)("span",{id:_,...C("label"),children:m})}),f&&(0,t.jsx)("div",{id:R,...C("message"),"data-variant":b,children:f})]}),v&&(0,t.jsx)(e0.CloseButton,{...C("closeButton"),onClick:y,variant:"transparent",size:16,iconSize:16,"aria-label":j,unstyled:c})]})})});e6.classes=e1,e6.varsResolver=e2,e6.displayName="@mantine/core/Alert";var e5=e.i(77193),e7=e.i(29277),e4=e.i(11644),e3={root:"m_9e117634"};let e9=(0,l.createVarsResolver)((e,{radius:t,fit:r})=>({root:{"--image-radius":void 0===t?void 0:(0,a.getRadius)(t),"--image-object-fit":r}})),e8=(0,eb.polymorphicFactory)(e=>{let a=(0,i.useProps)("Image",null,e),{classNames:l,className:n,style:d,styles:c,unstyled:h,vars:u,onError:p,src:m,radius:f,fit:x,fallbackSrc:g,mod:v,attributes:y,...j}=a,[b,S]=(0,r.useState)(!m);(0,r.useEffect)(()=>S(!m),[m]);let T=(0,o.useStyles)({name:"Image",classes:e3,props:a,className:n,style:d,classNames:l,styles:c,unstyled:h,attributes:y,vars:u,varsResolver:e9});return b&&g?(0,t.jsx)(s.Box,{component:"img",src:g,...T("root"),onError:p,mod:["fallback",v],...j}):(0,t.jsx)(s.Box,{component:"img",...T("root"),src:m,onError:e=>{p?.(e),S(!0)},mod:v,...j})});e8.classes=e3,e8.varsResolver=e9,e8.displayName="@mantine/core/Image";var te=e.i(13029),tt=e.i(42948),tr={root:"m_6e45937b",loader:"m_e8eb006c",overlay:"m_df587f17"};let ta={transitionProps:{transition:"fade",duration:0},overlayProps:{backgroundOpacity:.75},zIndex:(0,e_.getDefaultZIndex)("overlay")},tl=(0,l.createVarsResolver)((e,{zIndex:t})=>({root:{"--lo-z-index":t?.toString()}})),ti=(0,n.factory)(e=>{let r=(0,i.useProps)("LoadingOverlay",ta,e),{classNames:a,className:l,style:n,styles:d,unstyled:c,vars:h,transitionProps:u,loaderProps:p,overlayProps:m,visible:f,zIndex:x,attributes:g,onEnter:v,onEntered:y,onExit:j,onExited:b,...S}=r,T=(0,ei.useMantineTheme)(),w=(0,o.useStyles)({name:"LoadingOverlay",classes:tr,props:r,className:l,style:n,classNames:a,styles:d,unstyled:c,attributes:g,vars:h,varsResolver:tl}),k={...ta.overlayProps,...m};return(0,t.jsx)(eA.Transition,{transition:"fade",...u,mounted:!!f,onEnter:v,onEntered:y,onExit:j,onExited:b,children:e=>(0,t.jsxs)(s.Box,{...w("root",{style:e}),...S,children:[(0,t.jsx)(tt.Loader,{unstyled:c,...p,...w("loader",{className:p?.className,style:p?.style})}),(0,t.jsx)(te.Overlay,{...k,...w("overlay",{className:k?.className,style:k?.style}),darkHidden:!0,unstyled:c,color:m?.color||T.white}),(0,t.jsx)(te.Overlay,{...k,...w("overlay",{className:k?.className,style:k?.style}),lightHidden:!0,unstyled:c,color:m?.color||T.colors.dark[5]})]})})});ti.classes=tr,ti.varsResolver=tl,ti.displayName="@mantine/core/LoadingOverlay";var to=e.i(29765),tn=e.i(53165),ts=e.i(32591),td=e.i(33550);let tc=(0,td.default)("outline","download","Download",[["path",{d:"M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2v-2",key:"svg-0"}],["path",{d:"M7 11l5 5l5 -5",key:"svg-1"}],["path",{d:"M12 4l0 12",key:"svg-2"}]]);var th=e.i(57662),tu=e.i(12522);let tp=(0,td.default)("outline","file","File",[["path",{d:"M14 3v4a1 1 0 0 0 1 1h4",key:"svg-0"}],["path",{d:"M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2",key:"svg-1"}]]),tm=(0,td.default)("outline","player-play","PlayerPlay",[["path",{d:"M7 4v16l13 -8l-13 -8",key:"svg-0"}]]),tf=(0,td.default)("outline","player-pause","PlayerPause",[["path",{d:"M6 6a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v12a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1l0 -12",key:"svg-0"}],["path",{d:"M14 6a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v12a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1l0 -12",key:"svg-1"}]]);var tx=e.i(18716),tg=e.i(17708),tv=e.i(14552),ty=e.i(6916);let tj=(0,td.default)("outline","alert-circle","AlertCircle",[["path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0",key:"svg-0"}],["path",{d:"M12 8v4",key:"svg-1"}],["path",{d:"M12 16h.01",key:"svg-2"}]]),tb=(0,td.default)("outline","check","Check",[["path",{d:"M5 12l5 5l10 -10",key:"svg-0"}]]),tS=(0,td.default)("outline","settings","Settings",[["path",{d:"M10.325 4.317c.426 -1.756 2.924 -1.756 3.35 0a1.724 1.724 0 0 0 2.573 1.066c1.543 -.94 3.31 .826 2.37 2.37a1.724 1.724 0 0 0 1.065 2.572c1.756 .426 1.756 2.924 0 3.35a1.724 1.724 0 0 0 -1.066 2.573c.94 1.543 -.826 3.31 -2.37 2.37a1.724 1.724 0 0 0 -2.572 1.065c-.426 1.756 -2.924 1.756 -3.35 0a1.724 1.724 0 0 0 -2.573 -1.066c-1.543 .94 -3.31 -.826 -2.37 -2.37a1.724 1.724 0 0 0 -1.065 -2.572c-1.756 -.426 -1.756 -2.924 0 -3.35a1.724 1.724 0 0 0 1.066 -2.573c-.94 -1.543 .826 -3.31 2.37 -2.37c1 .608 2.296 .07 2.572 -1.065",key:"svg-0"}],["path",{d:"M9 12a3 3 0 1 0 6 0a3 3 0 0 0 -6 0",key:"svg-1"}]]),tT=(0,td.default)("outline","search","Search",[["path",{d:"M3 10a7 7 0 1 0 14 0a7 7 0 1 0 -14 0",key:"svg-0"}],["path",{d:"M21 21l-6 -6",key:"svg-1"}]]),tw=(0,td.default)("outline","folder-plus","FolderPlus",[["path",{d:"M12 19h-7a2 2 0 0 1 -2 -2v-11a2 2 0 0 1 2 -2h4l3 3h7a2 2 0 0 1 2 2v3.5",key:"svg-0"}],["path",{d:"M16 19h6",key:"svg-1"}],["path",{d:"M19 16v6",key:"svg-2"}]]),tk=(0,td.default)("outline","upload","Upload",[["path",{d:"M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2v-2",key:"svg-0"}],["path",{d:"M7 9l5 -5l5 5",key:"svg-1"}],["path",{d:"M12 4l0 12",key:"svg-2"}]]),tC=(0,td.default)("outline","copy","Copy",[["path",{d:"M7 9.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667l0 -8.666",key:"svg-0"}],["path",{d:"M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1",key:"svg-1"}]]),tP=(0,td.default)("outline","scissors","Scissors",[["path",{d:"M3 7a3 3 0 1 0 6 0a3 3 0 1 0 -6 0",key:"svg-0"}],["path",{d:"M3 17a3 3 0 1 0 6 0a3 3 0 1 0 -6 0",key:"svg-1"}],["path",{d:"M8.6 8.6l10.4 10.4",key:"svg-2"}],["path",{d:"M8.6 15.4l10.4 -10.4",key:"svg-3"}]]),t_=(0,td.default)("outline","clipboard","Clipboard",[["path",{d:"M9 5h-2a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-12a2 2 0 0 0 -2 -2h-2",key:"svg-0"}],["path",{d:"M9 5a2 2 0 0 1 2 -2h2a2 2 0 0 1 2 2a2 2 0 0 1 -2 2h-2a2 2 0 0 1 -2 -2",key:"svg-1"}]]),tR=(0,td.default)("outline","archive","Archive",[["path",{d:"M3 6a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2",key:"svg-0"}],["path",{d:"M5 8v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-10",key:"svg-1"}],["path",{d:"M10 12l4 0",key:"svg-2"}]]),tE=(0,td.default)("outline","file-zip","FileZip",[["path",{d:"M6 20.735a2 2 0 0 1 -1 -1.735v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2h-1",key:"svg-0"}],["path",{d:"M11 17a2 2 0 0 1 2 2v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1v-2a2 2 0 0 1 2 -2",key:"svg-1"}],["path",{d:"M11 5l-1 0",key:"svg-2"}],["path",{d:"M13 7l-1 0",key:"svg-3"}],["path",{d:"M11 9l-1 0",key:"svg-4"}],["path",{d:"M13 11l-1 0",key:"svg-5"}],["path",{d:"M11 13l-1 0",key:"svg-6"}],["path",{d:"M13 15l-1 0",key:"svg-7"}]]),tz=(0,td.default)("outline","edit","Edit",[["path",{d:"M7 7h-1a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-1",key:"svg-0"}],["path",{d:"M20.385 6.585a2.1 2.1 0 0 0 -2.97 -2.97l-8.415 8.385v3h3l8.385 -8.415",key:"svg-1"}],["path",{d:"M16 5l3 3",key:"svg-2"}]]);var tM=e.i(85404);e.s(["default",0,function(){let{colorScheme:e,toggleColorScheme:a}=(0,e4.useMantineColorScheme)(),[l,i]=(0,r.useState)([]),[o,n]=(0,r.useState)(""),[s,d]=(0,r.useState)(!1),[c,h]=(0,r.useState)(!1),[S,T]=(0,r.useState)(null),[w,k]=(0,r.useState)([]),[C,P]=(0,r.useState)(""),[_,R]=(0,r.useState)(!1),[E,z]=(0,r.useState)(null),[M,B]=(0,r.useState)(null),[I,A]=(0,r.useState)("blue"),[O,D]=(0,r.useState)([]),[N,F]=(0,r.useState)({action:null,paths:[]}),[L,G]=(0,r.useState)(!1),[$,W]=(0,r.useState)(""),[J,X]=(0,r.useState)(!1),[Z,K]=(0,r.useState)(null),[Y,Q]=(0,r.useState)(""),[ee,et]=(0,r.useState)(!1),[er,ea]=(0,r.useState)(""),[el,ei]=(0,r.useState)(!1),[eo,en]=(0,r.useState)(!0),es=(0,r.useRef)(null),[ed,ec]=(0,r.useState)(""),[eh,eu]=(0,r.useState)(""),[ep,em]=(0,r.useState)(""),[ex,eg]=(0,r.useState)(!0),[ev,ey]=(0,r.useState)(null),[eb,eS]=(0,r.useState)(null),[eT,ew]=(0,r.useState)(!1),[e_,eR]=(0,r.useState)(""),[eE,ez]=(0,r.useState)([]),[eM,eB]=(0,r.useState)(!1),[eI,eA]=(0,r.useState)(null),[eO,eD]=(0,r.useState)(null),[eN,eF]=(0,r.useState)([]),[eL,eG]=(0,r.useState)(!1),[e$,eU]=(0,r.useState)([]),[eH,eV]=(0,r.useState)(!1),[eq,eW]=(0,r.useState)(""),[eJ,eX]=(0,r.useState)(null),[eZ,eK]=(0,r.useState)(!1),[eY,e0]=(0,r.useState)([]),e1=(e,t,r,a)=>(eX(e),eA(null),fetch(tM.default.ACER_DOWNLOAD(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:e,filename:t,series_type:r,subfolder:a||void 0})}).then(async e=>{let t=await e.json();if(!e.ok)throw Error(t.detail||"Failed to queue download");return te(),t}).catch(e=>{throw eA(e.message||String(e)),e}).finally(()=>eX(null))),e2=async()=>{if(0!==eY.length&&eO){eK(!0);try{for(let e=0;e<e$.length;e++){let t=e$[e],r=t.link||t.url;if(!r||!eY.includes(r))continue;let a=eO.mainTitle||eO.title||"Series",l=`${a}_${eq}_${t.title||`Episode_${e+1}`}.mp4`,i=eo?`${a} - ${eq}`:void 0;try{await e1(r,l,"episode",i),await new Promise(e=>setTimeout(e,400))}catch(e){console.error("Failed to queue episode:",t.title,e)}}e0([])}finally{eK(!1)}}},e3=(0,r.useRef)(null),e9=()=>{fetch(tM.default.GET_CONFIG()).then(e=>e.json()).then(e=>{ec(e.default_movies_dir),eu(e.current_movies_dir),em(e.current_movies_dir)}).catch(()=>{})},te=()=>{d(!0),fetch(tM.default.ARIA2_LIST()).then(e=>{if(!e.ok)throw Error("Failed to fetch downloads");return e.json()}).then(e=>{i(e.downloads||[]),T(null)}).catch(e=>T(e.message||String(e))).finally(()=>d(!1))},tt=(e="")=>{R(!0),z(null),fetch(tM.default.EXPLORER_LIST(e)).then(e=>{if(!e.ok)throw Error("Failed to load directory content");return e.json()}).then(e=>{k(e.entries||[]),P(e.current_path||"")}).catch(e=>z(e.message||String(e))).finally(()=>R(!1))};(0,r.useEffect)(()=>{te();let e=localStorage.getItem("watchparty_download_path");e?fetch(tM.default.UPDATE_CONFIG(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({movies_dir:e,create_if_missing:!0})}).then(async e=>{let t=await e.json();e.ok&&(eu(t.current_movies_dir),em(t.current_movies_dir)),tt("")}).catch(()=>{tt("")}).finally(()=>{e9()}):(tt(""),e9());let t=localStorage.getItem("watchparty_accent_color");return t&&A(t),e3.current=setInterval(te,2e3),()=>{e3.current&&clearInterval(e3.current)}},[]);let tr=C.split("/").filter(Boolean),ta=[(0,t.jsx)(ek,{onClick:()=>tt(""),children:"Root"},"root"),...tr.map((e,r)=>{let a=tr.slice(0,r+1).join("/");return(0,t.jsx)(ek,{onClick:()=>tt(a),children:e},a)})];return(0,t.jsx)(to.MantineProvider,{theme:{primaryColor:I},forceColorScheme:"dark",children:(0,t.jsxs)(e5.AppShell,{header:{height:60},padding:"md",children:[(0,t.jsx)(e5.AppShell.Header,{children:(0,t.jsxs)(g.Group,{h:"100%",px:"md",justify:"space-between",children:[(0,t.jsxs)(g.Group,{gap:"xs",children:[(0,t.jsx)(b.Button,{component:"a",href:"/",variant:"subtle",leftSection:(0,t.jsx)(ts.IconArrowLeft,{size:16}),children:"Back to Control Panel"}),(0,t.jsx)(v.Title,{order:4,children:"Media & Downloader Manager"})]}),(0,t.jsx)(q.ActionIcon,{variant:"default",onClick:()=>a(),size:"lg",children:"dark"===e?(0,t.jsx)(ty.IconSun,{size:18}):(0,t.jsx)(tv.IconMoon,{size:18})})]})}),(0,t.jsx)(e5.AppShell.Main,{style:{paddingTop:"80px"},children:(0,t.jsx)(u,{size:"xl",children:(0,t.jsxs)(ef,{defaultValue:"downloader",variant:"outline",children:[(0,t.jsxs)(ef.List,{mb:"md",children:[(0,t.jsx)(ef.Tab,{value:"downloader",leftSection:(0,t.jsx)(tc,{size:16}),children:"Downloader"}),(0,t.jsx)(ef.Tab,{value:"explorer",leftSection:(0,t.jsx)(tu.IconFolder,{size:16}),children:"File Explorer"}),(0,t.jsx)(ef.Tab,{value:"scraper",leftSection:(0,t.jsx)(tT,{size:16}),children:"Search & Scrape"}),(0,t.jsx)(ef.Tab,{value:"settings",leftSection:(0,t.jsx)(tS,{size:16}),children:"Settings"})]}),(0,t.jsx)(ef.Panel,{value:"downloader",children:(0,t.jsxs)(f.Stack,{gap:"md",children:[(0,t.jsx)(p.Card,{withBorder:!0,children:(0,t.jsx)("form",{onSubmit:e=>{e.preventDefault(),o.trim()&&(h(!0),T(null),fetch(tM.default.ARIA2_ADD(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({uri:o.trim()})}).then(async e=>{let t=await e.json();if(!e.ok)throw Error(t?.detail??"Failed to add download");n(""),te()}).catch(e=>T(e.message||String(e))).finally(()=>h(!1)))},children:(0,t.jsxs)(g.Group,{align:"flex-end",children:[(0,t.jsx)(j.TextInput,{label:"Download Link / Magnet Link",placeholder:"http://..., magnet:?xt=..., etc.",value:o,onChange:e=>n(e.currentTarget.value),style:{flex:1},required:!0}),(0,t.jsx)(b.Button,{type:"submit",loading:c,leftSection:(0,t.jsx)(tg.IconPlus,{size:16}),children:"Add Download"})]})})}),S&&(0,t.jsx)(e6,{icon:(0,t.jsx)(tj,{size:16}),title:"Downloader Error",color:"red",withCloseButton:!0,onClose:()=>T(null),children:S}),(0,t.jsxs)(p.Card,{withBorder:!0,children:[(0,t.jsxs)(g.Group,{justify:"space-between",mb:"md",children:[(0,t.jsx)(v.Title,{order:5,children:"Active Queue"}),(0,t.jsxs)(g.Group,{gap:"xs",children:[(0,t.jsx)(b.Button,{size:"xs",variant:"outline",onClick:te,loading:s,leftSection:(0,t.jsx)(tx.IconRefresh,{size:14}),children:"Refresh"}),(0,t.jsx)(b.Button,{size:"xs",variant:"light",color:"red",onClick:()=>{fetch(tM.default.ARIA2_PURGE(),{method:"POST"}).then(()=>te()).catch(e=>T(e.message||String(e)))},leftSection:(0,t.jsx)(th.IconTrash,{size:14}),children:"Purge Finished"})]})]}),0===l.length?(0,t.jsx)(y.Text,{c:"dimmed",ta:"center",py:"xl",children:"No active downloads. Add a URL or magnet link above to start downloading."}):(0,t.jsxs)(U,{striped:!0,highlightOnHover:!0,verticalSpacing:"xs",children:[(0,t.jsx)(U.Thead,{children:(0,t.jsxs)(U.Tr,{children:[(0,t.jsx)(U.Th,{style:{width:"40%"},children:"Name"}),(0,t.jsx)(U.Th,{children:"Progress"}),(0,t.jsx)(U.Th,{children:"Speed"}),(0,t.jsx)(U.Th,{children:"ETA"}),(0,t.jsx)(U.Th,{children:"Status"}),(0,t.jsx)(U.Th,{style:{width:"150px"},children:"Actions"})]})}),(0,t.jsx)(U.Tbody,{children:l.map(e=>(0,t.jsxs)(U.Tr,{children:[(0,t.jsxs)(U.Td,{style:{maxWidth:"300px"},children:[(0,t.jsx)(eQ,{label:e.name||e.gid,children:(0,t.jsx)(y.Text,{size:"sm",fw:500,truncate:!0,children:e.name||e.gid})}),e.error_message&&(0,t.jsxs)(y.Text,{size:"xs",c:"red",mt:2,truncate:!0,children:["Error: ",e.error_message]})]}),(0,t.jsx)(U.Td,{children:(0,t.jsxs)(f.Stack,{gap:4,children:[(0,t.jsx)(H.Progress,{value:e.progress,striped:"active"===e.status,animated:"active"===e.status}),(0,t.jsxs)(y.Text,{size:"xs",c:"dimmed",children:[e.progress,"% (",(e.completed_length/1024/1024).toFixed(1)," MB / ",(e.total_length/1024/1024).toFixed(1)," MB)"]})]})}),(0,t.jsx)(U.Td,{children:(0,t.jsx)(y.Text,{size:"sm",children:"active"===e.status?e.download_speed_str:"—"})}),(0,t.jsx)(U.Td,{children:(0,t.jsx)(y.Text,{size:"sm",children:"active"===e.status?e.eta:"—"})}),(0,t.jsx)(U.Td,{children:(0,t.jsx)(V.Badge,{color:(e=>{switch(e){case"active":return"blue";case"waiting":return"yellow";case"paused":default:return"gray";case"complete":return"green";case"error":return"red"}})(e.status),variant:"light",children:e.status})}),(0,t.jsx)(U.Td,{children:(0,t.jsxs)(g.Group,{gap:4,wrap:"nowrap",children:["active"===e.status&&(0,t.jsx)(q.ActionIcon,{variant:"subtle",color:"yellow",onClick:()=>{var t;return t=e.gid,void fetch(tM.default.ARIA2_PAUSE(t),{method:"POST"}).then(()=>te()).catch(e=>T(e.message||String(e)))},title:"Pause",children:(0,t.jsx)(tf,{size:16})}),("paused"===e.status||"waiting"===e.status)&&(0,t.jsx)(q.ActionIcon,{variant:"subtle",color:"green",onClick:()=>{var t;return t=e.gid,void fetch(tM.default.ARIA2_RESUME(t),{method:"POST"}).then(()=>te()).catch(e=>T(e.message||String(e)))},title:"Resume",children:(0,t.jsx)(tm,{size:16})}),(0,t.jsx)(q.ActionIcon,{variant:"subtle",color:"red",onClick:()=>{var t;return t=e.gid,void fetch(tM.default.ARIA2_REMOVE(t),{method:"POST"}).then(()=>te()).catch(e=>T(e.message||String(e)))},title:"Cancel / Delete",children:(0,t.jsx)(th.IconTrash,{size:16})})]})})]},e.gid))})]})]})]})}),(0,t.jsx)(ef.Panel,{value:"explorer",children:(0,t.jsxs)(f.Stack,{gap:"md",children:[E&&(0,t.jsx)(e6,{icon:(0,t.jsx)(tj,{size:16}),title:"Explorer Error",color:"red",withCloseButton:!0,onClose:()=>z(null),children:E}),(0,t.jsxs)(p.Card,{withBorder:!0,children:[(0,t.jsxs)(g.Group,{justify:"space-between",mb:"md",style:{flexWrap:"wrap",gap:"10px"},children:[(0,t.jsx)(ej,{separator:">",children:ta}),(0,t.jsxs)(g.Group,{gap:"xs",style:{flexWrap:"wrap"},children:[(0,t.jsx)("input",{type:"file",ref:es,onChange:e=>{let t=e.target.files;if(!t||0===t.length)return;let r=t[0];ei(!0);let a=new FormData;a.append("target_dir",C),a.append("file",r),fetch(tM.default.EXPLORER_UPLOAD(),{method:"POST",body:a}).then(async e=>{let t=await e.json();if(!e.ok)throw Error(t.detail||"Upload failed");tt(C)}).catch(e=>z(e.message||String(e))).finally(()=>ei(!1))},style:{display:"none"}}),(0,t.jsx)(b.Button,{size:"xs",variant:"outline",color:"blue",onClick:()=>G(!0),leftSection:(0,t.jsx)(tw,{size:14}),children:"New Folder"}),(0,t.jsx)(b.Button,{size:"xs",variant:"outline",color:"teal",onClick:()=>{es.current?.click()},loading:el,leftSection:(0,t.jsx)(tk,{size:14}),children:"Upload File"}),(0,t.jsx)(b.Button,{size:"xs",variant:"filled",color:"green",component:"a",href:`/?play=${encodeURIComponent(C)}&folder=true`,leftSection:(0,t.jsx)(tm,{size:14}),children:"Play Current Folder"}),O.length>0&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(b.Button,{size:"xs",variant:"outline",color:"yellow",onClick:()=>{0!==O.length&&(F({action:"copy",paths:[...O]}),D([]))},leftSection:(0,t.jsx)(tC,{size:14}),children:["Copy (",O.length,")"]}),(0,t.jsxs)(b.Button,{size:"xs",variant:"outline",color:"orange",onClick:()=>{0!==O.length&&(F({action:"cut",paths:[...O]}),D([]))},leftSection:(0,t.jsx)(tP,{size:14}),children:["Cut (",O.length,")"]}),(0,t.jsx)(b.Button,{size:"xs",variant:"outline",color:"pink",onClick:()=>{ea(""),et(!0)},leftSection:(0,t.jsx)(tE,{size:14}),children:"Zip Selected"})]}),N.paths.length>0&&(0,t.jsxs)(b.Button,{size:"xs",variant:"filled",color:"green",onClick:()=>{N.action&&0!==N.paths.length&&fetch("copy"===N.action?tM.default.EXPLORER_COPY():tM.default.EXPLORER_MOVE(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({source_paths:N.paths,target_dir:C})}).then(async e=>{let t=await e.json();if(!e.ok)throw Error(t.detail||"Paste operation failed");t.errors&&t.errors.length>0&&z(t.errors.join("; ")),F({action:null,paths:[]}),tt(C)}).catch(e=>z(e.message||String(e)))},leftSection:(0,t.jsx)(t_,{size:14}),children:["Paste (",N.paths.length,")"]}),(0,t.jsx)(b.Button,{size:"xs",variant:"outline",onClick:()=>tt(C),loading:_,leftSection:(0,t.jsx)(tx.IconRefresh,{size:14}),children:"Refresh"})]})]}),(0,t.jsx)(eP.Divider,{mb:"sm"}),0===w.length?(0,t.jsx)(y.Text,{c:"dimmed",ta:"center",py:"xl",children:"This directory is empty. Downloads completed via aria2 will appear here."}):(0,t.jsxs)(U,{striped:!0,highlightOnHover:!0,verticalSpacing:"sm",children:[(0,t.jsx)(U.Thead,{children:(0,t.jsxs)(U.Tr,{children:[(0,t.jsx)(U.Th,{style:{width:"40px"},children:(0,t.jsx)(m.Checkbox,{checked:w.length>0&&O.length===w.length,indeterminate:O.length>0&&O.length<w.length,onChange:e=>{e.currentTarget.checked?D(w.map(e=>e.path)):D([])}})}),(0,t.jsx)(U.Th,{style:{width:"50%"},children:"Name"}),(0,t.jsx)(U.Th,{children:"Size"}),(0,t.jsx)(U.Th,{children:"Type"}),(0,t.jsx)(U.Th,{style:{width:"220px"},children:"Actions"})]})}),(0,t.jsx)(U.Tbody,{children:w.map(e=>(0,t.jsxs)(U.Tr,{children:[(0,t.jsx)(U.Td,{children:(0,t.jsx)(m.Checkbox,{checked:O.includes(e.path),onChange:t=>{t.currentTarget.checked?D(t=>[...t,e.path]):D(t=>t.filter(t=>t!==e.path))}})}),(0,t.jsx)(U.Td,{children:(0,t.jsxs)(g.Group,{gap:"xs",children:["directory"===e.type?(0,t.jsx)(tu.IconFolder,{size:18,style:{color:"var(--mantine-color-blue-filled)"}}):(0,t.jsx)(tp,{size:18,style:{color:"var(--mantine-color-gray-6)"}}),"directory"===e.type?(0,t.jsx)(ek,{size:"sm",fw:500,onClick:()=>tt(e.path),style:{cursor:"pointer"},children:e.name}):(0,t.jsx)(y.Text,{size:"sm",fw:500,children:e.name})]})}),(0,t.jsx)(U.Td,{children:(0,t.jsx)(y.Text,{size:"sm",c:"dimmed",children:"file"===e.type?e.size_str:"—"})}),(0,t.jsx)(U.Td,{children:(0,t.jsx)(V.Badge,{size:"xs",color:"directory"===e.type?"blue":"gray",variant:"light",children:e.type})}),(0,t.jsx)(U.Td,{children:(0,t.jsxs)(g.Group,{gap:4,children:["file"===e.type&&(0,t.jsx)(b.Button,{size:"xs",variant:"light",color:"green",component:"a",href:`/?play=${encodeURIComponent(e.path)}`,leftSection:(0,t.jsx)(tm,{size:12}),children:"Play"}),"directory"===e.type&&(0,t.jsx)(b.Button,{size:"xs",variant:"light",color:"green",component:"a",href:`/?play=${encodeURIComponent(e.path)}&folder=true`,leftSection:(0,t.jsx)(tm,{size:12}),children:"Play Folder"}),(0,t.jsx)(q.ActionIcon,{variant:"subtle",color:"blue",onClick:()=>{K(e),Q(e.name),X(!0)},title:"Rename",children:(0,t.jsx)(tz,{size:16})}),e.name.endsWith(".zip")&&(0,t.jsx)(q.ActionIcon,{variant:"subtle",color:"teal",onClick:()=>{var t;return t=e.path,void fetch(tM.default.EXPLORER_UNZIP(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({zip_path:t,target_dir:C})}).then(async e=>{let t=await e.json();if(!e.ok)throw Error(t.detail||"Unzip operation failed");tt(C)}).catch(e=>z(e.message||String(e)))},title:"Extract Zip",children:(0,t.jsx)(tR,{size:16})}),(0,t.jsx)(q.ActionIcon,{variant:"subtle",color:"red",loading:M===e.path,onClick:()=>{var t;return t=e.path,void(confirm(`Are you sure you want to delete "${t}"?`)&&(B(t),fetch(tM.default.EXPLORER_DELETE(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:t})}).then(async e=>{let t=await e.json();if(!e.ok)throw Error(t?.detail??"Failed to delete file");tt(C)}).catch(e=>z(e.message||String(e))).finally(()=>B(null))))},title:"Delete",children:(0,t.jsx)(th.IconTrash,{size:16})})]})})]},e.name))})]})]})]})}),(0,t.jsx)(ef.Panel,{value:"scraper",children:(0,t.jsxs)(f.Stack,{gap:"md",style:{position:"relative"},children:[(0,t.jsx)(ti,{visible:eM||eL||eH}),eI&&(0,t.jsx)(e6,{icon:(0,t.jsx)(tj,{size:16}),title:"Scraper Error",color:"red",withCloseButton:!0,onClose:()=>eA(null),children:eI}),(0,t.jsx)(p.Card,{withBorder:!0,children:(0,t.jsx)("form",{onSubmit:e=>{e.preventDefault(),e_.trim()&&(eB(!0),eA(null),eD(null),eF([]),eU([]),e0([]),fetch(tM.default.ACER_SEARCH(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({query:e_.trim()})}).then(async e=>{let t=await e.json();if(!e.ok)throw Error(t.detail||"Search failed");ez(t.searchResult||[])}).catch(e=>eA(e.message||String(e))).finally(()=>eB(!1)))},children:(0,t.jsxs)(g.Group,{align:"flex-end",children:[(0,t.jsx)(j.TextInput,{label:"Search Movies & TV Shows (via acermovies)",placeholder:"e.g. Breaking Bad, Interstellar...",value:e_,onChange:e=>eR(e.currentTarget.value),style:{flex:1},required:!0}),(0,t.jsx)(b.Button,{type:"submit",loading:eM,leftSection:(0,t.jsx)(tT,{size:16}),children:"Search"})]})})}),(0,t.jsxs)(p.Card,{withBorder:!0,children:[(0,t.jsxs)(v.Title,{order:5,mb:"md",children:["Search Results (",eE.length,")"]}),0===eE.length?(0,t.jsx)(y.Text,{c:"dimmed",ta:"center",py:"xl",children:"Search for a title above to find movies and shows to download."}):(0,t.jsx)(f.Stack,{gap:"xs",children:eE.map((e,r)=>(0,t.jsx)(p.Card,{withBorder:!0,padding:"sm",style:{cursor:"pointer",backgroundColor:eO?.url===e.url?"var(--mantine-color-blue-light)":"transparent"},onClick:()=>{eG(!0),eA(null),eD(e),eF([]),eU([]),e0([]),fetch(tM.default.ACER_QUALITIES(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:e.url})}).then(async e=>{let t=await e.json();if(!e.ok)throw Error(t.detail||"Failed to fetch qualities");eF(t.sourceQualityList||[]),t.meta&&eD(e=>({...e,mainTitle:t.meta.mainTitle,title:t.meta.title||e.title,image:t.meta.image||e.image,synopsis:t.meta.synopsis,type:t.meta.type,imdbId:t.meta.imdbId}))}).catch(e=>eA(e.message||String(e))).finally(()=>eG(!1))},children:(0,t.jsxs)("div",{style:{display:"flex",flexDirection:"row",alignItems:"center",justifyContent:"space-between",gap:"12px",width:"100%"},children:[(0,t.jsxs)("div",{style:{display:"flex",flexDirection:"row",gap:"12px",flex:1,minWidth:0,alignItems:"flex-start"},children:[e.image&&(0,t.jsx)(e8,{src:e.image,w:55,h:80,fallbackSrc:"https://placehold.co/55x80?text=No+Poster",radius:"xs",style:{flexShrink:0}}),(0,t.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"4px",flex:1,minWidth:0},children:[(0,t.jsx)(y.Text,{size:"sm",fw:600,style:{wordBreak:"break-word",whiteSpace:"normal"},children:e.title}),(0,t.jsx)(y.Text,{size:"xs",c:"dimmed",lineClamp:2,children:e.description||"No description"})]})]}),(0,t.jsx)(b.Button,{size:"xs",variant:"light",leftSection:(0,t.jsx)(tg.IconPlus,{size:12}),style:{flexShrink:0},children:"Fetch"})]})},r))})]}),(0,t.jsx)(e7.Modal,{opened:!!eO,onClose:()=>eD(null),size:"lg",title:eO?.mainTitle||eO?.title||"Media Details",centered:!0,children:eO&&(0,t.jsxs)(f.Stack,{gap:"md",children:[(0,t.jsxs)(g.Group,{align:"flex-start",gap:"md",wrap:"nowrap",children:[eO.image&&(0,t.jsx)(e8,{src:eO.image,w:90,h:130,fallbackSrc:"https://placehold.co/90x130?text=No+Poster",radius:"sm"}),(0,t.jsxs)(f.Stack,{gap:"xs",style:{flex:1},children:[eO.mainTitle&&(0,t.jsx)(y.Text,{size:"xs",c:"dimmed",fw:500,lineClamp:2,children:eO.title}),(0,t.jsxs)(g.Group,{gap:"xs",mt:2,children:[eO.type&&(0,t.jsx)(V.Badge,{color:"blue",variant:"light",children:eO.type}),eO.imdbId&&(0,t.jsx)(V.Badge,{component:"a",href:`https://www.imdb.com/title/${eO.imdbId}`,target:"_blank",color:"yellow",variant:"filled",style:{cursor:"pointer"},children:"IMDb"})]}),eO.synopsis&&(0,t.jsx)(y.Text,{size:"xs",style:{lineHeight:"1.4"},children:eO.synopsis})]})]}),(0,t.jsx)(eP.Divider,{my:"xs"}),(0,t.jsx)(v.Title,{order:5,children:"Available Sources / Seasons"}),0===eN.length?(0,t.jsx)(y.Text,{c:"dimmed",size:"xs",children:"No source qualities found."}):(0,t.jsx)(g.Group,{gap:"xs",children:eN.map((e,r)=>{let a=e.episodesUrl||e.episodes_api_url,l=eq===e.title;return(0,t.jsx)(b.Button,{size:"xs",variant:l?"filled":"outline",onClick:()=>{if(a)eV(!0),eA(null),eW(e.title||""),eU([]),e0([]),fetch(tM.default.ACER_EPISODES(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:e.episodesUrl||e.episodes_api_url})}).then(async e=>{let t=await e.json();if(!e.ok)throw Error(t.detail||"Failed to fetch episodes");eU(t.sourceEpisodes||[])}).catch(e=>eA(e.message||String(e))).finally(()=>eV(!1));else{let t=eO.mainTitle||eO.title||"Movie",r=e.quality||"Direct",a=`${t}_${r}.mp4`;e1(e.url,a,"movie")}},loading:eJ===e.url,children:e.title||e.quality||`Quality ${r+1}`},r)})}),e$.length>0&&(0,t.jsxs)(f.Stack,{gap:"sm",children:[(0,t.jsxs)(g.Group,{justify:"space-between",children:[(0,t.jsxs)(v.Title,{order:5,children:["Episodes (",e$.length,")"]}),(0,t.jsxs)(g.Group,{gap:"sm",children:[(0,t.jsx)(m.Checkbox,{label:"Save inside subfolder with season name",checked:eo,onChange:e=>en(e.currentTarget.checked)}),(0,t.jsxs)(b.Button,{size:"xs",color:"green",onClick:e2,loading:eZ,disabled:0===eY.length,children:["Download Selected (",eY.length,")"]})]})]}),(0,t.jsx)("div",{style:{maxHeight:"300px",overflowY:"auto"},children:(0,t.jsxs)(U,{striped:!0,highlightOnHover:!0,verticalSpacing:"xs",children:[(0,t.jsx)(U.Thead,{children:(0,t.jsxs)(U.Tr,{children:[(0,t.jsx)(U.Th,{style:{width:"40px"},children:(0,t.jsx)(m.Checkbox,{checked:e$.length>0&&eY.length===e$.map(e=>e.link||e.url).filter(Boolean).length,indeterminate:eY.length>0&&eY.length<e$.map(e=>e.link||e.url).filter(Boolean).length,onChange:e=>{e.currentTarget.checked?e0(e$.map(e=>e.link||e.url).filter(Boolean)):e0([])}})}),(0,t.jsx)(U.Th,{children:"Episode Name"}),(0,t.jsx)(U.Th,{style:{width:"120px"},children:"Actions"})]})}),(0,t.jsx)(U.Tbody,{children:e$.map((e,r)=>{let a=e.link||e.url;return(0,t.jsxs)(U.Tr,{children:[(0,t.jsx)(U.Td,{children:a&&(0,t.jsx)(m.Checkbox,{checked:eY.includes(a),onChange:e=>{e.currentTarget.checked?e0(e=>[...e,a]):e0(e=>e.filter(e=>e!==a))}})}),(0,t.jsx)(U.Td,{children:(0,t.jsx)(y.Text,{size:"xs",fw:500,children:e.title})}),(0,t.jsx)(U.Td,{children:(0,t.jsx)(b.Button,{size:"xs",variant:"light",onClick:()=>{let t=eO.mainTitle||eO.title||"Series",r=`${t}_${eq}_${e.title}.mp4`,l=eo?`${t} - ${eq}`:void 0;a&&e1(a,r,"episode",l)},loading:eJ===a,children:"Queue"})})]},r)})})]})})]})]})}),(0,t.jsx)(e7.Modal,{opened:L,onClose:()=>G(!1),title:"Create New Folder",children:(0,t.jsx)("form",{onSubmit:e=>{e.preventDefault(),$.trim()&&fetch(tM.default.EXPLORER_MKDIR(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({parent_path:C,folder_name:$.trim()})}).then(async e=>{let t=await e.json();if(!e.ok)throw Error(t.detail||"Failed to create folder");G(!1),W(""),tt(C)}).catch(e=>z(e.message||String(e)))},children:(0,t.jsxs)(f.Stack,{gap:"sm",children:[(0,t.jsx)(j.TextInput,{label:"Folder Name",placeholder:"Enter folder name",value:$,onChange:e=>W(e.currentTarget.value),required:!0}),(0,t.jsx)(b.Button,{type:"submit",fullWidth:!0,children:"Create Folder"})]})})}),(0,t.jsx)(e7.Modal,{opened:J,onClose:()=>{X(!1),K(null)},title:"Rename File / Folder",children:(0,t.jsx)("form",{onSubmit:e=>{e.preventDefault(),Z&&Y.trim()&&fetch(tM.default.EXPLORER_RENAME(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({old_path:Z.path,new_name:Y.trim()})}).then(async e=>{let t=await e.json();if(!e.ok)throw Error(t.detail||"Failed to rename");X(!1),K(null),Q(""),tt(C)}).catch(e=>z(e.message||String(e)))},children:(0,t.jsxs)(f.Stack,{gap:"sm",children:[(0,t.jsx)(j.TextInput,{label:"New Name",placeholder:"Enter new name",value:Y,onChange:e=>Q(e.currentTarget.value),required:!0}),(0,t.jsx)(b.Button,{type:"submit",fullWidth:!0,children:"Rename"})]})})}),(0,t.jsx)(e7.Modal,{opened:ee,onClose:()=>et(!1),title:"Zip Selected Items",children:(0,t.jsx)("form",{onSubmit:e=>{e.preventDefault(),0!==O.length&&er.trim()&&fetch(tM.default.EXPLORER_ZIP(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({paths:O,target_zip_name:er.trim(),current_dir:C})}).then(async e=>{let t=await e.json();if(!e.ok)throw Error(t.detail||"Zip operation failed");et(!1),ea(""),D([]),tt(C)}).catch(e=>z(e.message||String(e)))},children:(0,t.jsxs)(f.Stack,{gap:"sm",children:[(0,t.jsx)(j.TextInput,{label:"Target Zip File Name",placeholder:"e.g. archive (do not include .zip)",value:er,onChange:e=>ea(e.currentTarget.value),required:!0}),(0,t.jsx)(b.Button,{type:"submit",fullWidth:!0,children:"Compress to Zip"})]})})})]})}),(0,t.jsx)(ef.Panel,{value:"settings",children:(0,t.jsxs)(f.Stack,{gap:"md",children:[ev&&(0,t.jsx)(e6,{icon:(0,t.jsx)(tj,{size:16}),title:"Settings Error",color:"red",withCloseButton:!0,onClose:()=>ey(null),children:ev}),eb&&(0,t.jsx)(e6,{icon:(0,t.jsx)(tb,{size:16}),title:"Success",color:"green",withCloseButton:!0,onClose:()=>eS(null),children:eb}),(0,t.jsxs)(p.Card,{withBorder:!0,children:[(0,t.jsx)(v.Title,{order:5,mb:"xs",children:"Directory Configuration"}),(0,t.jsx)(y.Text,{size:"sm",c:"dimmed",mb:"md",children:"View and change the active directory used by the file explorer and downloader. Changes apply to the current server session."}),(0,t.jsxs)(eC.SimpleGrid,{cols:{base:1,md:2},spacing:"md",mb:"md",children:[(0,t.jsxs)(p.Card,{withBorder:!0,padding:"sm",bg:"var(--mantine-color-default-hover)",children:[(0,t.jsx)(y.Text,{size:"xs",fw:700,c:"dimmed",style:{textTransform:"uppercase"},children:"Default Movies Folder"}),(0,t.jsx)(y.Text,{size:"md",fw:500,style:{fontFamily:"monospace"},mt:4,children:ed||"—"})]}),(0,t.jsxs)(p.Card,{withBorder:!0,padding:"sm",bg:"var(--mantine-color-default-hover)",children:[(0,t.jsx)(y.Text,{size:"xs",fw:700,c:"dimmed",style:{textTransform:"uppercase"},children:"Current Active Folder"}),(0,t.jsx)(y.Text,{size:"md",fw:500,style:{fontFamily:"monospace"},mt:4,children:eh||"—"})]})]}),(0,t.jsx)("form",{onSubmit:e=>{e.preventDefault(),ep.trim()&&(ew(!0),ey(null),eS(null),fetch(tM.default.UPDATE_CONFIG(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({movies_dir:ep.trim(),create_if_missing:ex})}).then(async e=>{let t=await e.json();if(!e.ok)throw Error(t?.detail??"Failed to update folder");eS("Download directory updated successfully!"),eu(t.current_movies_dir),em(t.current_movies_dir),localStorage.setItem("watchparty_download_path",t.current_movies_dir),tt("")}).catch(e=>ey(e.message||String(e))).finally(()=>ew(!1)))},children:(0,t.jsxs)(f.Stack,{gap:"sm",children:[(0,t.jsx)(j.TextInput,{label:"Change Download & Stream Folder",description:"Specify an absolute path on the server (e.g. ~/Downloads/WatchParty or C:\\Downloads\\WatchParty)",placeholder:eh,value:ep,onChange:e=>em(e.currentTarget.value),required:!0}),(0,t.jsx)(x.Switch,{label:"Create folder automatically if it does not exist",checked:ex,onChange:e=>eg(e.currentTarget.checked)}),(0,t.jsx)(b.Button,{type:"submit",loading:eT,style:{alignSelf:"flex-start"},children:"Apply & Update Path"})]})})]}),(0,t.jsxs)(p.Card,{withBorder:!0,children:[(0,t.jsx)(v.Title,{order:5,mb:"xs",children:"Theme Customization"}),(0,t.jsx)(y.Text,{size:"sm",c:"dimmed",mb:"md",children:"Personalize your dashboard theme style by picking a custom accent color saved locally."}),(0,t.jsx)(tn.Select,{label:"Select Theme Accent Color",value:I,onChange:e=>{e&&(A(e),localStorage.setItem("watchparty_accent_color",e))},data:[{value:"blue",label:"Neon Blue"},{value:"violet",label:"Cyberpunk Violet"},{value:"teal",label:"Electric Teal"},{value:"grape",label:"Grape Fusion"},{value:"orange",label:"Sunset Orange"},{value:"lime",label:"Neon Lime"}],style:{maxWidth:"300px"}})]}),(0,t.jsxs)(p.Card,{withBorder:!0,children:[(0,t.jsx)(v.Title,{order:5,mb:"xs",children:"Preferences & Guide"}),(0,t.jsx)(y.Text,{size:"sm",c:"dimmed",children:"* **Storage Location**: Completed downloads in the downloader tab are placed directly in the active folder configured above. * **Streaming Root**: The File Explorer searches recursively inside the active folder. Any files shown can be streamed instantly using the green **Play** action. * **System Port bindings**: VLC instance HTTP interfaces, telnet controls, and media stream ports are automatically allocated."})]})]})})]})})})]})})}],10555)}]);
|
out/_next/static/chunks/158myu8e_yme3.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,33525,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"warnOnce",{enumerable:!0,get:function(){return n}});let n=e=>{}},91915,(e,t,r)=>{"use strict";function n(e,t={}){if(t.onlyHashChange)return void e();let r=document.documentElement;if("smooth"!==r.dataset.scrollBehavior)return void e();let a=r.style.scrollBehavior;r.style.scrollBehavior="auto",t.dontForceLayout||r.getClientRects(),e(),r.style.scrollBehavior=a}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"disableSmoothScrollDuringRouteTransition",{enumerable:!0,get:function(){return n}}),e.r(33525)},68017,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"HTTPAccessFallbackBoundary",{enumerable:!0,get:function(){return u}});let n=e.r(90809),a=e.r(43476),o=n._(e.r(71645)),i=e.r(90373),s=e.r(54394);e.r(33525);let l=e.r(8372);class c extends o.default.Component{constructor(e){super(e),this.state={triggeredStatus:void 0,previousPathname:e.pathname}}componentDidCatch(){}static getDerivedStateFromError(e){if((0,s.isHTTPAccessFallbackError)(e))return{triggeredStatus:(0,s.getAccessFallbackHTTPStatus)(e)};throw e}static getDerivedStateFromProps(e,t){return e.pathname!==t.previousPathname&&t.triggeredStatus?{triggeredStatus:void 0,previousPathname:e.pathname}:{triggeredStatus:t.triggeredStatus,previousPathname:e.pathname}}render(){let{notFound:e,forbidden:t,unauthorized:r,children:n}=this.props,{triggeredStatus:o}=this.state,i={[s.HTTPAccessErrorStatus.NOT_FOUND]:e,[s.HTTPAccessErrorStatus.FORBIDDEN]:t,[s.HTTPAccessErrorStatus.UNAUTHORIZED]:r};if(o){let l=o===s.HTTPAccessErrorStatus.NOT_FOUND&&e,c=o===s.HTTPAccessErrorStatus.FORBIDDEN&&t,u=o===s.HTTPAccessErrorStatus.UNAUTHORIZED&&r;return l||c||u?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("meta",{name:"robots",content:"noindex"}),!1,i[o]]}):n}return n}}function u({notFound:e,forbidden:t,unauthorized:r,children:n}){let s=(0,i.useUntrackedPathname)(),d=(0,o.useContext)(l.MissingSlotContext);return e||t||r?(0,a.jsx)(c,{pathname:s,notFound:e,forbidden:t,unauthorized:r,missingSlots:d,children:n}):(0,a.jsx)(a.Fragment,{children:n})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},28298,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useRouterBFCache",{enumerable:!0,get:function(){return a}});let n=e.r(71645);function a(e,t,r){let[a,o]=(0,n.useState)(()=>({tree:e,cacheNode:t,stateKey:r,next:null}));if(a.tree===e)return a;let i={tree:e,cacheNode:t,stateKey:r,next:null},s=1,l=a,c=i;for(;null!==l&&s<1;){if(l.stateKey===r){c.next=l.next;break}{s++;let e={tree:l.tree,cacheNode:l.cacheNode,stateKey:l.stateKey,next:null};c.next=e,c=e}l=l.next}return o(i),i}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},39756,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={LoadingBoundaryProvider:function(){return j},default:function(){return A}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(55682),i=e.r(90809),s=e.r(43476),l=i._(e.r(71645)),c=o._(e.r(74080)),u=e.r(8372),d=e.r(1244),f=e.r(72383),p=e.r(91915),m=e.r(58442),h=e.r(68017),g=e.r(70725),y=e.r(28298);e.r(74180);let b=e.r(61994),P=e.r(33906),_=e.r(95871),v=c.default.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,E=["bottom","height","left","right","top","width","x","y"];function O(e,t){let r=e.getClientRects();if(0===r.length)return!1;let n=1/0;for(let e=0;e<r.length;e++){let t=r[e];t.top<n&&(n=t.top)}return n>=0&&n<=t}class R extends l.default.Component{componentDidMount(){this.handlePotentialScroll()}componentDidUpdate(){this.handlePotentialScroll()}render(){return this.props.children}constructor(...e){super(...e),this.handlePotentialScroll=()=>{let{focusAndScrollRef:e,cacheNode:t}=this.props,r=e.forceScroll?e.scrollRef:t.scrollRef;if(null===r||!r.current)return;let n=null,a=e.hashFragment;if(a&&(n="top"===a?document.body:document.getElementById(a)??document.getElementsByName(a)[0]),n||(n="u"<typeof window?null:(0,v.findDOMNode)(this)),n instanceof Element){for(;!(n instanceof HTMLElement)||function(e){if(["sticky","fixed"].includes(getComputedStyle(e).position))return!0;let t=e.getBoundingClientRect();return E.every(e=>0===t[e])}(n);){if(null===n.nextElementSibling)return;n=n.nextElementSibling}r.current=!1,(0,p.disableSmoothScrollDuringRouteTransition)(()=>{if(a)return void n.scrollIntoView();let e=document.documentElement,t=e.clientHeight;!O(n,t)&&(e.scrollTop=0,O(n,t)||n.scrollIntoView())},{dontForceLayout:!0,onlyHashChange:e.onlyHashChange}),e.onlyHashChange=!1,e.hashFragment=null,n.focus()}}}}function w({children:e,cacheNode:t}){let r=(0,l.useContext)(u.GlobalLayoutRouterContext);if(!r)throw Object.defineProperty(Error("invariant global layout router not mounted"),"__NEXT_ERROR_CODE",{value:"E473",enumerable:!1,configurable:!0});return(0,s.jsx)(R,{focusAndScrollRef:r.focusAndScrollRef,cacheNode:t,children:e})}function S({tree:e,segmentPath:t,debugNameContext:r,cacheNode:n,params:a,url:o,isActive:i}){let c,f=(0,l.useContext)(u.GlobalLayoutRouterContext);if((0,l.useContext)(b.NavigationPromisesContext),!f)throw Object.defineProperty(Error("invariant global layout router not mounted"),"__NEXT_ERROR_CODE",{value:"E473",enumerable:!1,configurable:!0});let p=null!==n?n:(0,l.use)(d.unresolvedThenable),m=null!==p.prefetchRsc?p.prefetchRsc:p.rsc,h=(0,l.useDeferredValue)(p.rsc,m);if((0,_.isDeferredRsc)(h)){let e=(0,l.use)(h);null===e&&(0,l.use)(d.unresolvedThenable),c=e}else null===h&&(0,l.use)(d.unresolvedThenable),c=h;let g=c;return(0,s.jsx)(u.LayoutRouterContext.Provider,{value:{parentTree:e,parentCacheNode:p,parentSegmentPath:t,parentParams:a,parentLoadingData:null,debugNameContext:r,url:o,isActive:i},children:g})}function j({loading:e,children:t}){let r=(0,l.use)(u.LayoutRouterContext);return null===r?t:(0,s.jsx)(u.LayoutRouterContext.Provider,{value:{parentTree:r.parentTree,parentCacheNode:r.parentCacheNode,parentSegmentPath:r.parentSegmentPath,parentParams:r.parentParams,parentLoadingData:e,debugNameContext:r.debugNameContext,url:r.url,isActive:r.isActive},children:t})}function C({name:e,loading:t,children:r}){if(null!==t){let n=t[0],a=t[1],o=t[2];return(0,s.jsx)(l.Suspense,{name:e,fallback:(0,s.jsxs)(s.Fragment,{children:[a,o,n]}),children:r})}return(0,s.jsx)(s.Fragment,{children:r})}function A({parallelRouterKey:e,error:t,errorStyles:r,errorScripts:n,templateStyles:a,templateScripts:o,template:i,notFound:c,forbidden:p,unauthorized:b,segmentViewBoundaries:_}){let v=(0,l.useContext)(u.LayoutRouterContext);if(!v)throw Object.defineProperty(Error("invariant expected layout router to be mounted"),"__NEXT_ERROR_CODE",{value:"E56",enumerable:!1,configurable:!0});let{parentTree:E,parentCacheNode:O,parentSegmentPath:R,parentParams:j,parentLoadingData:x,url:k,isActive:T,debugNameContext:N}=v,D=E[0],M=null===R?[e]:R.concat([D,e]),I=E[1][e],F=O.slots;(void 0===I||null===F)&&(0,l.use)(d.unresolvedThenable);let $=I[0],L=F[e]??null,U=(0,g.createRouterCacheKey)($,!0),X=(0,y.useRouterBFCache)(I,L,U),V=[];do{let e=X.tree,l=X.cacheNode,d=X.stateKey,g=e[0],y=j;if(Array.isArray(g)){let e=g[0],t=g[1],r=g[2],n=(0,P.getParamValueFromCacheKey)(t,r);null!==n&&(y={...j,[e]:n})}let _=function(e){if("/"===e)return"/";if("string"==typeof e)if("(__SLOT__)"===e)return;else return e+"/";return e[1]+"/"}(g),v=_??N,E=void 0===_?void 0:N,O=(0,s.jsxs)(w,{cacheNode:l,children:[(0,s.jsx)(f.ErrorBoundary,{errorComponent:t,errorStyles:r,errorScripts:n,children:(0,s.jsx)(C,{name:E,loading:x,children:(0,s.jsx)(h.HTTPAccessFallbackBoundary,{notFound:c,forbidden:p,unauthorized:b,children:(0,s.jsxs)(m.RedirectBoundary,{children:[(0,s.jsx)(S,{url:k,tree:e,params:y,cacheNode:l,segmentPath:M,debugNameContext:v,isActive:T&&d===U}),null]})})})}),null]}),R=(0,s.jsxs)(u.TemplateContext.Provider,{value:O,children:[a,o,i]},d);V.push(R),X=X.next}while(null!==X)return V}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},37457,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"default",{enumerable:!0,get:function(){return s}});let n=e.r(90809),a=e.r(43476),o=n._(e.r(71645)),i=e.r(8372);function s(){let e=(0,o.useContext)(i.TemplateContext);return(0,a.jsx)(a.Fragment,{children:e})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},93504,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderSearchParamsFromClient",{enumerable:!0,get:function(){return a}});let n=new WeakMap;function a(e){let t=n.get(e);if(t)return t;let r=Promise.resolve(e);return n.set(e,r),r}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},66996,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderSearchParamsFromClient",{enumerable:!0,get:function(){return n}});let n=e.r(93504).createRenderSearchParamsFromClient;("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},6831,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderParamsFromClient",{enumerable:!0,get:function(){return a}});let n=new WeakMap;function a(e){let t=n.get(e);if(t)return t;let r=Promise.resolve(e);return n.set(e,r),r}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},97689,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderParamsFromClient",{enumerable:!0,get:function(){return n}});let n=e.r(6831).createRenderParamsFromClient;("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},66373,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={accumulateRootVaryParam:function(){return y},accumulateVaryParam:function(){return g},createResponseVaryParamsAccumulator:function(){return c},createVaryParamsAccumulator:function(){return u},createVaryingParams:function(){return b},createVaryingSearchParams:function(){return P},emptyVaryParamsAccumulator:function(){return l},finishAccumulatingVaryParams:function(){return _},getMetadataVaryParamsAccumulator:function(){return d},getMetadataVaryParamsThenable:function(){return p},getRootParamsVaryParamsAccumulator:function(){return h},getVaryParamsThenable:function(){return f},getViewportVaryParamsAccumulator:function(){return m}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(62141);function i(){let e={varyParams:new Set,status:"pending",value:new Set,then(t){t&&("pending"===e.status?e.resolvers.push(t):t(e.value))},resolvers:[]};return e}let s=new Set,l={varyParams:s,status:"fulfilled",value:s,then(e){e&&e(s)},resolvers:[]};function c(){let e=i();return{head:e,rootParams:i(),segments:new Set}}function u(){let e=o.workUnitAsyncStorage.getStore();if(e)switch(e.type){case"prerender":case"prerender-runtime":{let t=e.varyParamsAccumulator;if(null!==t){let e=i();return t.segments.add(e),e}}}return null}function d(){let e=o.workUnitAsyncStorage.getStore();if(e)switch(e.type){case"prerender":case"prerender-runtime":{let t=e.varyParamsAccumulator;if(null!==t)return t.head}}return null}function f(e){return e}function p(){let e=d();return null!==e?e:null}let m=d;function h(){let e=o.workUnitAsyncStorage.getStore();if(e)switch(e.type){case"prerender":case"prerender-runtime":{let t=e.varyParamsAccumulator;if(null!==t)return t.rootParams}}return null}function g(e,t){e.varyParams.add(t)}function y(e){let t=h();null!==t&&g(t,e)}function b(e,t,r){if(null!==r)return new Proxy(t,{get:(t,n,a)=>("string"==typeof n&&(n===r||Object.prototype.hasOwnProperty.call(t,n))&&g(e,n),Reflect.get(t,n,a)),has:(t,n)=>(n===r&&g(e,r),Reflect.has(t,n)),ownKeys:t=>(g(e,r),Reflect.ownKeys(t))});let n={};for(let r in t)Object.defineProperty(n,r,{get:()=>(g(e,r),t[r]),enumerable:!0});return n}function P(e,t){let r={};for(let n in t)Object.defineProperty(r,n,{get:()=>(g(e,"?"),t[n]),enumerable:!0});return r}async function _(e){let t=e.rootParams.varyParams;for(let r of(v(e.head,t),e.segments))v(r,t);await Promise.resolve(),await Promise.resolve(),await Promise.resolve()}function v(e,t){if("pending"!==e.status)return;let r=new Set(e.varyParams);for(let e of t)r.add(e);for(let t of(e.value=r,e.status="fulfilled",e.resolvers))t(r);e.resolvers=[]}},42715,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ReflectAdapter",{enumerable:!0,get:function(){return n}});class n{static get(e,t,r){let n=Reflect.get(e,t,r);return"function"==typeof n?n.bind(e):n}static set(e,t,r,n){return Reflect.set(e,t,r,n)}static has(e,t){return Reflect.has(e,t)}static deleteProperty(e,t){return Reflect.deleteProperty(e,t)}}},76361,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createDedupedByCallsiteServerErrorLoggerDev",{enumerable:!0,get:function(){return l}});let n=function(e){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=a(void 0);if(t&&t.has(e))return t.get(e);var r={__proto__:null},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e)if("default"!==o&&Object.prototype.hasOwnProperty.call(e,o)){var i=n?Object.getOwnPropertyDescriptor(e,o):null;i&&(i.get||i.set)?Object.defineProperty(r,o,i):r[o]=e[o]}return r.default=e,t&&t.set(e,r),r}(e.r(71645));function a(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(a=function(e){return e?r:t})(e)}let o={current:null},i="function"==typeof n.cache?n.cache:e=>e,s=console.warn;function l(e){return function(...t){s(e(...t))}}i(e=>{try{s(o.current)}finally{o.current=null}})},65932,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={describeHasCheckingStringProperty:function(){return s},describeStringPropertyAccess:function(){return i},wellKnownProperties:function(){return l}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=/^[A-Za-z_$][A-Za-z0-9_$]*$/;function i(e,t){return o.test(t)?`\`${e}.${t}\``:`\`${e}[${JSON.stringify(t)}]\``}function s(e,t){let r=JSON.stringify(t);return`\`Reflect.has(${e}, ${r})\`, \`${r} in ${e}\`, or similar`}let l=new Set(["hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toString","valueOf","toLocaleString","then","catch","finally","status","displayName","_debugInfo","toJSON","$$typeof","__esModule","@@iterator"])},83066,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"afterTaskAsyncStorageInstance",{enumerable:!0,get:function(){return n}});let n=(0,e.r(90317).createAsyncLocalStorage)()},41643,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"afterTaskAsyncStorage",{enumerable:!0,get:function(){return n.afterTaskAsyncStorageInstance}});let n=e.r(83066)},50999,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={isRequestAPICallableInsideAfter:function(){return c},throwForSearchParamsAccessInUseCache:function(){return l},throwWithStaticGenerationBailoutErrorWithDynamicError:function(){return s}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(43248),i=e.r(41643);function s(e,t){throw Object.defineProperty(new o.StaticGenBailoutError(`Route ${e} with \`dynamic = "error"\` couldn't be rendered statically because it used ${t}. See more info here: https://nextjs.org/docs/app/building-your-application/rendering/static-and-dynamic#dynamic-rendering`),"__NEXT_ERROR_CODE",{value:"E543",enumerable:!1,configurable:!0})}function l(e,t){let r=Object.defineProperty(Error(`Route ${e.route} used \`searchParams\` inside "use cache". Accessing dynamic request data inside a cache scope is not supported. If you need some search params inside a cached function await \`searchParams\` outside of the cached function and pass only the required search params as arguments to the cached function. See more info here: https://nextjs.org/docs/messages/next-request-in-use-cache`),"__NEXT_ERROR_CODE",{value:"E842",enumerable:!1,configurable:!0});throw Error.captureStackTrace(r,t),e.invalidDynamicUsageError??=r,r}function c(){let e=i.afterTaskAsyncStorage.getStore();return(null==e?void 0:e.rootTaskSpawnPhase)==="action"}},28649,(e,t,r)=>{"use strict";var n=Object.defineProperty,a=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,i=Object.prototype.hasOwnProperty,s={},l={RequestCookies:()=>h,ResponseCookies:()=>g,parseCookie:()=>d,parseSetCookie:()=>f,stringifyCookie:()=>u};for(var c in l)n(s,c,{get:l[c],enumerable:!0});function u(e){var t;let r=["path"in e&&e.path&&`Path=${e.path}`,"expires"in e&&(e.expires||0===e.expires)&&`Expires=${("number"==typeof e.expires?new Date(e.expires):e.expires).toUTCString()}`,"maxAge"in e&&"number"==typeof e.maxAge&&`Max-Age=${e.maxAge}`,"domain"in e&&e.domain&&`Domain=${e.domain}`,"secure"in e&&e.secure&&"Secure","httpOnly"in e&&e.httpOnly&&"HttpOnly","sameSite"in e&&e.sameSite&&`SameSite=${e.sameSite}`,"partitioned"in e&&e.partitioned&&"Partitioned","priority"in e&&e.priority&&`Priority=${e.priority}`].filter(Boolean),n=`${e.name}=${encodeURIComponent(null!=(t=e.value)?t:"")}`;return 0===r.length?n:`${n}; ${r.join("; ")}`}function d(e){let t=new Map;for(let r of e.split(/; */)){if(!r)continue;let e=r.indexOf("=");if(-1===e){t.set(r,"true");continue}let[n,a]=[r.slice(0,e),r.slice(e+1)];try{t.set(n,decodeURIComponent(null!=a?a:"true"))}catch{}}return t}function f(e){if(!e)return;let[[t,r],...n]=d(e),{domain:a,expires:o,httponly:i,maxage:s,path:l,samesite:c,secure:u,partitioned:f,priority:h}=Object.fromEntries(n.map(([e,t])=>[e.toLowerCase().replace(/-/g,""),t]));{var g,y,b={name:t,value:decodeURIComponent(r),domain:a,...o&&{expires:new Date(o)},...i&&{httpOnly:!0},..."string"==typeof s&&{maxAge:Number(s)},path:l,...c&&{sameSite:p.includes(g=(g=c).toLowerCase())?g:void 0},...u&&{secure:!0},...h&&{priority:m.includes(y=(y=h).toLowerCase())?y:void 0},...f&&{partitioned:!0}};let e={};for(let t in b)b[t]&&(e[t]=b[t]);return e}}t.exports=((e,t,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let s of o(t))i.call(e,s)||void 0===s||n(e,s,{get:()=>t[s],enumerable:!(r=a(t,s))||r.enumerable});return e})(n({},"__esModule",{value:!0}),s);var p=["strict","lax","none"],m=["low","medium","high"],h=class{constructor(e){this._parsed=new Map,this._headers=e;const t=e.get("cookie");if(t)for(const[e,r]of d(t))this._parsed.set(e,{name:e,value:r})}[Symbol.iterator](){return this._parsed[Symbol.iterator]()}get size(){return this._parsed.size}get(...e){let t="string"==typeof e[0]?e[0]:e[0].name;return this._parsed.get(t)}getAll(...e){var t;let r=Array.from(this._parsed);if(!e.length)return r.map(([e,t])=>t);let n="string"==typeof e[0]?e[0]:null==(t=e[0])?void 0:t.name;return r.filter(([e])=>e===n).map(([e,t])=>t)}has(e){return this._parsed.has(e)}set(...e){let[t,r]=1===e.length?[e[0].name,e[0].value]:e,n=this._parsed;return n.set(t,{name:t,value:r}),this._headers.set("cookie",Array.from(n).map(([e,t])=>u(t)).join("; ")),this}delete(e){let t=this._parsed,r=Array.isArray(e)?e.map(e=>t.delete(e)):t.delete(e);return this._headers.set("cookie",Array.from(t).map(([e,t])=>u(t)).join("; ")),r}clear(){return this.delete(Array.from(this._parsed.keys())),this}[Symbol.for("edge-runtime.inspect.custom")](){return`RequestCookies ${JSON.stringify(Object.fromEntries(this._parsed))}`}toString(){return[...this._parsed.values()].map(e=>`${e.name}=${encodeURIComponent(e.value)}`).join("; ")}},g=class{constructor(e){var t,r,n;this._parsed=new Map,this._headers=e;const a=null!=(n=null!=(r=null==(t=e.getSetCookie)?void 0:t.call(e))?r:e.get("set-cookie"))?n:[];for(const e of Array.isArray(a)?a:function(e){if(!e)return[];var t,r,n,a,o,i=[],s=0;function l(){for(;s<e.length&&/\s/.test(e.charAt(s));)s+=1;return s<e.length}for(;s<e.length;){for(t=s,o=!1;l();)if(","===(r=e.charAt(s))){for(n=s,s+=1,l(),a=s;s<e.length&&"="!==(r=e.charAt(s))&&";"!==r&&","!==r;)s+=1;s<e.length&&"="===e.charAt(s)?(o=!0,s=a,i.push(e.substring(t,n)),t=s):s=n+1}else s+=1;(!o||s>=e.length)&&i.push(e.substring(t,e.length))}return i}(a)){const t=f(e);t&&this._parsed.set(t.name,t)}}get(...e){let t="string"==typeof e[0]?e[0]:e[0].name;return this._parsed.get(t)}getAll(...e){var t;let r=Array.from(this._parsed.values());if(!e.length)return r;let n="string"==typeof e[0]?e[0]:null==(t=e[0])?void 0:t.name;return r.filter(e=>e.name===n)}has(e){return this._parsed.has(e)}set(...e){let[t,r,n]=1===e.length?[e[0].name,e[0].value,e[0]]:e,a=this._parsed;return a.set(t,function(e={name:"",value:""}){return"number"==typeof e.expires&&(e.expires=new Date(e.expires)),e.maxAge&&(e.expires=new Date(Date.now()+1e3*e.maxAge)),(null===e.path||void 0===e.path)&&(e.path="/"),e}({name:t,value:r,...n})),function(e,t){for(let[,r]of(t.delete("set-cookie"),e)){let e=u(r);t.append("set-cookie",e)}}(a,this._headers),this}delete(...e){let[t,r]="string"==typeof e[0]?[e[0]]:[e[0].name,e[0]];return this.set({...r,name:t,value:"",expires:new Date(0)})}[Symbol.for("edge-runtime.inspect.custom")](){return`ResponseCookies ${JSON.stringify(Object.fromEntries(this._parsed))}`}toString(){return[...this._parsed.values()].map(u).join("; ")}}},96883,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={RequestCookies:function(){return o.RequestCookies},ResponseCookies:function(){return o.ResponseCookies},stringifyCookie:function(){return o.stringifyCookie}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(28649)},97270,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={MutableRequestCookiesAdapter:function(){return m},ReadonlyRequestCookiesError:function(){return c},RequestCookiesAdapter:function(){return u},appendMutableCookies:function(){return p},areCookiesMutableInCurrentPhase:function(){return g},createCookiesWithMutableAccessCheck:function(){return h},getModifiedCookieValues:function(){return f},responseCookiesToRequestCookies:function(){return b}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(96883),i=e.r(42715),s=e.r(63599),l=e.r(39146);class c extends Error{constructor(){super("Cookies can only be modified in a Server Action or Route Handler. Read more: https://nextjs.org/docs/app/api-reference/functions/cookies#options")}static callable(){throw new c}}class u{static seal(e){return new Proxy(e,{get(e,t,r){switch(t){case"clear":case"delete":case"set":return c.callable;default:return i.ReflectAdapter.get(e,t,r)}}})}}let d=Symbol.for("next.mutated.cookies");function f(e){let t=e[d];return t&&Array.isArray(t)&&0!==t.length?t:[]}function p(e,t){let r=f(t);if(0===r.length)return!1;let n=new o.ResponseCookies(e),a=n.getAll();for(let e of r)n.set(e);for(let e of a)n.set(e);return!0}class m{static wrap(e,t){let r=new o.ResponseCookies(new Headers);for(let t of e.getAll())r.set(t);let n=[],a=new Set,c=()=>{let e=s.workAsyncStorage.getStore();if(e&&(e.pathWasRevalidated=l.ActionDidRevalidateStaticAndDynamic),n=r.getAll().filter(e=>a.has(e.name)),t){let e=[];for(let t of n){let r=new o.ResponseCookies(new Headers);r.set(t),e.push(r.toString())}t(e)}},u=new Proxy(r,{get(e,t,r){switch(t){case d:return n;case"delete":return function(...t){a.add("string"==typeof t[0]?t[0]:t[0].name);try{return e.delete(...t),u}finally{c()}};case"set":return function(...t){a.add("string"==typeof t[0]?t[0]:t[0].name);try{return e.set(...t),u}finally{c()}};default:return i.ReflectAdapter.get(e,t,r)}}});return u}}function h(e){let t=new Proxy(e.mutableCookies,{get(r,n,a){switch(n){case"delete":return function(...n){return y(e,"cookies().delete"),r.delete(...n),t};case"set":return function(...n){return y(e,"cookies().set"),r.set(...n),t};default:return i.ReflectAdapter.get(r,n,a)}}});return t}function g(e){return"action"===e.phase}function y(e,t){if(!g(e))throw new c}function b(e){let t=new o.RequestCookies(new Headers);for(let r of e.getAll())t.set(r);return t}},87720,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={HeadersAdapter:function(){return s},ReadonlyHeadersError:function(){return i}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(42715);class i extends Error{constructor(){super("Headers cannot be modified. Read more: https://nextjs.org/docs/app/api-reference/functions/headers")}static callable(){throw new i}}class s extends Headers{constructor(e){super(),this.headers=new Proxy(e,{get(t,r,n){if("symbol"==typeof r)return o.ReflectAdapter.get(t,r,n);let a=r.toLowerCase(),i=Object.keys(e).find(e=>e.toLowerCase()===a);if(void 0!==i)return o.ReflectAdapter.get(t,i,n)},set(t,r,n,a){if("symbol"==typeof r)return o.ReflectAdapter.set(t,r,n,a);let i=r.toLowerCase(),s=Object.keys(e).find(e=>e.toLowerCase()===i);return o.ReflectAdapter.set(t,s??r,n,a)},has(t,r){if("symbol"==typeof r)return o.ReflectAdapter.has(t,r);let n=r.toLowerCase(),a=Object.keys(e).find(e=>e.toLowerCase()===n);return void 0!==a&&o.ReflectAdapter.has(t,a)},deleteProperty(t,r){if("symbol"==typeof r)return o.ReflectAdapter.deleteProperty(t,r);let n=r.toLowerCase(),a=Object.keys(e).find(e=>e.toLowerCase()===n);return void 0===a||o.ReflectAdapter.deleteProperty(t,a)}})}static seal(e){return new Proxy(e,{get(e,t,r){switch(t){case"append":case"delete":case"set":return i.callable;default:return o.ReflectAdapter.get(e,t,r)}}})}merge(e){return Array.isArray(e)?e.join(", "):e}static from(e){return e instanceof Headers?e:new s(e)}append(e,t){let r=this.headers[e];"string"==typeof r?this.headers[e]=[r,t]:Array.isArray(r)?r.push(t):this.headers[e]=t}delete(e){delete this.headers[e]}get(e){let t=this.headers[e];return void 0!==t?this.merge(t):null}has(e){return void 0!==this.headers[e]}set(e,t){this.headers[e]=t}forEach(e,t){for(let[r,n]of this.entries())e.call(t,n,r,this)}*entries(){for(let e of Object.keys(this.headers)){let t=e.toLowerCase(),r=this.get(t);yield[t,r]}}*keys(){for(let e of Object.keys(this.headers)){let t=e.toLowerCase();yield t}}*values(){for(let e of Object.keys(this.headers)){let t=this.get(e);yield t}}[Symbol.iterator](){return this.entries()}}},1643,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={getParamProperties:function(){return l},getSegmentParam:function(){return i},isCatchAll:function(){return s}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(91463);function i(e){let t=o.INTERCEPTION_ROUTE_MARKERS.find(t=>e.startsWith(t));return(t&&(e=e.slice(t.length)),e.startsWith("[[...")&&e.endsWith("]]"))?{paramType:"optional-catchall",paramName:e.slice(5,-2)}:e.startsWith("[...")&&e.endsWith("]")?{paramType:t?`catchall-intercepted-${t}`:"catchall",paramName:e.slice(4,-1)}:e.startsWith("[")&&e.endsWith("]")?{paramType:t?`dynamic-intercepted-${t}`:"dynamic",paramName:e.slice(1,-1)}:null}function s(e){return"catchall"===e||"catchall-intercepted-(..)(..)"===e||"catchall-intercepted-(.)"===e||"catchall-intercepted-(..)"===e||"catchall-intercepted-(...)"===e||"optional-catchall"===e}function l(e){let t=!1,r=!1;switch(e){case"catchall":case"catchall-intercepted-(..)(..)":case"catchall-intercepted-(.)":case"catchall-intercepted-(..)":case"catchall-intercepted-(...)":t=!0;break;case"optional-catchall":t=!0,r=!0}return{repeat:t,optional:r}}},18967,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={DecodeError:function(){return y},MiddlewareNotFoundError:function(){return v},MissingStaticPage:function(){return _},NormalizeError:function(){return b},PageNotFoundError:function(){return P},SP:function(){return h},ST:function(){return g},WEB_VITALS:function(){return o},execOnce:function(){return i},getDisplayName:function(){return d},getLocationOrigin:function(){return c},getURL:function(){return u},isAbsoluteUrl:function(){return l},isResSent:function(){return f},loadGetInitialProps:function(){return m},normalizeRepeatedSlashes:function(){return p},stringifyError:function(){return E}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=["CLS","FCP","FID","INP","LCP","TTFB"];function i(e){let t,r=!1;return(...n)=>(r||(r=!0,t=e(...n)),t)}let s=/^[a-zA-Z][a-zA-Z\d+\-.]*?:/,l=e=>s.test(e);function c(){let{protocol:e,hostname:t,port:r}=window.location;return`${e}//${t}${r?":"+r:""}`}function u(){let{href:e}=window.location,t=c();return e.substring(t.length)}function d(e){return"string"==typeof e?e:e.displayName||e.name||"Unknown"}function f(e){return e.finished||e.headersSent}function p(e){let t=e.split("?");return t[0].replace(/\\/g,"/").replace(/\/\/+/g,"/")+(t[1]?`?${t.slice(1).join("?")}`:"")}async function m(e,t){let r=t.res||t.ctx&&t.ctx.res;if(!e.getInitialProps)return t.ctx&&t.Component?{pageProps:await m(t.Component,t.ctx)}:{};let n=await e.getInitialProps(t);if(r&&f(r))return n;if(!n)throw Object.defineProperty(Error(`"${d(e)}.getInitialProps()" should resolve to an object. But found "${n}" instead.`),"__NEXT_ERROR_CODE",{value:"E1025",enumerable:!1,configurable:!0});return n}let h="u">typeof performance,g=h&&["mark","measure","getEntriesByName"].every(e=>"function"==typeof performance[e]);class y extends Error{}class b extends Error{}class P extends Error{constructor(e){super(),this.code="ENOENT",this.name="PageNotFoundError",this.message=`Cannot find module for page: ${e}`}}class _ extends Error{constructor(e,t){super(),this.message=`Failed to load static file for page: ${e} ${t}`}}class v extends Error{constructor(){super(),this.code="ENOENT",this.message="Cannot find the middleware module"}}function E(e){return JSON.stringify({message:e.message,stack:e.stack})}},98183,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={assign:function(){return l},searchParamsToUrlQuery:function(){return o},urlQueryToSearchParams:function(){return s}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});function o(e){let t={};for(let[r,n]of e.entries()){let e=t[r];void 0===e?t[r]=n:Array.isArray(e)?e.push(n):t[r]=[e,n]}return t}function i(e){return"string"==typeof e?e:("number"!=typeof e||isNaN(e))&&"boolean"!=typeof e?"":String(e)}function s(e){let t=new URLSearchParams;for(let[r,n]of Object.entries(e))if(Array.isArray(n))for(let e of n)t.append(r,i(e));else t.set(r,i(n));return t}function l(e,...t){for(let r of t){for(let t of r.keys())e.delete(t);for(let[t,n]of r.entries())e.append(t,n)}return e}},90929,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"parseRelativeUrl",{enumerable:!0,get:function(){return o}});let n=e.r(18967),a=e.r(98183);function o(e,t,r=!0){let i=new URL("u"<typeof window?"http://n":(0,n.getLocationOrigin)()),s=t?new URL(t,i):e.startsWith(".")?new URL("u"<typeof window?"http://n":window.location.href):i,{pathname:l,searchParams:c,search:u,hash:d,href:f,origin:p}=e.startsWith("/")?new URL(`${s.protocol}//${s.host}${e}`):new URL(e,s);if(p!==i.origin)throw Object.defineProperty(Error(`invariant: invalid relative URL, router received ${e}`),"__NEXT_ERROR_CODE",{value:"E159",enumerable:!1,configurable:!0});return{auth:null,host:null,hostname:null,pathname:l,port:null,protocol:null,query:r?(0,a.searchParamsToUrlQuery)(c):void 0,search:u,hash:d,href:f.slice(p.length),slashes:null}}},13770,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={InstantValidationError:function(){return s},isInstantValidationError:function(){return i}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o="INSTANT_VALIDATION_ERROR";function i(e){return!!(e&&"object"==typeof e&&e instanceof Error&&e.digest===o)}class s extends Error{constructor(...e){super(...e),this.digest=o}}},18450,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={assertRootParamInSamples:function(){return S},createCookiesFromSample:function(){return y},createDraftModeForValidation:function(){return _},createExhaustiveParamsProxy:function(){return v},createExhaustiveSearchParamsProxy:function(){return E},createExhaustiveURLSearchParamsProxy:function(){return O},createHeadersFromSample:function(){return P},createRelativeURLFromSamples:function(){return w},createValidationSampleTracking:function(){return m},trackMissingSampleError:function(){return h},trackMissingSampleErrorAndThrow:function(){return g}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(96883),i=e.r(97270),s=e.r(87720),l=e.r(1643),c=e.r(90929),u=e.r(12718),d=e.r(13770),f=e.r(62141),p=e.r(65932);function m(){return{missingSampleErrors:[]}}function h(e){(function(){let e=null,t=f.workUnitAsyncStorage.getStore();if(t)switch(t.type){case"request":case"validation-client":e=t.validationSampleTracking??null}if(!e)throw Object.defineProperty(new u.InvariantError("Expected to have a workUnitStore that provides validationSampleTracking"),"__NEXT_ERROR_CODE",{value:"E1110",enumerable:!1,configurable:!0});return e})().missingSampleErrors.push(e)}function g(e){throw h(e),e}function y(e,t){let r=new Set,n=new o.RequestCookies(new Headers);if(e)for(let t of e)r.add(t.name),null!==t.value&&n.set(t.name,t.value);return new Proxy(i.RequestCookiesAdapter.seal(n),{get(e,n,a){if("has"===n){let o=Reflect.get(e,n,a);return function(n){return r.has(n)||g(b(t,n)),o.call(e,n)}}if("get"===n){let o=Reflect.get(e,n,a);return function(n){let a;if("string"==typeof n)a=n;else{if(!n||"object"!=typeof n||"string"!=typeof n.name)return o.call(e,n);a=n.name}return r.has(a)||g(b(t,a)),o.call(e,a)}}return Reflect.get(e,n,a)}})}function b(e,t){return Object.defineProperty(new d.InstantValidationError(`Route "${e}" accessed cookie "${t}" which is not defined in the \`samples\` of \`unstable_instant\`. Add it to the sample's \`cookies\` array, or \`{ name: "${t}", value: null }\` if it should be absent.`),"__NEXT_ERROR_CODE",{value:"E1115",enumerable:!1,configurable:!0})}function P(e,t,r){let n=e?[...e]:[];if(n.find(([e])=>"cookie"===e.toLowerCase()))throw Object.defineProperty(new d.InstantValidationError('Invalid sample: Defining cookies via a "cookie" header is not supported. Use `cookies: [{ name: ..., value: ... }]` instead.'),"__NEXT_ERROR_CODE",{value:"E1111",enumerable:!1,configurable:!0});if(t){let e=t.toString();n.push(["cookie",""!==e?e:null])}let a=new Set,o={};for(let[e,t]of n)a.add(e.toLowerCase()),null!==t&&(o[e.toLowerCase()]=t);return new Proxy(s.HeadersAdapter.seal(s.HeadersAdapter.from(o)),{get(e,t,n){if("get"===t||"has"===t){let o=Reflect.get(e,t,n);return function(t){let n=t.toLowerCase();return a.has(n)||g(Object.defineProperty(new d.InstantValidationError(`Route "${r}" accessed header "${n}" which is not defined in the \`samples\` of \`unstable_instant\`. Add it to the sample's \`headers\` array, or \`["${n}", null]\` if it should be absent.`),"__NEXT_ERROR_CODE",{value:"E1116",enumerable:!1,configurable:!0})),o.call(e,n)}}return Reflect.get(e,t,n)}})}function _(){return{get isEnabled(){return!1},enable(){throw Object.defineProperty(Error("Draft mode cannot be enabled during build-time instant validation."),"__NEXT_ERROR_CODE",{value:"E1092",enumerable:!1,configurable:!0})},disable(){throw Object.defineProperty(Error("Draft mode cannot be disabled during build-time instant validation."),"__NEXT_ERROR_CODE",{value:"E1094",enumerable:!1,configurable:!0})}}}function v(e,t,r){return new Proxy(e,{get:(n,a,o)=>("string"==typeof a&&!p.wellKnownProperties.has(a)&&a in e&&!t.has(a)&&g(Object.defineProperty(new d.InstantValidationError(`Route "${r}" accessed param "${a}" which is not defined in the \`samples\` of \`unstable_instant\`. Add it to the sample's \`params\` object.`),"__NEXT_ERROR_CODE",{value:"E1095",enumerable:!1,configurable:!0})),Reflect.get(n,a,o))})}function E(e,t,r){return new Proxy(e,{get:(e,n,a)=>("string"!=typeof n||p.wellKnownProperties.has(n)||t.has(n)||g(R(r,n)),Reflect.get(e,n,a)),has:(e,n)=>("string"!=typeof n||p.wellKnownProperties.has(n)||t.has(n)||g(R(r,n)),Reflect.has(e,n))})}function O(e,t,r){return new Proxy(e,{get(e,n,a){if("get"===n||"getAll"===n||"has"===n){let o=Reflect.get(e,n,a);return n=>("string"!=typeof n||t.has(n)||g(R(r,n)),o.call(e,n))}let o=Reflect.get(e,n,a);return"function"!=typeof o||Object.hasOwn(e,n)?o:o.bind(e)}})}function R(e,t){return Object.defineProperty(new d.InstantValidationError(`Route "${e}" accessed searchParam "${t}" which is not defined in the \`samples\` of \`unstable_instant\`. Add it to the sample's \`searchParams\` object, or \`{ "${t}": null }\` if it should be absent.`),"__NEXT_ERROR_CODE",{value:"E1098",enumerable:!1,configurable:!0})}function w(e,t,r){let n=function(e,t){let r=[];for(let n of e.split("/")){let e=(0,l.getSegmentParam)(n);if(e)switch(e.paramType){case"catchall":case"optional-catchall":{let a=t[e.paramName];if(void 0===a)a=[n];else if(!Array.isArray(a))throw Object.defineProperty(new d.InstantValidationError(`Expected sample param value for segment '${n}' to be an array of strings, got ${typeof a}`),"__NEXT_ERROR_CODE",{value:"E1104",enumerable:!1,configurable:!0});r.push(...a.map(e=>encodeURIComponent(e)));break}case"dynamic":{let a=t[e.paramName];if(void 0===a)a=n;else if("string"!=typeof a)throw Object.defineProperty(new d.InstantValidationError(`Expected sample param value for segment '${n}' to be a string, got ${typeof a}`),"__NEXT_ERROR_CODE",{value:"E1108",enumerable:!1,configurable:!0});r.push(encodeURIComponent(a));break}case"catchall-intercepted-(..)(..)":case"catchall-intercepted-(.)":case"catchall-intercepted-(..)":case"catchall-intercepted-(...)":case"dynamic-intercepted-(..)(..)":case"dynamic-intercepted-(.)":case"dynamic-intercepted-(..)":case"dynamic-intercepted-(...)":throw Object.defineProperty(new u.InvariantError("Not implemented: Validation of interception routes"),"__NEXT_ERROR_CODE",{value:"E1106",enumerable:!1,configurable:!0});default:e.paramType}else r.push(n)}return r.join("/")}(e,t??{}),a="";if(r){let e=(function(e){let t=new URLSearchParams;if(e){for(let[r,n]of Object.entries(e))if(null!=n)if(Array.isArray(n))for(let e of n)t.append(r,e);else t.set(r,n)}return t})(r).toString();e&&(a="?"+e)}return(0,c.parseRelativeUrl)(n+a,void 0,!0)}function S(e,t,r){if(t&&r in t);else{let t=e.route;g(Object.defineProperty(new d.InstantValidationError(`Route "${t}" accessed root param "${r}" which is not defined in the \`samples\` of \`unstable_instant\`. Add it to the sample's \`params\` object.`),"__NEXT_ERROR_CODE",{value:"E1114",enumerable:!1,configurable:!0}))}}},69882,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={createPrerenderSearchParamsForClientPage:function(){return P},createSearchParamsFromClient:function(){return g},createServerSearchParamsForMetadata:function(){return y},createServerSearchParamsForServerPage:function(){return b},makeErroringSearchParamsForUseCache:function(){return R}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(63599),i=e.r(66373),s=e.r(42715),l=e.r(67673),c=e.r(62141),u=e.r(12718),d=e.r(63138),f=e.r(76361),p=e.r(65932),m=e.r(50999),h=e.r(42852);function g(t){let r=o.workAsyncStorage.getStore();if(!r)throw Object.defineProperty(new u.InvariantError("Expected workStore to be initialized"),"__NEXT_ERROR_CODE",{value:"E1068",enumerable:!1,configurable:!0});let n=c.workUnitAsyncStorage.getStore();if(n)switch(n.type){case"prerender":case"prerender-client":case"prerender-ppr":case"prerender-legacy":return _(r,n);case"validation-client":return function(t,r,n){var a;let{createExhaustiveSearchParamsProxy:o}=e.r(18450);return Promise.resolve(t=o(t,new Set(Object.keys((null==(a=n.validationSamples)?void 0:a.searchParams)??{})),r.route))}(t,r,n);case"prerender-runtime":throw Object.defineProperty(new u.InvariantError("createSearchParamsFromClient should not be called in a runtime prerender."),"__NEXT_ERROR_CODE",{value:"E769",enumerable:!1,configurable:!0});case"cache":case"private-cache":case"unstable-cache":throw Object.defineProperty(new u.InvariantError("createSearchParamsFromClient should not be called in cache contexts."),"__NEXT_ERROR_CODE",{value:"E739",enumerable:!1,configurable:!0});case"generate-static-params":throw Object.defineProperty(new u.InvariantError("createSearchParamsFromClient should not be called inside generateStaticParams."),"__NEXT_ERROR_CODE",{value:"E1133",enumerable:!1,configurable:!0});case"request":return v(t,r,n,!1)}(0,c.throwInvariantForMissingStore)()}function y(e,t){return b(e,(0,i.getMetadataVaryParamsAccumulator)(),t)}function b(e,t,r){let n=o.workAsyncStorage.getStore();if(!n)throw Object.defineProperty(new u.InvariantError("Expected workStore to be initialized"),"__NEXT_ERROR_CODE",{value:"E1068",enumerable:!1,configurable:!0});let a=c.workUnitAsyncStorage.getStore();if(a)switch(a.type){case"prerender":case"prerender-client":case"prerender-ppr":case"prerender-legacy":return _(n,a);case"validation-client":throw Object.defineProperty(new u.InvariantError("createServerSearchParamsForServerPage should not be called in a client validation."),"__NEXT_ERROR_CODE",{value:"E1066",enumerable:!1,configurable:!0});case"cache":case"private-cache":case"unstable-cache":throw Object.defineProperty(new u.InvariantError("createServerSearchParamsForServerPage should not be called in cache contexts."),"__NEXT_ERROR_CODE",{value:"E747",enumerable:!1,configurable:!0});case"generate-static-params":throw Object.defineProperty(new u.InvariantError("createServerSearchParamsForServerPage should not be called inside generateStaticParams."),"__NEXT_ERROR_CODE",{value:"E1128",enumerable:!1,configurable:!0});case"prerender-runtime":return function(e,t,r,n){let a=w(null!==r?(0,i.createVaryingSearchParams)(r,e):e),{stagedRendering:o}=t;if(!o)return a;let s=n?h.RenderStage.EarlyRuntime:h.RenderStage.Runtime;return o.waitForStage(s).then(()=>a)}(e,a,t,r);case"request":return v(e,n,a,r)}(0,c.throwInvariantForMissingStore)()}function P(){let e=o.workAsyncStorage.getStore();if(!e)throw Object.defineProperty(new u.InvariantError("Expected workStore to be initialized"),"__NEXT_ERROR_CODE",{value:"E1068",enumerable:!1,configurable:!0});if(e.forceStatic)return Promise.resolve({});let t=c.workUnitAsyncStorage.getStore();if(t)switch(t.type){case"prerender":case"prerender-client":return(0,d.makeHangingPromise)(t.renderSignal,e.route,"`searchParams`");case"validation-client":throw Object.defineProperty(new u.InvariantError("createPrerenderSearchParamsForClientPage should not be called in a client validation."),"__NEXT_ERROR_CODE",{value:"E1061",enumerable:!1,configurable:!0});case"prerender-runtime":throw Object.defineProperty(new u.InvariantError("createPrerenderSearchParamsForClientPage should not be called in a runtime prerender."),"__NEXT_ERROR_CODE",{value:"E768",enumerable:!1,configurable:!0});case"cache":case"private-cache":case"unstable-cache":throw Object.defineProperty(new u.InvariantError("createPrerenderSearchParamsForClientPage should not be called in cache contexts."),"__NEXT_ERROR_CODE",{value:"E746",enumerable:!1,configurable:!0});case"generate-static-params":throw Object.defineProperty(new u.InvariantError("createPrerenderSearchParamsForClientPage should not be called inside generateStaticParams."),"__NEXT_ERROR_CODE",{value:"E1124",enumerable:!1,configurable:!0});case"prerender-ppr":case"prerender-legacy":case"request":return Promise.resolve({})}(0,c.throwInvariantForMissingStore)()}function _(e,t){if(e.forceStatic)return Promise.resolve({});switch(t.type){case"prerender":case"prerender-client":var r=e,n=t;let a=E.get(n);if(a)return a;let o=(0,d.makeHangingPromise)(n.renderSignal,r.route,"`searchParams`"),i=new Proxy(o,{get(e,t,r){if(Object.hasOwn(o,t))return s.ReflectAdapter.get(e,t,r);switch(t){case"then":return(0,l.annotateDynamicAccess)("`await searchParams`, `searchParams.then`, or similar",n),s.ReflectAdapter.get(e,t,r);case"status":return(0,l.annotateDynamicAccess)("`use(searchParams)`, `searchParams.status`, or similar",n),s.ReflectAdapter.get(e,t,r);default:return s.ReflectAdapter.get(e,t,r)}}});return E.set(n,i),i;case"prerender-ppr":case"prerender-legacy":var c=e,u=t;let f=E.get(c);if(f)return f;let p=Promise.resolve({}),h=new Proxy(p,{get(e,t,r){if(Object.hasOwn(p,t))return s.ReflectAdapter.get(e,t,r);if("string"==typeof t&&"then"===t){let e="`await searchParams`, `searchParams.then`, or similar";c.dynamicShouldError?(0,m.throwWithStaticGenerationBailoutErrorWithDynamicError)(c.route,e):"prerender-ppr"===u.type?(0,l.postponeWithTracking)(c.route,e,u.dynamicTracking):(0,l.throwToInterruptStaticGeneration)(e,c,u)}return s.ReflectAdapter.get(e,t,r)}});return E.set(c,h),h;default:return t}}function v(t,r,n,a){if(r.forceStatic)return Promise.resolve({});if(!n.asyncApiPromises)return w(t);if(n.validationSamples){let{createExhaustiveSearchParamsProxy:a}=e.r(18450),o=new Set(Object.keys(n.validationSamples.searchParams??{}));t=a(t,o,r.route)}return(a?n.asyncApiPromises.earlySharedSearchParamsParent:n.asyncApiPromises.sharedSearchParamsParent).then(()=>t)}let E=new WeakMap,O=new WeakMap;function R(){let e=o.workAsyncStorage.getStore();if(!e)throw Object.defineProperty(new u.InvariantError("Expected workStore to be initialized"),"__NEXT_ERROR_CODE",{value:"E1068",enumerable:!1,configurable:!0});let t=O.get(e);if(t)return t;let r=Promise.resolve({}),n=new Proxy(r,{get:function t(n,a,o){return Object.hasOwn(r,a)||"string"!=typeof a||"then"!==a&&p.wellKnownProperties.has(a)||(0,m.throwForSearchParamsAccessInUseCache)(e,t),s.ReflectAdapter.get(n,a,o)}});return O.set(e,n),n}function w(e){let t=E.get(e);if(t)return t;let r=Promise.resolve(e);return E.set(e,r),r}(0,f.createDedupedByCallsiteServerErrorLoggerDev)(function(e,t){let r=e?`Route "${e}" `:"This route ";return Object.defineProperty(Error(`${r}used ${t}. \`searchParams\` is a Promise and must be unwrapped with \`await\` or \`React.use()\` before accessing its properties. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis`),"__NEXT_ERROR_CODE",{value:"E848",enumerable:!1,configurable:!0})})},74804,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"dynamicAccessAsyncStorageInstance",{enumerable:!0,get:function(){return n}});let n=(0,e.r(90317).createAsyncLocalStorage)()},88276,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"dynamicAccessAsyncStorage",{enumerable:!0,get:function(){return n.dynamicAccessAsyncStorageInstance}});let n=e.r(74804)},41489,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={createParamsFromClient:function(){return g},createPrerenderParamsForClientSegment:function(){return _},createServerParamsForMetadata:function(){return y},createServerParamsForRoute:function(){return b},createServerParamsForServerSegment:function(){return P}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(63599),i=e.r(66373),s=e.r(42715),l=e.r(67673),c=e.r(62141),u=e.r(12718),d=e.r(65932),f=e.r(63138),p=e.r(76361),m=e.r(88276),h=e.r(42852);function g(e){let t=o.workAsyncStorage.getStore();if(!t)throw Object.defineProperty(new u.InvariantError("Expected workStore to be initialized"),"__NEXT_ERROR_CODE",{value:"E1068",enumerable:!1,configurable:!0});let r=c.workUnitAsyncStorage.getStore();if(r)switch(r.type){case"prerender":case"prerender-client":case"prerender-ppr":case"prerender-legacy":return v(e,null,t,r,null);case"validation-client":return O(e,t,r.validationSamples);case"cache":case"private-cache":case"unstable-cache":throw Object.defineProperty(new u.InvariantError("createParamsFromClient should not be called in cache contexts."),"__NEXT_ERROR_CODE",{value:"E736",enumerable:!1,configurable:!0});case"prerender-runtime":throw Object.defineProperty(new u.InvariantError("createParamsFromClient should not be called in a runtime prerender."),"__NEXT_ERROR_CODE",{value:"E770",enumerable:!1,configurable:!0});case"generate-static-params":throw Object.defineProperty(new u.InvariantError("createParamsFromClient should not be called inside generateStaticParams."),"__NEXT_ERROR_CODE",{value:"E1122",enumerable:!1,configurable:!0});case"request":if(r.validationSamples)return O(e,t,r.validationSamples);return S(e)}(0,c.throwInvariantForMissingStore)()}function y(e,t,r){return P(e,t,(0,i.getMetadataVaryParamsAccumulator)(),r)}function b(e,t=null){let r=o.workAsyncStorage.getStore();if(!r)throw Object.defineProperty(new u.InvariantError("Expected workStore to be initialized"),"__NEXT_ERROR_CODE",{value:"E1068",enumerable:!1,configurable:!0});let n=c.workUnitAsyncStorage.getStore();if(n)switch(n.type){case"prerender":case"prerender-ppr":case"prerender-legacy":return v(e,null,r,n,t);case"prerender-client":case"validation-client":throw Object.defineProperty(new u.InvariantError("createServerParamsForRoute should not be called in client contexts."),"__NEXT_ERROR_CODE",{value:"E1064",enumerable:!1,configurable:!0});case"cache":case"private-cache":case"unstable-cache":throw Object.defineProperty(new u.InvariantError("createServerParamsForRoute should not be called in cache contexts."),"__NEXT_ERROR_CODE",{value:"E738",enumerable:!1,configurable:!0});case"generate-static-params":throw Object.defineProperty(new u.InvariantError("createServerParamsForRoute should not be called inside generateStaticParams."),"__NEXT_ERROR_CODE",{value:"E1131",enumerable:!1,configurable:!0});case"prerender-runtime":return E(e,null,n,t,!1);case"request":return S(e)}(0,c.throwInvariantForMissingStore)()}function P(t,r,n,a){let i=o.workAsyncStorage.getStore();if(!i)throw Object.defineProperty(new u.InvariantError("Expected workStore to be initialized"),"__NEXT_ERROR_CODE",{value:"E1068",enumerable:!1,configurable:!0});let s=c.workUnitAsyncStorage.getStore();if(s)switch(s.type){case"prerender":case"prerender-client":case"prerender-ppr":case"prerender-legacy":return v(t,r,i,s,n);case"validation-client":throw Object.defineProperty(new u.InvariantError("createServerParamsForServerSegment should not be called in client contexts."),"__NEXT_ERROR_CODE",{value:"E1101",enumerable:!1,configurable:!0});case"cache":case"private-cache":case"unstable-cache":throw Object.defineProperty(new u.InvariantError("createServerParamsForServerSegment should not be called in cache contexts."),"__NEXT_ERROR_CODE",{value:"E743",enumerable:!1,configurable:!0});case"generate-static-params":throw Object.defineProperty(new u.InvariantError("createServerParamsForServerSegment should not be called inside generateStaticParams."),"__NEXT_ERROR_CODE",{value:"E1120",enumerable:!1,configurable:!0});case"prerender-runtime":return E(t,r,s,n,a);case"request":if(s.asyncApiPromises&&s.validationSamples)return function(t,r,n,a,o){let{createExhaustiveParamsProxy:i}=e.r(18450),s=i(t,new Set(Object.keys(n.params??{})),r.route);return(o?a.earlySharedParamsParent:a.sharedParamsParent).then(()=>s)}(t,i,s.validationSamples,s.asyncApiPromises,a);if(s.asyncApiPromises&&function(e,t){if(t){for(let r in e)if(t.has(r))return!0}return!1}(t,s.fallbackParams))return(a?s.asyncApiPromises.earlySharedParamsParent:s.asyncApiPromises.sharedParamsParent).then(()=>t);return S(t)}(0,c.throwInvariantForMissingStore)()}function _(e){let t=o.workAsyncStorage.getStore();if(!t)throw Object.defineProperty(new u.InvariantError("Missing workStore in createPrerenderParamsForClientSegment"),"__NEXT_ERROR_CODE",{value:"E773",enumerable:!1,configurable:!0});let r=c.workUnitAsyncStorage.getStore();if(r)switch(r.type){case"prerender":case"prerender-client":let n=r.fallbackRouteParams;if(n){for(let a in e)if(n.has(a))return(0,f.makeHangingPromise)(r.renderSignal,t.route,"`params`")}break;case"validation-client":throw Object.defineProperty(new u.InvariantError("createPrerenderParamsForClientSegment should not be called in validation contexts."),"__NEXT_ERROR_CODE",{value:"E1099",enumerable:!1,configurable:!0});case"cache":case"private-cache":case"unstable-cache":throw Object.defineProperty(new u.InvariantError("createPrerenderParamsForClientSegment should not be called in cache contexts."),"__NEXT_ERROR_CODE",{value:"E734",enumerable:!1,configurable:!0});case"generate-static-params":throw Object.defineProperty(new u.InvariantError("createPrerenderParamsForClientSegment should not be called inside generateStaticParams."),"__NEXT_ERROR_CODE",{value:"E1126",enumerable:!1,configurable:!0})}return Promise.resolve(e)}function v(e,t,r,n,a){let o=null!==a?(0,i.createVaryingParams)(a,e,t):e;switch(n.type){case"prerender":case"prerender-client":{let t=n.fallbackRouteParams;if(t){for(let a in e)if(t.has(a))return function(e,t,r){let n=R.get(e);if(n)return n;let a=new Proxy((0,f.makeHangingPromise)(r.renderSignal,t.route,"`params`"),w);return R.set(e,a),a}(o,r,n)}break}case"prerender-ppr":{let t=n.fallbackRouteParams;if(t){for(let a in e)if(t.has(a))return function(e,t,r,n){let a=R.get(e);if(a)return a;let o={...e},i=Promise.resolve(o);return R.set(e,i),Object.keys(e).forEach(e=>{d.wellKnownProperties.has(e)||t.has(e)&&Object.defineProperty(o,e,{get(){let t=(0,d.describeStringPropertyAccess)("params",e);"prerender-ppr"===n.type?(0,l.postponeWithTracking)(r.route,t,n.dynamicTracking):(0,l.throwToInterruptStaticGeneration)(t,r,n)},enumerable:!0})}),i}(o,t,r,n)}}}return S(o)}function E(e,t,r,n,a){let o=S(null!==n?(0,i.createVaryingParams)(n,e,t):e),{stagedRendering:s}=r;if(!s)return o;let l=a?h.RenderStage.EarlyRuntime:h.RenderStage.Runtime;return s.waitForStage(l).then(()=>o)}function O(t,r,n){let{createExhaustiveParamsProxy:a}=e.r(18450);return Promise.resolve(a(t,new Set(Object.keys((null==n?void 0:n.params)??{})),r.route))}let R=new WeakMap,w={get:function(e,t,r){if("then"===t||"catch"===t||"finally"===t){let n=s.ReflectAdapter.get(e,t,r);return({[t]:(...t)=>{let r=m.dynamicAccessAsyncStorage.getStore();return r&&r.abortController.abort(Object.defineProperty(Error("Accessed fallback `params` during prerendering."),"__NEXT_ERROR_CODE",{value:"E691",enumerable:!1,configurable:!0})),new Proxy(n.apply(e,t),w)}})[t]}return s.ReflectAdapter.get(e,t,r)}};function S(e){let t=R.get(e);if(t)return t;let r=Promise.resolve(e);return R.set(e,r),r}(0,p.createDedupedByCallsiteServerErrorLoggerDev)(function(e,t){let r=e?`Route "${e}" `:"This route ";return Object.defineProperty(Error(`${r}used ${t}. \`params\` is a Promise and must be unwrapped with \`await\` or \`React.use()\` before accessing its properties. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis`),"__NEXT_ERROR_CODE",{value:"E834",enumerable:!1,configurable:!0})})},47257,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ClientPageRoot",{enumerable:!0,get:function(){return l}});let n=e.r(43476),a=e.r(8372),o=e.r(71645),i=e.r(33906),s=e.r(61994);function l({Component:t,serverProvidedParams:r}){let c,u;if(null!==r)c=r.searchParams,u=r.params;else{let e=(0,o.use)(a.LayoutRouterContext);u=null!==e?e.parentParams:{},c=(0,i.urlSearchParamsToParsedUrlQuery)((0,o.use)(s.SearchParamsContext))}if("u"<typeof window){let r,a,{createSearchParamsFromClient:o}=e.r(69882);r=o(c);let{createParamsFromClient:i}=e.r(41489);return a=i(u),(0,n.jsx)(t,{params:a,searchParams:r})}{let{createRenderSearchParamsFromClient:r}=e.r(66996),a=r(c),{createRenderParamsFromClient:o}=e.r(97689),i=o(u);return(0,n.jsx)(t,{params:i,searchParams:a})}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},92825,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ClientSegmentRoot",{enumerable:!0,get:function(){return i}});let n=e.r(43476),a=e.r(8372),o=e.r(71645);function i({Component:t,slots:r,serverProvidedParams:s}){let l;if(null!==s)l=s.params;else{let e=(0,o.use)(a.LayoutRouterContext);l=null!==e?e.parentParams:{}}if("u"<typeof window){let{createParamsFromClient:a}=e.r(41489),o=a(l);return(0,n.jsx)(t,{...r,params:o})}{let{createRenderParamsFromClient:a}=e.r(97689),o=a(l);return(0,n.jsx)(t,{...r,params:o})}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},27201,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"IconMark",{enumerable:!0,get:function(){return a}});let n=e.r(43476),a=()=>"u">typeof window?null:(0,n.jsx)("meta",{name:"«nxt-icon»"})}]);
|
out/_next/static/chunks/1u8kf-cumb-f7.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,35451,(e,t,r)=>{var n={229:function(e){var t,r,n,o=e.exports={};function i(){throw Error("setTimeout has not been defined")}function u(){throw Error("clearTimeout has not been defined")}try{t="function"==typeof setTimeout?setTimeout:i}catch(e){t=i}try{r="function"==typeof clearTimeout?clearTimeout:u}catch(e){r=u}function s(e){if(t===setTimeout)return setTimeout(e,0);if((t===i||!t)&&setTimeout)return t=setTimeout,setTimeout(e,0);try{return t(e,0)}catch(r){try{return t.call(null,e,0)}catch(r){return t.call(this,e,0)}}}var a=[],c=!1,l=-1;function f(){c&&n&&(c=!1,n.length?a=n.concat(a):l=-1,a.length&&d())}function d(){if(!c){var e=s(f);c=!0;for(var t=a.length;t;){for(n=a,a=[];++l<t;)n&&n[l].run();l=-1,t=a.length}n=null,c=!1,function(e){if(r===clearTimeout)return clearTimeout(e);if((r===u||!r)&&clearTimeout)return r=clearTimeout,clearTimeout(e);try{r(e)}catch(t){try{return r.call(null,e)}catch(t){return r.call(this,e)}}}(e)}}function p(e,t){this.fun=e,this.array=t}function y(){}o.nextTick=function(e){var t=Array(arguments.length-1);if(arguments.length>1)for(var r=1;r<arguments.length;r++)t[r-1]=arguments[r];a.push(new p(e,t)),1!==a.length||c||s(d)},p.prototype.run=function(){this.fun.apply(null,this.array)},o.title="browser",o.browser=!0,o.env={},o.argv=[],o.version="",o.versions={},o.on=y,o.addListener=y,o.once=y,o.off=y,o.removeListener=y,o.removeAllListeners=y,o.emit=y,o.prependListener=y,o.prependOnceListener=y,o.listeners=function(e){return[]},o.binding=function(e){throw Error("process.binding is not supported")},o.cwd=function(){return"/"},o.chdir=function(e){throw Error("process.chdir is not supported")},o.umask=function(){return 0}}},o={};function i(e){var t=o[e];if(void 0!==t)return t.exports;var r=o[e]={exports:{}},u=!0;try{n[e](r,r.exports,i),u=!1}finally{u&&delete o[e]}return r.exports}i.ab="/ROOT/node_modules/next/dist/compiled/process/",t.exports=i(229)},47167,(e,t,r)=>{"use strict";var n,o;t.exports=(null==(n=e.g.process)?void 0:n.env)&&"object"==typeof(null==(o=e.g.process)?void 0:o.env)?e.g.process:e.r(35451)},45689,(e,t,r)=>{"use strict";var n=Symbol.for("react.transitional.element");function o(e,t,r){var o=null;if(void 0!==r&&(o=""+r),void 0!==t.key&&(o=""+t.key),"key"in t)for(var i in r={},t)"key"!==i&&(r[i]=t[i]);else r=t;return{$$typeof:n,type:e,key:o,ref:void 0!==(t=r.ref)?t:null,props:r}}r.Fragment=Symbol.for("react.fragment"),r.jsx=o,r.jsxs=o},43476,(e,t,r)=>{"use strict";t.exports=e.r(45689)},50740,(e,t,r)=>{"use strict";var n=e.i(47167),o=Symbol.for("react.transitional.element"),i=Symbol.for("react.portal"),u=Symbol.for("react.fragment"),s=Symbol.for("react.strict_mode"),a=Symbol.for("react.profiler"),c=Symbol.for("react.consumer"),l=Symbol.for("react.context"),f=Symbol.for("react.forward_ref"),d=Symbol.for("react.suspense"),p=Symbol.for("react.memo"),y=Symbol.for("react.lazy"),g=Symbol.for("react.activity"),h=Symbol.for("react.view_transition"),b=Symbol.iterator,v={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},m=Object.assign,_={};function x(e,t,r){this.props=e,this.context=t,this.refs=_,this.updater=r||v}function S(){}function O(e,t,r){this.props=e,this.context=t,this.refs=_,this.updater=r||v}x.prototype.isReactComponent={},x.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},x.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},S.prototype=x.prototype;var j=O.prototype=new S;j.constructor=O,m(j,x.prototype),j.isPureReactComponent=!0;var E=Array.isArray;function T(){}var w={H:null,A:null,T:null,S:null},R=Object.prototype.hasOwnProperty;function C(e,t,r){var n=r.ref;return{$$typeof:o,type:e,key:t,ref:void 0!==n?n:null,props:r}}function H(e){return"object"==typeof e&&null!==e&&e.$$typeof===o}var k=/\/+/g;function A(e,t){var r,n;return"object"==typeof e&&null!==e&&null!=e.key?(r=""+e.key,n={"=":"=0",":":"=2"},"$"+r.replace(/[=:]/g,function(e){return n[e]})):t.toString(36)}function P(e,t,r){if(null==e)return e;var n=[],u=0;return!function e(t,r,n,u,s){var a,c,l,f=typeof t;("undefined"===f||"boolean"===f)&&(t=null);var d=!1;if(null===t)d=!0;else switch(f){case"bigint":case"string":case"number":d=!0;break;case"object":switch(t.$$typeof){case o:case i:d=!0;break;case y:return e((d=t._init)(t._payload),r,n,u,s)}}if(d)return s=s(t),d=""===u?"."+A(t,0):u,E(s)?(n="",null!=d&&(n=d.replace(k,"$&/")+"/"),e(s,r,n,"",function(e){return e})):null!=s&&(H(s)&&(a=s,c=n+(null==s.key||t&&t.key===s.key?"":(""+s.key).replace(k,"$&/")+"/")+d,s=C(a.type,c,a.props)),r.push(s)),1;d=0;var p=""===u?".":u+":";if(E(t))for(var g=0;g<t.length;g++)f=p+A(u=t[g],g),d+=e(u,r,n,f,s);else if("function"==typeof(g=null===(l=t)||"object"!=typeof l?null:"function"==typeof(l=b&&l[b]||l["@@iterator"])?l:null))for(t=g.call(t),g=0;!(u=t.next()).done;)f=p+A(u=u.value,g++),d+=e(u,r,n,f,s);else if("object"===f){if("function"==typeof t.then)return e(function(e){switch(e.status){case"fulfilled":return e.value;case"rejected":throw e.reason;default:switch("string"==typeof e.status?e.then(T,T):(e.status="pending",e.then(function(t){"pending"===e.status&&(e.status="fulfilled",e.value=t)},function(t){"pending"===e.status&&(e.status="rejected",e.reason=t)})),e.status){case"fulfilled":return e.value;case"rejected":throw e.reason}}throw e}(t),r,n,u,s);throw Error("Objects are not valid as a React child (found: "+("[object Object]"===(r=String(t))?"object with keys {"+Object.keys(t).join(", ")+"}":r)+"). If you meant to render a collection of children, use an array instead.")}return d}(e,n,"","",function(e){return t.call(r,e,u++)}),n}function M(e){if(-1===e._status){var t=(0,e._result)();t.then(function(r){(0===e._status||-1===e._status)&&(e._status=1,e._result=r,void 0===t.status&&(t.status="fulfilled",t.value=r))},function(r){(0===e._status||-1===e._status)&&(e._status=2,e._result=r,void 0===t.status&&(t.status="rejected",t.reason=r))}),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var L="function"==typeof reportError?reportError:function(e){if("object"==typeof window&&"function"==typeof window.ErrorEvent){var t=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:"object"==typeof e&&null!==e&&"string"==typeof e.message?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if("object"==typeof n.default&&"function"==typeof n.default.emit)return void n.default.emit("uncaughtException",e);console.error(e)};function I(e){var t=w.T,r={};r.types=null!==t?t.types:null,w.T=r;try{var n=e(),o=w.S;null!==o&&o(r,n),"object"==typeof n&&null!==n&&"function"==typeof n.then&&n.then(T,L)}catch(e){L(e)}finally{null!==t&&null!==r.types&&(t.types=r.types),w.T=t}}function N(e){var t=w.T;if(null!==t){var r=t.types;null===r?t.types=[e]:-1===r.indexOf(e)&&r.push(e)}else I(N.bind(null,e))}r.Activity=g,r.Children={map:P,forEach:function(e,t,r){P(e,function(){t.apply(this,arguments)},r)},count:function(e){var t=0;return P(e,function(){t++}),t},toArray:function(e){return P(e,function(e){return e})||[]},only:function(e){if(!H(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},r.Component=x,r.Fragment=u,r.Profiler=a,r.PureComponent=O,r.StrictMode=s,r.Suspense=d,r.ViewTransition=h,r.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=w,r.__COMPILER_RUNTIME={__proto__:null,c:function(e){return w.H.useMemoCache(e)}},r.addTransitionType=N,r.cache=function(e){return function(){return e.apply(null,arguments)}},r.cacheSignal=function(){return null},r.cloneElement=function(e,t,r){if(null==e)throw Error("The argument must be a React element, but you passed "+e+".");var n=m({},e.props),o=e.key;if(null!=t)for(i in void 0!==t.key&&(o=""+t.key),t)R.call(t,i)&&"key"!==i&&"__self"!==i&&"__source"!==i&&("ref"!==i||void 0!==t.ref)&&(n[i]=t[i]);var i=arguments.length-2;if(1===i)n.children=r;else if(1<i){for(var u=Array(i),s=0;s<i;s++)u[s]=arguments[s+2];n.children=u}return C(e.type,o,n)},r.createContext=function(e){return(e={$$typeof:l,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null}).Provider=e,e.Consumer={$$typeof:c,_context:e},e},r.createElement=function(e,t,r){var n,o={},i=null;if(null!=t)for(n in void 0!==t.key&&(i=""+t.key),t)R.call(t,n)&&"key"!==n&&"__self"!==n&&"__source"!==n&&(o[n]=t[n]);var u=arguments.length-2;if(1===u)o.children=r;else if(1<u){for(var s=Array(u),a=0;a<u;a++)s[a]=arguments[a+2];o.children=s}if(e&&e.defaultProps)for(n in u=e.defaultProps)void 0===o[n]&&(o[n]=u[n]);return C(e,i,o)},r.createRef=function(){return{current:null}},r.forwardRef=function(e){return{$$typeof:f,render:e}},r.isValidElement=H,r.lazy=function(e){return{$$typeof:y,_payload:{_status:-1,_result:e},_init:M}},r.memo=function(e,t){return{$$typeof:p,type:e,compare:void 0===t?null:t}},r.startTransition=I,r.unstable_useCacheRefresh=function(){return w.H.useCacheRefresh()},r.use=function(e){return w.H.use(e)},r.useActionState=function(e,t,r){return w.H.useActionState(e,t,r)},r.useCallback=function(e,t){return w.H.useCallback(e,t)},r.useContext=function(e){return w.H.useContext(e)},r.useDebugValue=function(){},r.useDeferredValue=function(e,t){return w.H.useDeferredValue(e,t)},r.useEffect=function(e,t){return w.H.useEffect(e,t)},r.useEffectEvent=function(e){return w.H.useEffectEvent(e)},r.useId=function(){return w.H.useId()},r.useImperativeHandle=function(e,t,r){return w.H.useImperativeHandle(e,t,r)},r.useInsertionEffect=function(e,t){return w.H.useInsertionEffect(e,t)},r.useLayoutEffect=function(e,t){return w.H.useLayoutEffect(e,t)},r.useMemo=function(e,t){return w.H.useMemo(e,t)},r.useOptimistic=function(e,t){return w.H.useOptimistic(e,t)},r.useReducer=function(e,t,r){return w.H.useReducer(e,t,r)},r.useRef=function(e){return w.H.useRef(e)},r.useState=function(e){return w.H.useState(e)},r.useSyncExternalStore=function(e,t,r){return w.H.useSyncExternalStore(e,t,r)},r.useTransition=function(){return w.H.useTransition()},r.version="19.3.0-canary-3f0b9e61-20260317"},71645,(e,t,r)=>{"use strict";t.exports=e.r(50740)},18800,(e,t,r)=>{"use strict";var n=e.r(71645);function o(e){var t="https://react.dev/errors/"+e;if(1<arguments.length){t+="?args[]="+encodeURIComponent(arguments[1]);for(var r=2;r<arguments.length;r++)t+="&args[]="+encodeURIComponent(arguments[r])}return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function i(){}var u={d:{f:i,r:function(){throw Error(o(522))},D:i,C:i,L:i,m:i,X:i,S:i,M:i},p:0,findDOMNode:null},s=Symbol.for("react.portal"),a=Symbol.for("react.optimistic_key"),c=n.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function l(e,t){return"font"===e?"":"string"==typeof t?"use-credentials"===t?t:"":void 0}r.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=u,r.createPortal=function(e,t){var r=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!t||1!==t.nodeType&&9!==t.nodeType&&11!==t.nodeType)throw Error(o(299));return function(e,t,r){var n=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:s,key:null==n?null:n===a?a:""+n,children:e,containerInfo:t,implementation:r}}(e,t,null,r)},r.flushSync=function(e){var t=c.T,r=u.p;try{if(c.T=null,u.p=2,e)return e()}finally{c.T=t,u.p=r,u.d.f()}},r.preconnect=function(e,t){"string"==typeof e&&(t=t?"string"==typeof(t=t.crossOrigin)?"use-credentials"===t?t:"":void 0:null,u.d.C(e,t))},r.prefetchDNS=function(e){"string"==typeof e&&u.d.D(e)},r.preinit=function(e,t){if("string"==typeof e&&t&&"string"==typeof t.as){var r=t.as,n=l(r,t.crossOrigin),o="string"==typeof t.integrity?t.integrity:void 0,i="string"==typeof t.fetchPriority?t.fetchPriority:void 0;"style"===r?u.d.S(e,"string"==typeof t.precedence?t.precedence:void 0,{crossOrigin:n,integrity:o,fetchPriority:i}):"script"===r&&u.d.X(e,{crossOrigin:n,integrity:o,fetchPriority:i,nonce:"string"==typeof t.nonce?t.nonce:void 0})}},r.preinitModule=function(e,t){if("string"==typeof e)if("object"==typeof t&&null!==t){if(null==t.as||"script"===t.as){var r=l(t.as,t.crossOrigin);u.d.M(e,{crossOrigin:r,integrity:"string"==typeof t.integrity?t.integrity:void 0,nonce:"string"==typeof t.nonce?t.nonce:void 0})}}else null==t&&u.d.M(e)},r.preload=function(e,t){if("string"==typeof e&&"object"==typeof t&&null!==t&&"string"==typeof t.as){var r=t.as,n=l(r,t.crossOrigin);u.d.L(e,r,{crossOrigin:n,integrity:"string"==typeof t.integrity?t.integrity:void 0,nonce:"string"==typeof t.nonce?t.nonce:void 0,type:"string"==typeof t.type?t.type:void 0,fetchPriority:"string"==typeof t.fetchPriority?t.fetchPriority:void 0,referrerPolicy:"string"==typeof t.referrerPolicy?t.referrerPolicy:void 0,imageSrcSet:"string"==typeof t.imageSrcSet?t.imageSrcSet:void 0,imageSizes:"string"==typeof t.imageSizes?t.imageSizes:void 0,media:"string"==typeof t.media?t.media:void 0})}},r.preloadModule=function(e,t){if("string"==typeof e)if(t){var r=l(t.as,t.crossOrigin);u.d.m(e,{as:"string"==typeof t.as&&"script"!==t.as?t.as:void 0,crossOrigin:r,integrity:"string"==typeof t.integrity?t.integrity:void 0})}else u.d.m(e)},r.requestFormReset=function(e){u.d.r(e)},r.unstable_batchedUpdates=function(e,t){return e(t)},r.useFormState=function(e,t,r){return c.H.useFormState(e,t,r)},r.useFormStatus=function(){return c.H.useHostTransitionStatus()},r.version="19.3.0-canary-3f0b9e61-20260317"},74080,(e,t,r)=>{"use strict";!function e(){if("u">typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}}(),t.exports=e.r(18800)},55682,(e,t,r)=>{"use strict";r._=function(e){return e&&e.__esModule?e:{default:e}}},90317,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={bindSnapshot:function(){return c},createAsyncLocalStorage:function(){return a},createSnapshot:function(){return l}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let i=Object.defineProperty(Error("Invariant: AsyncLocalStorage accessed in runtime where it is not available"),"__NEXT_ERROR_CODE",{value:"E504",enumerable:!1,configurable:!0});class u{disable(){throw i}getStore(){}run(){throw i}exit(){throw i}enterWith(){throw i}static bind(e){return e}}let s="u">typeof globalThis&&globalThis.AsyncLocalStorage;function a(){return s?new s:new u}function c(e){return s?s.bind(e):u.bind(e)}function l(){return s?s.snapshot():function(e,...t){return e(...t)}}},42344,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"workAsyncStorageInstance",{enumerable:!0,get:function(){return n}});let n=(0,e.r(90317).createAsyncLocalStorage)()},63599,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"workAsyncStorage",{enumerable:!0,get:function(){return n.workAsyncStorageInstance}});let n=e.r(42344)},12354,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"handleISRError",{enumerable:!0,get:function(){return o}});let n="u"<typeof window?e.r(63599).workAsyncStorage:void 0;function o({error:e}){if(n){let t=n.getStore();if(t?.isStaticGeneration)throw e&&console.error(e),e}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},18576,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={WarningIcon:function(){return a},errorStyles:function(){return u},errorThemeCss:function(){return s}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});e.r(55682);let i=e.r(43476);e.r(71645);let u={container:{fontFamily:'system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"',height:"100vh",display:"flex",alignItems:"center",justifyContent:"center"},card:{marginTop:"-32px",maxWidth:"325px",padding:"32px 28px",textAlign:"left"},icon:{marginBottom:"24px"},title:{fontSize:"24px",fontWeight:500,letterSpacing:"-0.02em",lineHeight:"32px",margin:"0 0 12px 0",color:"var(--next-error-title)"},message:{fontSize:"14px",fontWeight:400,lineHeight:"21px",margin:"0 0 20px 0",color:"var(--next-error-message)"},form:{margin:0},buttonGroup:{display:"flex",gap:"8px",alignItems:"center"},button:{display:"inline-flex",alignItems:"center",justifyContent:"center",height:"32px",padding:"0 12px",fontSize:"14px",fontWeight:500,lineHeight:"20px",borderRadius:"6px",cursor:"pointer",color:"var(--next-error-btn-text)",background:"var(--next-error-btn-bg)",border:"var(--next-error-btn-border)"},buttonSecondary:{display:"inline-flex",alignItems:"center",justifyContent:"center",height:"32px",padding:"0 12px",fontSize:"14px",fontWeight:500,lineHeight:"20px",borderRadius:"6px",cursor:"pointer",color:"var(--next-error-btn-secondary-text)",background:"var(--next-error-btn-secondary-bg)",border:"var(--next-error-btn-secondary-border)"},digestFooter:{position:"fixed",bottom:"32px",left:"0",right:"0",textAlign:"center",fontFamily:'ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace',fontSize:"12px",lineHeight:"18px",fontWeight:400,margin:"0",color:"var(--next-error-digest)"}},s=`
|
| 2 |
+
:root {
|
| 3 |
+
--next-error-bg: #fff;
|
| 4 |
+
--next-error-text: #171717;
|
| 5 |
+
--next-error-title: #171717;
|
| 6 |
+
--next-error-message: #171717;
|
| 7 |
+
--next-error-digest: #666666;
|
| 8 |
+
--next-error-btn-text: #fff;
|
| 9 |
+
--next-error-btn-bg: #171717;
|
| 10 |
+
--next-error-btn-border: none;
|
| 11 |
+
--next-error-btn-secondary-text: #171717;
|
| 12 |
+
--next-error-btn-secondary-bg: transparent;
|
| 13 |
+
--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);
|
| 14 |
+
}
|
| 15 |
+
@media (prefers-color-scheme: dark) {
|
| 16 |
+
:root {
|
| 17 |
+
--next-error-bg: #0a0a0a;
|
| 18 |
+
--next-error-text: #ededed;
|
| 19 |
+
--next-error-title: #ededed;
|
| 20 |
+
--next-error-message: #ededed;
|
| 21 |
+
--next-error-digest: #a0a0a0;
|
| 22 |
+
--next-error-btn-text: #0a0a0a;
|
| 23 |
+
--next-error-btn-bg: #ededed;
|
| 24 |
+
--next-error-btn-border: none;
|
| 25 |
+
--next-error-btn-secondary-text: #ededed;
|
| 26 |
+
--next-error-btn-secondary-bg: transparent;
|
| 27 |
+
--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);
|
| 28 |
+
}
|
| 29 |
+
}
|
| 30 |
+
body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }
|
| 31 |
+
`.replace(/\n\s*/g,"");function a(){return(0,i.jsx)("svg",{width:"32",height:"32",viewBox:"-0.2 -1.5 32 32",fill:"none",style:u.icon,children:(0,i.jsx)("path",{d:"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z",fill:"var(--next-error-title)"})})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},68027,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"default",{enumerable:!0,get:function(){return u}}),e.r(55682);let n=e.r(43476);e.r(71645);let o=e.r(12354),i=e.r(18576),u=function({error:e}){let t=e?.digest,r=!!t;return(0,o.handleISRError)({error:e}),(0,n.jsxs)("html",{id:"__next_error__",children:[(0,n.jsx)("head",{children:(0,n.jsx)("style",{dangerouslySetInnerHTML:{__html:i.errorThemeCss}})}),(0,n.jsxs)("body",{children:[(0,n.jsx)("div",{style:i.errorStyles.container,children:(0,n.jsxs)("div",{style:i.errorStyles.card,children:[(0,n.jsx)(i.WarningIcon,{}),(0,n.jsx)("h1",{style:i.errorStyles.title,children:"This page couldn’t load"}),(0,n.jsx)("p",{style:i.errorStyles.message,children:r?"A server error occurred. Reload to try again.":"Reload to try again, or go back."}),(0,n.jsxs)("div",{style:i.errorStyles.buttonGroup,children:[(0,n.jsx)("form",{style:i.errorStyles.form,children:(0,n.jsx)("button",{type:"submit",style:i.errorStyles.button,children:"Reload"})}),!r&&(0,n.jsx)("button",{type:"button",style:i.errorStyles.buttonSecondary,onClick:()=>{window.history.length>1?window.history.back():window.location.href="/"},children:"Back"})]})]})}),t&&(0,n.jsxs)("p",{style:i.errorStyles.digestFooter,children:["ERROR ",t]})]})]})};("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)}]);
|
out/_next/static/chunks/2dkoocrktt9k-.js
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
out/_next/static/chunks/2fc-6082kgcrk.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,31713,e=>{"use strict";var t,r,n,a,i,l=e.i(43476),o=e.i(71645),s=e.i(73404),u=e.i(77193),d=e.i(69625),c=e.i(82451),m=e.i(24848),h=e.i(43798),f=e.i(15259),v=e.i(89549),p=e.i(14037),g=e.i(21879),x=e.i(44662),b=e.i(25436),S={root:"m_fea6bf1a",burger:"m_d4fb9cad"};let j=(0,h.createVarsResolver)((e,{color:t,size:r,lineSize:n,transitionDuration:a,transitionTimingFunction:i})=>({root:{"--burger-color":t?(0,f.getThemeColor)(t,e):void 0,"--burger-size":(0,m.getSize)(r,"burger-size"),"--burger-line-size":n?(0,c.rem)(n):void 0,"--burger-transition-duration":void 0===a?void 0:`${a}ms`,"--burger-transition-timing-function":i}})),y=(0,g.factory)(e=>{let t=(0,v.useProps)("Burger",null,e),{classNames:r,className:n,style:a,styles:i,unstyled:o,vars:s,opened:u,children:d,transitionDuration:c,transitionTimingFunction:m,lineSize:h,attributes:f,...g}=t,y=(0,p.useStyles)({name:"Burger",classes:S,props:t,className:n,style:a,classNames:r,styles:i,unstyled:o,attributes:f,vars:s,varsResolver:j});return(0,l.jsxs)(b.UnstyledButton,{...y("root"),...g,children:[(0,l.jsx)(x.Box,{mod:["reduce-motion",{opened:u}],...y("burger")}),d]})});y.classes=S,y.varsResolver=j,y.displayName="@mantine/core/Burger";var w=e.i(33372),T=e.i(51501),k=e.i(98323),C=e.i(653),N=e.i(59729),E=e.i(84660);let[_,B]=(0,E.createSafeContext)("Grid component was not found in tree");var z={container:"m_8478a6da",root:"m_410352e9",inner:"m_dee7bd2f",col:"m_96bdd299"},R=e.i(45981),I=e.i(87725),M=e.i(85675),V=e.i(57678),D=e.i(22442),A=e.i(99818);let L=(e,t)=>"content"===e?"auto":"auto"===e?"0rem":e?e===t?"100%":`calc(${100*e/t}% - ${(t-e)/t} * var(--grid-column-gap))`:void 0,O=(e,t,r)=>r||"auto"===e?"100%":"content"===e?"unset":L(e,t),F=(e,t)=>{if(e)return"auto"===e||t?"1":"auto"},P=(e,t)=>0===e?"0":e?`calc(${100*e/t}% + ${e/t} * var(--grid-column-gap))`:void 0;function $({span:e,order:t,offset:r,align:n,selector:a}){let i=(0,D.useMantineTheme)(),o=B(),s=o.breakpoints||i.breakpoints,u=(0,V.getBaseValue)(e),d=void 0===u?12:u,c=(0,I.filterProps)({"--col-order":(0,V.getBaseValue)(t)?.toString(),"--col-flex-grow":F(d,o.grow),"--col-flex-basis":L(d,o.columns),"--col-width":"content"===d?"auto":void 0,"--col-max-width":O(d,o.columns,o.grow),"--col-offset":P((0,V.getBaseValue)(r),o.columns),"--col-align-self":(0,V.getBaseValue)(n)}),m=(0,R.keys)(s).reduce((a,i)=>(a[i]||(a[i]={}),"object"==typeof t&&void 0!==t[i]&&(a[i]["--col-order"]=t[i]?.toString()),"object"==typeof e&&void 0!==e[i]&&(a[i]["--col-flex-grow"]=F(e[i],o.grow),a[i]["--col-flex-basis"]=L(e[i],o.columns),a[i]["--col-width"]="content"===e[i]?"auto":void 0,a[i]["--col-max-width"]=O(e[i],o.columns,o.grow)),"object"==typeof r&&void 0!==r[i]&&(a[i]["--col-offset"]=P(r[i],o.columns)),"object"==typeof n&&void 0!==n[i]&&(a[i]["--col-align-self"]=n[i]),a),{}),h=(0,M.getSortedBreakpoints)((0,R.keys)(m),s).filter(e=>(0,R.keys)(m[e.value]).length>0).map(e=>({query:"container"===o.type?`mantine-grid (min-width: ${s[e.value]})`:`(min-width: ${s[e.value]})`,styles:m[e.value]}));return(0,l.jsx)(A.InlineStyles,{styles:c,media:"container"===o.type?void 0:h,container:"container"===o.type?h:void 0,selector:a})}var G=e.i(7670);let W={span:12},U=(0,g.factory)(e=>{let{classNames:t,className:r,style:n,styles:a,vars:i,span:o,order:s,offset:u,align:d,...c}=(0,v.useProps)("GridCol",W,e),m=B(),h=(0,N.useRandomClassName)();return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)($,{selector:`.${h}`,span:o,order:s,offset:u,align:d}),(0,l.jsx)(x.Box,{...m.getStyles("col",{className:(0,G.default)(r,h),style:n,classNames:t,styles:a}),...c})]})});function K({gap:e,rowGap:t,columnGap:r,selector:n,breakpoints:a,type:i}){let o=(0,D.useMantineTheme)(),s=a||o.breakpoints,u=(0,I.filterProps)({"--grid-gap":(0,m.getSpacing)((0,V.getBaseValue)(e)),"--grid-row-gap":(0,m.getSpacing)((0,V.getBaseValue)(t)),"--grid-column-gap":(0,m.getSpacing)((0,V.getBaseValue)(r))}),d=(0,R.keys)(s).reduce((n,a)=>(n[a]||(n[a]={}),"object"==typeof e&&void 0!==e[a]&&(n[a]["--grid-gap"]=(0,m.getSpacing)(e[a])),"object"==typeof t&&void 0!==t[a]&&(n[a]["--grid-row-gap"]=(0,m.getSpacing)(t[a])),"object"==typeof r&&void 0!==r[a]&&(n[a]["--grid-column-gap"]=(0,m.getSpacing)(r[a])),n),{}),c=(0,M.getSortedBreakpoints)((0,R.keys)(d),s).filter(e=>(0,R.keys)(d[e.value]).length>0).map(e=>({query:"container"===i?`mantine-grid (min-width: ${s[e.value]})`:`(min-width: ${s[e.value]})`,styles:d[e.value]}));return(0,l.jsx)(A.InlineStyles,{styles:u,media:"container"===i?void 0:c,container:"container"===i?c:void 0,selector:n})}U.classes=z,U.displayName="@mantine/core/GridCol";let H={gap:"md",columns:12},X=(0,h.createVarsResolver)((e,{justify:t,align:r,overflow:n})=>({root:{"--grid-justify":t,"--grid-align":r,"--grid-overflow":n}})),q=(0,g.factory)(e=>{let t=(0,v.useProps)("Grid",H,e),{classNames:r,className:n,style:a,styles:i,unstyled:o,vars:s,grow:u,gap:d,rowGap:c,columnGap:m,columns:h,align:f,justify:g,children:b,breakpoints:S,type:j,attributes:y,...w}=t,T=(0,p.useStyles)({name:"Grid",classes:z,props:t,className:n,style:a,classNames:r,styles:i,unstyled:o,attributes:y,vars:s,varsResolver:X}),k=(0,N.useRandomClassName)();return"container"===j&&S?(0,l.jsxs)(_,{value:{getStyles:T,grow:u,columns:h,breakpoints:S,type:j},children:[(0,l.jsx)(K,{selector:`.${k}`,...t}),(0,l.jsx)("div",{...T("container"),children:(0,l.jsx)(x.Box,{...T("root",{className:k}),...w,children:(0,l.jsx)("div",{...T("inner"),children:b})})})]}):(0,l.jsxs)(_,{value:{getStyles:T,grow:u,columns:h,breakpoints:S,type:j},children:[(0,l.jsx)(K,{selector:`.${k}`,...t}),(0,l.jsx)(x.Box,{...T("root",{className:k}),...w,children:(0,l.jsx)("div",{...T("inner"),children:b})})]})});q.classes=z,q.varsResolver=X,q.displayName="@mantine/core/Grid",q.Col=U;var Z=e.i(26200),J=e.i(29277),Y=e.i(44762),Q=e.i(8954),ee=e.i(78565);function et({direction:e,style:t,...r}){return(0,l.jsx)("svg",{style:{width:"var(--ni-chevron-size)",height:"var(--ni-chevron-size)",transform:"up"===e?"rotate(180deg)":void 0,...t},viewBox:"0 0 15 15",fill:"none",xmlns:"http://www.w3.org/2000/svg",...r,children:(0,l.jsx)("path",{d:"M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z",fill:"currentColor",fillRule:"evenodd",clipRule:"evenodd"})})}var er={root:"m_e2f5cd4e",controls:"m_95e17d22",control:"m_80b4b171"},en=e.i(31316);function ea(e,t,r){return void 0===t&&void 0===r?e:void 0!==t&&void 0===r?Math.max(e,t):void 0===t&&void 0!==r?Math.min(e,r):Math.min(Math.max(e,t),r)}var ei=e.i(46614);function el(e,t){var r={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&0>t.indexOf(n)&&(r[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var a=0,n=Object.getOwnPropertySymbols(e);a<n.length;a++)0>t.indexOf(n[a])&&Object.prototype.propertyIsEnumerable.call(e,n[a])&&(r[n[a]]=e[n[a]]);return r}function eo(){}function es(e){return!!(e||"").match(/\d/)}function eu(e){return null==e}function ed(e){return eu(e)||"number"==typeof e&&isNaN(e)||"number"==typeof e&&!isFinite(e)}function ec(e){return e.replace(/[-[\]/{}()*+?.\\^$|]/g,"\\$&")}function em(e){var t=(0,o.useRef)(e);return t.current=e,(0,o.useRef)(function(){for(var e=[],r=arguments.length;r--;)e[r]=arguments[r];return t.current.apply(t,e)}).current}function eh(e,t){void 0===t&&(t=!0);var r="-"===e[0],n=r&&t,a=(e=e.replace("-","")).split(".");return{beforeDecimal:a[0],afterDecimal:a[1]||"",hasNegation:r,addNegation:n}}function ef(e,t,r){for(var n="",a=r?"0":"",i=0;i<=t-1;i++)n+=e[i]||a;return n}function ev(e,t){return Array(t+1).join(e)}function ep(e){var t=e+"",r="-"===t[0]?"-":"";r&&(t=t.substring(1));var n=t.split(/[eE]/g),a=n[0],i=n[1];if(!(i=Number(i)))return r+a;a=a.replace(".","");var l=1+i,o=a.length;return l<0?a="0."+ev("0",Math.abs(l))+a:l>=o?a+=ev("0",l-o):a=(a.substring(0,l)||"0")+"."+a.substring(l),r+a}function eg(e,t,r){if(-1!==["","-"].indexOf(e))return e;var n=(-1!==e.indexOf(".")||r)&&t,a=eh(e),i=a.beforeDecimal,l=a.afterDecimal,o=a.hasNegation,s=parseFloat("0."+(l||"0")),u=(l.length<=t?"0."+l:s.toFixed(t)).split("."),d=i;return i&&Number(u[0])&&(d=i.split("").reverse().reduce(function(e,t,r){return e.length>r?(Number(e[0])+Number(t)).toString()+e.substring(1,e.length):t+e},u[0])),(o?"-":"")+d+(n?".":"")+ef(u[1]||"",t,r)}function ex(e,t){if(e.value=e.value,null!==e){if(e.createTextRange){var r=e.createTextRange();return r.move("character",t),r.select(),!0}return e.selectionStart||0===e.selectionStart?(e.focus(),e.setSelectionRange(t,t),!0):(e.focus(),!1)}}(t=i||(i={})).event="event",t.props="prop";var eb=(r=function(e,t){for(var r=0,n=0,a=e.length,i=t.length;e[r]===t[r]&&r<a;)r++;for(;e[a-1-n]===t[i-1-n]&&i-n>r&&a-n>r;)n++;return{from:{start:r,end:a-n},to:{start:r,end:i-n}}},a=void 0,function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return n&&e.length===n.length&&e.every(function(e,t){return e===n[t]})?a:(n=e,a=r.apply(void 0,e))}),eS=function(e,t){var r=Math.min(e.selectionStart,t);return{from:{start:r,end:e.selectionEnd},to:{start:r,end:t}}};function ej(e){return Math.max(e.selectionStart,e.selectionEnd)}function ey(e){var t=e.currentValue,r=e.formattedValue,n=e.currentValueIndex,a=e.formattedValueIndex;return t[n]===r[a]}function ew(e,t,r,n){var a=e.length;if(t=Math.min(Math.max(t,0),a),"left"===n){for(;t>=0&&!r[t];)t--;-1===t&&(t=r.indexOf(!0))}else{for(;t<=a&&!r[t];)t++;t>a&&(t=r.lastIndexOf(!0))}return -1===t&&(t=a),t}function eT(e){for(var t=Array.from({length:e.length+1}).map(function(){return!0}),r=0,n=t.length;r<n;r++)t[r]=!!(es(e[r])||es(e[r-1]));return t}function ek(e,t,r,n,a,l){void 0===l&&(l=eo);var s=em(function(e,t){var r,i;return ed(e)?(i="",r=""):r="number"==typeof e||t?n(i="number"==typeof e?ep(e):e):n(i=a(e,void 0)),{formattedValue:r,numAsString:i}}),u=(0,o.useState)(function(){return s(eu(e)?t:e,r)}),d=u[0],c=u[1],m=em(function(e,t){e.formattedValue!==d.formattedValue&&c({formattedValue:e.formattedValue,numAsString:e.value}),l(e,t)}),h=e,f=r;eu(e)&&(h=d.numAsString,f=!0);var v=s(h,f);return(0,o.useMemo)(function(){c(v)},[v.formattedValue]),(0,o.useEffect)(function(){if(!eu(t)&&eu(e)&&""!==d.formattedValue){var r=parseFloat(d.numAsString);m({formattedValue:d.formattedValue,value:d.numAsString,floatValue:isNaN(r)?void 0:r},{event:void 0,source:i.props})}},[]),[d,m]}function eC(e){return e.replace(/[^0-9]/g,"")}function eN(e){return e}function eE(e){var t=e.type;void 0===t&&(t="text");var r=e.displayType;void 0===r&&(r="input");var n=e.customInput,a=e.renderText,l=e.getInputRef,s=e.format;void 0===s&&(s=eN);var u=e.removeFormatting;void 0===u&&(u=eC);var d=e.defaultValue,c=e.valueIsNumericString,m=e.onValueChange,h=e.isAllowed,f=e.onChange;void 0===f&&(f=eo);var v=e.onKeyDown;void 0===v&&(v=eo);var p=e.onMouseUp;void 0===p&&(p=eo);var g=e.onFocus;void 0===g&&(g=eo);var x=e.onBlur;void 0===x&&(x=eo);var b=e.value,S=e.getCaretBoundary;void 0===S&&(S=eT);var j=e.isValidInputCharacter;void 0===j&&(j=es);var y=e.isCharacterSame,w=el(e,["type","displayType","customInput","renderText","getInputRef","format","removeFormatting","defaultValue","valueIsNumericString","onValueChange","isAllowed","onChange","onKeyDown","onMouseUp","onFocus","onBlur","value","getCaretBoundary","isValidInputCharacter","isCharacterSame"]),T=ek(b,d,!!c,s,u,m),k=T[0],C=k.formattedValue,N=k.numAsString,E=T[1],_=(0,o.useRef)(),B=(0,o.useRef)({formattedValue:C,numAsString:N}),z=function(e,t){B.current={formattedValue:e.formattedValue,numAsString:e.value},E(e,t)},R=(0,o.useState)(!1),I=R[0],M=R[1],V=(0,o.useRef)(null),D=(0,o.useRef)({setCaretTimeout:null,focusTimeout:null});(0,o.useEffect)(function(){return M(!0),function(){clearTimeout(D.current.setCaretTimeout),clearTimeout(D.current.focusTimeout)}},[]);var A=s,L=function(e,t){var r=parseFloat(t);return{formattedValue:e,value:t,floatValue:isNaN(r)?void 0:r}},O=function(e,t,r){(0!==e.selectionStart||e.selectionEnd!==e.value.length)&&(ex(e,t),D.current.setCaretTimeout=setTimeout(function(){e.value===r&&e.selectionStart!==t&&ex(e,t)},0))},F=function(e,t,r){return ew(e,t,S(e),r)},P=function(e,t,r){var n=S(t),a=function(e,t,r,n,a,i,l){void 0===l&&(l=ey);var o=a.findIndex(function(e){return e}),s=e.slice(0,o);t||r.startsWith(s)||(t=s,r=s+r,n+=s.length);for(var u=r.length,d=e.length,c={},m=Array(u),h=0;h<u;h++){m[h]=-1;for(var f=0;f<d;f++)if(l({currentValue:r,lastValue:t,formattedValue:e,currentValueIndex:h,formattedValueIndex:f})&&!0!==c[f]){m[h]=f,c[f]=!0;break}}for(var v=n;v<u&&(-1===m[v]||!i(r[v]));)v++;var p=v===u||-1===m[v]?d:m[v];for(v=n-1;v>0&&-1===m[v];)v--;var g=-1===v||-1===m[v]?0:m[v]+1;return g>p?p:n-g<p-n?g:p}(t,C,e,r,n,j,y);return ew(t,a,n)},$=function(e){var t,r=e.formattedValue;void 0===r&&(r="");var n=e.input,a=e.source,i=e.event,l=e.numAsString;if(n){var o=e.inputValue||n.value,s=ej(n);n.value=r,void 0!==(t=P(o,r,s))&&O(n,t,r)}r!==C&&z(L(r,l),{event:i,source:a})};(0,o.useEffect)(function(){var e=B.current,t=e.formattedValue,r=e.numAsString;(C!==t||N!==r)&&z(L(C,N),{event:void 0,source:i.props})},[C,N]);var G=V.current?ej(V.current):void 0;("u">typeof window?o.useLayoutEffect:o.useEffect)(function(){var e=V.current;if(C!==B.current.formattedValue&&e){var t=P(B.current.formattedValue,C,G);e.value=C,O(e,t,C)}},[C]);var W=function(e,t,r){var n=t.target,a=Object.assign(Object.assign({},_.current?eS(_.current,n.selectionEnd):eb(C,e)),{lastValue:C}),i=u(e,a),l=A(i);if(i=u(l,void 0),h&&!h(L(l,i))){var o=t.target,s=P(e,C,ej(o));return o.value=C,O(o,s,C),!1}return $({formattedValue:l,numAsString:i,inputValue:e,event:t,source:r,input:t.target}),!0},U=function(e,t){void 0===t&&(t=0),_.current={selectionStart:e.selectionStart,selectionEnd:e.selectionEnd+t}},K=Object.assign({inputMode:I&&"u">typeof navigator&&!(navigator.platform&&/iPhone|iPod/.test(navigator.platform))?"numeric":void 0},w,{type:t,value:C,onChange:function(e){W(e.target.value,e,i.event)&&f(e),_.current=void 0},onKeyDown:function(e){var t,r=e.target,n=e.key,a=r.selectionStart,i=r.selectionEnd,l=r.value;void 0===l&&(l=""),"ArrowLeft"===n||"Backspace"===n?t=Math.max(a-1,0):"ArrowRight"===n?t=Math.min(a+1,l.length):"Delete"===n&&(t=a);var o=0;"Delete"===n&&a===i&&(o=1);var s="ArrowLeft"===n||"ArrowRight"===n;if(void 0===t||a!==i&&!s){v(e),U(r,o);return}var u=t;s?(u=F(l,t,"ArrowLeft"===n?"left":"right"))!==t&&e.preventDefault():"Delete"!==n||j(l[t])?"Backspace"!==n||j(l[t])||(u=F(l,t,"left")):u=F(l,t,"right"),u!==t&&O(r,u,l),v(e),U(r,o)},onMouseUp:function(e){var t=e.target,r=function(){var e=t.selectionStart,r=t.selectionEnd,n=t.value;if(void 0===n&&(n=""),e===r){var a=F(n,e);a!==e&&O(t,a,n)}};r(),requestAnimationFrame(function(){r()}),p(e),U(t)},onFocus:function(e){e.persist&&e.persist();var t=e.target,r=e.currentTarget;V.current=t,D.current.focusTimeout=setTimeout(function(){var n=t.selectionStart,a=t.selectionEnd,i=t.value;void 0===i&&(i="");var l=F(i,n);l!==n&&(0!==n||a!==i.length)&&O(t,l,i),g(Object.assign(Object.assign({},e),{currentTarget:r}))},0)},onBlur:function(e){V.current=null,clearTimeout(D.current.focusTimeout),clearTimeout(D.current.setCaretTimeout),x(e)}});return"text"===r?a?o.default.createElement(o.default.Fragment,null,a(C,w)||null):o.default.createElement("span",Object.assign({},w,{ref:l}),C):n?o.default.createElement(n,Object.assign({},K,{ref:l})):o.default.createElement("input",Object.assign({},K,{ref:l}))}function e_(e,t){var r,n,a,i=t.decimalScale,l=t.fixedDecimalScale,o=t.prefix;void 0===o&&(o="");var s=t.suffix;void 0===s&&(s="");var u=t.allowNegative,d=t.thousandsGroupStyle;if(void 0===d&&(d="thousand"),""===e||"-"===e)return e;var c=eB(t),m=c.thousandSeparator,h=c.decimalSeparator,f=0!==i&&-1!==e.indexOf(".")||i&&l,v=eh(e,u),p=v.beforeDecimal,g=v.afterDecimal,x=v.addNegation;return void 0!==i&&(g=ef(g,i,!!l)),m&&(r=p,n=function(e){switch(e){case"lakh":return/(\d+?)(?=(\d\d)+(\d)(?!\d))(\.\d+)?/g;case"wan":return/(\d)(?=(\d{4})+(?!\d))/g;default:return/(\d)(?=(\d{3})+(?!\d))/g}}(d),a=-1===(a=r.search(/[1-9]/))?r.length:a,p=r.substring(0,a)+r.substring(a,r.length).replace(n,"$1"+m)),o&&(p=o+p),s&&(g+=s),x&&(p="-"+p),e=p+(f&&h||"")+g}function eB(e){var t=e.decimalSeparator;void 0===t&&(t=".");var r=e.thousandSeparator,n=e.allowedDecimalSeparators;return!0===r&&(r=","),n||(n=[t,"."]),{decimalSeparator:t,thousandSeparator:r,allowedDecimalSeparators:n}}function ez(e){var t,r,n,a,l,s,u,d,c,m,h,f,v,p,g,x,b,S,j,y,w,T,k,C,N,E,_,B,z,R=((t=function(e){var t=eB(e),r=t.thousandSeparator,n=t.decimalSeparator,a=e.prefix;void 0===a&&(a="");var i=e.allowNegative;if(void 0===i&&(i=!0),r===n)throw Error("\n Decimal separator can't be same as thousand separator.\n thousandSeparator: "+r+' (thousandSeparator = {true} is same as thousandSeparator = ",")\n decimalSeparator: '+n+" (default value for decimalSeparator is .)\n ");return a.startsWith("-")&&i&&(console.error("\n Prefix can't start with '-' when allowNegative is true.\n prefix: "+a+"\n allowNegative: "+i+"\n "),i=!1),Object.assign(Object.assign({},e),{allowNegative:i})}(t=e)).decimalSeparator,t.allowedDecimalSeparators,t.thousandsGroupStyle,r=t.suffix,n=t.allowNegative,a=t.allowLeadingZeros,void 0===(l=t.onKeyDown)&&(l=eo),void 0===(s=t.onBlur)&&(s=eo),u=t.thousandSeparator,d=t.decimalScale,c=t.fixedDecimalScale,void 0===(m=t.prefix)&&(m=""),h=t.defaultValue,f=t.value,v=t.valueIsNumericString,p=t.onValueChange,g=el(t,["decimalSeparator","allowedDecimalSeparators","thousandsGroupStyle","suffix","allowNegative","allowLeadingZeros","onKeyDown","onBlur","thousandSeparator","decimalScale","fixedDecimalScale","prefix","defaultValue","value","valueIsNumericString","onValueChange"]),b=(x=eB(t)).decimalSeparator,S=x.allowedDecimalSeparators,j=function(e){return e_(e,t)},y=function(e,r){return function(e,t,r){void 0===t&&(t={from:{start:0,end:0},to:{start:0,end:e.length},lastValue:""});var n,a,i,l,o=r.allowNegative,s=r.prefix;void 0===s&&(s="");var u=r.suffix;void 0===u&&(u="");var d=r.decimalScale,c=t.from,m=t.to,h=m.start,f=m.end,v=eB(r),p=v.allowedDecimalSeparators,g=v.decimalSeparator,x=e[f]===g;if(es(e)&&(e===s||e===u)&&""===t.lastValue)return e;if(f-h==1&&-1!==p.indexOf(e[h])){var b=0===d?"":g;e=e.substring(0,h)+b+e.substring(h+1,e.length)}var S=function(e,t,r){var n=!1,a=!1;s.startsWith("-")?n=!1:e.startsWith("--")?(n=!1,a=!0):u.startsWith("-")&&e.length===u.length?n=!1:"-"===e[0]&&(n=!0);var i=+!!n;return a&&(i=2),i&&(e=e.substring(i),t-=i,r-=i),{value:e,start:t,end:r,hasNegation:n}},j=S(e,h,f),y=j.hasNegation;e=j.value,h=j.start,f=j.end;var w=S(t.lastValue,c.start,c.end),T=w.start,k=w.end,C=w.value,N=e.substring(h,f);e.length&&C.length&&(T>C.length-u.length||k<s.length)&&!(N&&u.startsWith(N))&&(e=C);var E=0;e.startsWith(s)?E+=s.length:h<s.length&&(E=h),e=e.substring(E),f-=E;var _=e.length,B=e.length-u.length;e.endsWith(u)?_=B:f>B?_=f:f>e.length-u.length&&(_=f),e=e.substring(0,_),void 0===(n=y?"-"+e:e)&&(n=""),a=RegExp("(-)(.)*(-)"),i=/(-)/.test(n),l=a.test(n),n=n.replace(/-/g,""),i&&!l&&o&&(n="-"+n);var z=(e=((e=n).match(RegExp("(^-)|[0-9]|"+ec(g),"g"))||[]).join("")).indexOf(g),R=eh(e=e.replace(RegExp(ec(g),"g"),function(e,t){return t===z?".":""}),o),I=R.beforeDecimal,M=R.afterDecimal,V=R.addNegation;return m.end-m.start<c.end-c.start&&""===I&&x&&!parseFloat(M)&&(e=V?"-":""),e}(e,r,t)},w=eu(f)?h:f,k=null!=v?v:(T=m,""===w||!(null==T?void 0:T.match(/\d/))&&!(null==r?void 0:r.match(/\d/))&&"string"==typeof w&&!isNaN(Number(w))),eu(f)?eu(h)||(k=k||"number"==typeof h):k=k||"number"==typeof f,_=(E=(N=ek((C=function(e){return ed(e)?e:("number"==typeof e&&(e=ep(e)),k&&"number"==typeof d)?eg(e,d,!!c):e})(f),C(h),!!k,j,y,p))[0]).numAsString,B=E.formattedValue,z=N[1],Object.assign(Object.assign({},g),{value:B,valueIsNumericString:!1,isValidInputCharacter:function(e){return e===b||es(e)},isCharacterSame:function(e){var t=e.currentValue,r=e.lastValue,n=e.formattedValue,a=e.currentValueIndex,i=e.formattedValueIndex,l=t[a],o=n[i],s=eb(r,t).to,u=function(e){return y(e).indexOf(".")+m.length};return!(0===f&&c&&d&&t[s.start]===b&&u(t)<a&&u(n)>i)&&(!!(a>=s.start&&a<s.end&&S&&S.includes(l))&&o===b||l===o)},onValueChange:z,format:j,removeFormatting:y,getCaretBoundary:function(e){var r,n,a,i,l,o;return void 0===(n=(r=t).prefix)&&(n=""),void 0===(a=r.suffix)&&(a=""),i=Array.from({length:e.length+1}).map(function(){return!0}),l="-"===e[0],i.fill(!1,0,Math.min(n.length+ +!!l,e.length)),o=e.length,i.fill(!1,o-a.length+1,o+1),i},onKeyDown:function(e){var t=e.target,r=e.key,a=t.selectionStart,i=t.selectionEnd,o=t.value;if(void 0===o&&(o=""),("Backspace"===r||"Delete"===r)&&i<m.length&&"-"!==o)return void e.preventDefault();if(a!==i)return void l(e);"Backspace"===r&&"-"===o[0]&&a===m.length+1&&n&&ex(t,1),d&&c&&("Backspace"===r&&o[a-1]===b?(ex(t,a-1),e.preventDefault()):"Delete"===r&&o[a]===b&&e.preventDefault()),(null==S?void 0:S.includes(r))&&o[a]===b&&ex(t,a+1);var s=!0===u?",":u;"Backspace"===r&&o[a-1]===s&&ex(t,a-1),"Delete"===r&&o[a]===s&&ex(t,a+1),l(e)},onBlur:function(e){var r=_;r.match(/\d/g)||(r=""),a||(r=function(e){if(!e)return e;var t="-"===e[0];t&&(e=e.substring(1,e.length));var r=e.split("."),n=r[0].replace(/^0+/,"")||"0",a=r[1]||"";return(t?"-":"")+n+(a?"."+a:"")}(r)),c&&d&&(r=eg(r,d,c)),r!==_&&z({formattedValue:e_(r,t),value:r,floatValue:parseFloat(r)},{event:e,source:i.event}),s(e)}}));return o.default.createElement(eE,Object.assign({},R))}let eR=/^(0\.0*|-0(\.0*)?)$/,eI=/^-?0\d+(\.\d+)?\.?$/,eM=/\.\d*0$/,eV=/^-?\d+\.$/;function eD(e){return"string"==typeof e&&""!==e&&!Number.isNaN(Number(e))}function eA(e){return"bigint"==typeof e}function eL(e){return"number"==typeof e?e<Number.MAX_SAFE_INTEGER:""===e||eD(e)&&Number(e)<Number.MAX_SAFE_INTEGER}function eO(e,t){return!(""===e||"-"===e||!t&&e.startsWith("-"))&&/^-?\d+$/.test(e)}function eF(e,t){return"bigint"==typeof e||""===e||eO(e,t)}function eP(e){if(!/^-?\d+$/.test(e))return null;try{return BigInt(e)}catch{return null}}function e$(e){return"bigint"==typeof e?e:"number"==typeof e&&Number.isFinite(e)&&Number.isInteger(e)?BigInt(e):void 0}function eG(e,t,r){return void 0!==t&&e<t?t:void 0!==r&&e>r?r:e}let eW={size:"sm",step:1,clampBehavior:"blur",allowDecimal:!0,allowNegative:!0,withKeyboardEvents:!0,allowLeadingZeros:!0,trimLeadingZeroesOnBlur:!0,startValue:0,allowedDecimalSeparators:[".",","]},eU=(0,h.createVarsResolver)((e,{size:t})=>({controls:{"--ni-chevron-size":(0,m.getSize)(t,"ni-chevron-size")}})),eK=(0,g.genericFactory)(e=>{let t=(0,v.useProps)(["Input","InputWrapper","NumberInput"],eW,e),{className:r,classNames:n,styles:a,unstyled:i,vars:s,onChange:u,onValueChange:d,value:c,defaultValue:m,max:h,min:f,step:g,hideControls:x,rightSection:S,isAllowed:j,clampBehavior:y,onBlur:w,allowDecimal:T,decimalScale:k,onKeyDown:C,onKeyDownCapture:N,handlersRef:E,startValue:_,disabled:B,rightSectionPointerEvents:z,allowNegative:R,readOnly:I,size:M,rightSectionWidth:V,stepHoldInterval:D,stepHoldDelay:A,allowLeadingZeros:L,withKeyboardEvents:O,trimLeadingZeroesOnBlur:F,allowedDecimalSeparators:P,selectAllOnFocus:$,onMinReached:W,onMaxReached:U,onFocus:K,attributes:H,ref:X,...q}=t,Z=R??!0,J=L??!0,el=(0,p.useStyles)({name:"NumberInput",classes:er,props:t,classNames:n,styles:a,unstyled:i,attributes:H,vars:s,varsResolver:eU}),{resolvedClassNames:eo,resolvedStyles:es}=(0,Q.useResolvedStylesApi)({classNames:n,styles:a,props:t}),eu=(0,o.useRef)(eA(c)||eA(m)?"bigint":"number");eA(c)?eu.current="bigint":"number"==typeof c&&(eu.current="number");let ed="bigint"===eu.current,[ec,em]=(0,ei.useUncontrolled)({value:c,defaultValue:m,finalValue:"",onChange:u}),eh=void 0!==A&&void 0!==D,ef=(0,o.useRef)(null),ev=(0,o.useRef)(null),ep=(0,o.useRef)(0),eg="number"==typeof f?f:void 0,ex="number"==typeof h?h:void 0,eb="number"==typeof g?g:eW.step,eS="number"==typeof _?_:eW.startValue,ej=e$(f),ey=e$(h),ew=e$(g)??BigInt(1),eT=e$(_)??BigInt(0),ek=e=>{let t=Number(e);return Number.isSafeInteger(t)?t:void 0},eC=e=>{let t=String(e).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0},eN=e=>{ef.current&&void 0!==e&&ef.current.setSelectionRange(e,e)},eE=(0,o.useRef)(Y.noop);eE.current=()=>{let e;if(ed){let e;if(!eF(ec,Z))return;if("bigint"==typeof ec){let t=ec+ew;void 0!==ey&&t>ey&&U?.(),e=void 0!==ey&&t>ey?ey:t}else if("string"==typeof ec&&""!==ec){let t=eP(ec);if(null===t)return;let r=t+ew;void 0!==ey&&r>ey&&U?.(),e=void 0!==ey&&r>ey?ey:r}else e=eG(eT,ej,ey);let t=e.toString();em(e),d?.({floatValue:ek(e),formattedValue:t,value:t},{source:"increment"}),setTimeout(()=>eN(ef.current?.value.length),0);return}if(!eL(ec))return;let t=Math.max(eC(ec),eC(eb)),r=10**t;if(!eD(ec)&&("number"!=typeof ec||Number.isNaN(ec)))e=ea(eS,eg,ex);else if(void 0!==ex){let t=(Math.round(Number(ec)*r)+Math.round(eb*r))/r;t>ex&&U?.(),e=t<=ex?t:ex}else e=(Math.round(Number(ec)*r)+Math.round(eb*r))/r;let n=e.toFixed(t);em(parseFloat(n)),d?.({floatValue:parseFloat(n),formattedValue:n,value:n},{source:"increment"}),setTimeout(()=>eN(ef.current?.value.length),0)};let e_=(0,o.useRef)(Y.noop);e_.current=()=>{let e;if(ed){let e;if(!eF(ec,Z))return;let t=void 0!==ej?ej:Z?void 0:BigInt(0);if("bigint"==typeof ec){let r=ec-ew;void 0!==t&&r<t&&W?.(),e=void 0!==t&&r<t?t:r}else if("string"==typeof ec&&""!==ec){let r=eP(ec);if(null===r)return;let n=r-ew;void 0!==t&&n<t&&W?.(),e=void 0!==t&&n<t?t:n}else e=eG(eT,t,ey);let r=e.toString();em(e),d?.({floatValue:ek(e),formattedValue:r,value:r},{source:"decrement"}),setTimeout(()=>eN(ef.current?.value.length),0);return}if(!eL(ec))return;let t=void 0!==eg?eg:Z?Number.MIN_SAFE_INTEGER:0,r=Math.max(eC(ec),eC(eb)),n=10**r;if(!eD(ec)&&"number"!=typeof ec||Number.isNaN(ec))e=ea(eS,t,ex);else{let r=(Math.round(Number(ec)*n)-Math.round(eb*n))/n;void 0!==t&&r<t&&W?.(),e=void 0!==t&&r<t?t:r}let a=e.toFixed(r);em(parseFloat(a)),d?.({floatValue:parseFloat(a),formattedValue:a,value:a},{source:"decrement"}),setTimeout(()=>eN(ef.current?.value.length),0)},(0,en.assignRef)(E,{increment:eE.current,decrement:e_.current});let eB=e=>{e?eE.current?.():e_.current?.(),ep.current+=1},eK=e=>{if(eB(e),eh){let t="number"==typeof D?D:D(ep.current);ev.current=window.setTimeout(()=>eK(e),t)}},eH=(e,t)=>{e.preventDefault(),ef.current?.focus(),eB(t),eh&&(ev.current=window.setTimeout(()=>eK(t),A))},eX=()=>{ev.current&&window.clearTimeout(ev.current),ev.current=null,ep.current=0},eq=(0,l.jsxs)("div",{...el("controls"),children:[(0,l.jsx)(b.UnstyledButton,{...el("control"),tabIndex:-1,"aria-hidden":!0,disabled:B||"number"==typeof ec&&void 0!==ex&&ec>=ex||"bigint"==typeof ec&&void 0!==ey&&ec>=ey,mod:{direction:"up"},onMouseDown:e=>e.preventDefault(),onPointerDown:e=>{eH(e,!0)},onPointerUp:eX,onPointerLeave:eX,children:(0,l.jsx)(et,{direction:"up"})}),(0,l.jsx)(b.UnstyledButton,{...el("control"),tabIndex:-1,"aria-hidden":!0,disabled:B||"number"==typeof ec&&void 0!==eg&&ec<=eg||"bigint"==typeof ec&&void 0!==ej&&ec<=ej,mod:{direction:"down"},onMouseDown:e=>e.preventDefault(),onPointerDown:e=>{eH(e,!1)},onPointerUp:eX,onPointerLeave:eX,children:(0,l.jsx)(et,{direction:"down"})})]});return(0,l.jsx)(ee.InputBase,{component:ez,allowNegative:R,className:(0,G.default)(er.root,r),size:M,...q,inputMode:ed?"numeric":"decimal",readOnly:I,disabled:B,value:"bigint"==typeof ec?ec.toString():ec,getInputRef:(0,en.useMergedRef)(X,ef),onValueChange:(e,t)=>{var r,n,a;if("event"===t.source)if(ed){em(!eO(r=e.value,Z)||J&&eI.test(r)?r:eP(r)??r)}else{em((n=e.floatValue,a=e.value,("number"==typeof n?!(n<Number.MAX_SAFE_INTEGER):!!Number.isNaN(Number(n)))||Number.isNaN(n)||!(14>a.toString().replace(".","").length)||""===a||eR.test(e.value)||J&&eI.test(e.value)||eM.test(e.value)||eV.test(e.value))?e.value:e.floatValue)}d?.(e,t)},rightSection:x||I||!(ed?eF(ec,Z):eL(ec))?S:S||eq,classNames:eo,styles:es,unstyled:i,__staticSelector:"NumberInput",decimalScale:ed?0:T?k:0,onPaste:e=>{let t=e.clipboardData.getData("text"),r=q.decimalSeparator||".",n=(P||[".",","]).filter(e=>e!==r);if(n.some(e=>t.includes(e))){e.preventDefault();let a=t;n.forEach(e=>{a=a.split(e).join(r)});let i=ef.current;if(i){let e=i.selectionStart??0,t=i.selectionEnd??0,r=i.value,n=r.substring(0,e)+a+r.substring(t);Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype,"value")?.set?.call(i,n),i.dispatchEvent(new Event("change",{bubbles:!0}));let l=e+a.length;setTimeout(()=>eN(l),0)}}q.onPaste?.(e)},onFocus:e=>{$&&setTimeout(()=>e.currentTarget.select(),0),K?.(e)},onKeyDown:e=>{C?.(e),!I&&O&&("ArrowUp"===e.key&&(e.preventDefault(),eE.current?.()),"ArrowDown"===e.key&&(e.preventDefault(),e_.current?.()))},onKeyDownCapture:e=>{if(N?.(e),"Backspace"===e.key){let t=ef.current;t&&0===t.selectionStart&&t.selectionStart===t.selectionEnd&&(e.preventDefault(),window.setTimeout(()=>eN(0),0))}},rightSectionPointerEvents:z??(B?"none":void 0),rightSectionWidth:V??`var(--ni-right-section-width-${M||"sm"})`,allowLeadingZeros:L,allowedDecimalSeparators:P,onBlur:e=>{let t=ec;ed?("blur"===y&&"bigint"==typeof t&&(t=eG(t,ej,ey)),F&&"string"==typeof t&&(t=function(e,t){if(""===e||"-"===e)return e;let r=eP(e);return null===r?e:"blur"===t.clampBehavior?eG(r,t.min,t.max):r}(t,{min:ej,max:ey,clampBehavior:y}))):("blur"===y&&"number"==typeof t&&(t=ea(t,eg,ex)),F&&"string"==typeof t&&15>eC(t)&&(t=function(e,t,r){let n=e.toString(),a=eV.test(n),i=n.replace(/^0+(?=\d)/,""),l=parseFloat(i);if(Number.isNaN(l))return i;if(l>Number.MAX_SAFE_INTEGER)return void 0!==t?t:i;let o=ea(l,r,t);return a?`${o.toString().replace(/^0+(?=\d)/,"")}.`:o}(t,ex,eg))),ec!==t&&em(t),w?.(e)},attributes:H,isAllowed:e=>{if(!(!j||j(e)))return!1;if("strict"!==y)return!0;if(!ed){var t;return t=e.floatValue,void 0===t||(void 0===eg||t>=eg)&&(void 0===ex||t<=ex)}if(""===e.value||"-"===e.value)return!0;let r=eP(e.value);return null===r||(void 0===ej||r>=ej)&&(void 0===ey||r<=ey)}})});eK.classes={...ee.InputBase.classes,...er},eK.varsResolver=eU,eK.displayName="@mantine/core/NumberInput";var eH=e.i(56684),eX=e.i(47596),eq=e.i(53165),eZ=e.i(81363);function eJ(e,t){return 0===t.length?e:t.reduce((t,r)=>Math.abs(r-e)<Math.abs(t-e)?r:t)}var eY=e.i(17303);let[eQ,e0]=(0,E.createSafeContext)("SliderProvider was not found in tree");function e1({size:e,disabled:t,variant:r,color:n,thumbSize:a,radius:i,orientation:o,...s}){let{getStyles:u}=e0();return(0,l.jsx)(x.Box,{tabIndex:-1,variant:r,size:e,...u("root"),mod:{orientation:o},...s})}e1.displayName="@mantine/core/SliderRoot";var e2=e.i(98193);function e6({max:e,min:t,value:r,position:n,label:a,dragging:i,onMouseDown:s,onKeyDownCapture:u,labelTransitionProps:d,labelAlwaysOn:c,thumbLabel:m,thumbValueText:h,onFocus:f,onBlur:v,showLabelOnHover:p,isHovered:g,children:b=null,disabled:S,orientation:j="horizontal",ref:y}){let{getStyles:w}=e0(),[T,k]=(0,o.useState)(!1),C=c||i||T||p&&g,N="function"==typeof h?h(r):h;return(0,l.jsxs)(x.Box,{tabIndex:S?-1:0,role:"slider","aria-label":m,"aria-valuemax":e,"aria-valuemin":t,"aria-valuenow":r,"aria-valuetext":N,"aria-disabled":S,"aria-orientation":j,ref:y,__vars:{"--slider-thumb-offset":`${n}%`},...w("thumb",{focusable:!0}),mod:{dragging:i,disabled:S},onFocus:e=>{k(!0),"function"==typeof f&&f(e)},onBlur:e=>{k(!1),"function"==typeof v&&v(e)},onTouchStart:s,onMouseDown:s,onKeyDownCapture:u,onClick:e=>e.stopPropagation(),children:[b,(0,l.jsx)(e2.Transition,{mounted:null!=a&&!!C,transition:"fade",duration:0,...d,children:e=>(0,l.jsx)("div",{...w("label",{style:e}),children:a})})]})}function e4({value:e,min:t,max:r}){return Math.min(Math.max((e-t)/(r-t)*100,0),100)}function e5({marks:e,min:t,max:r,disabled:n,value:a,offset:i,inverted:s,startPointValue:u}){let{getStyles:d}=e0();return e?(0,l.jsx)("div",{children:e.map((e,c)=>e.hidden?null:(0,o.createElement)(x.Box,{...d("markWrapper"),__vars:{"--mark-offset":`${e4({value:e.value,min:t,max:r})}%`},key:c},(0,l.jsx)(x.Box,{...d("mark"),mod:{filled:function({mark:e,offset:t,value:r,inverted:n=!1,startPointValue:a}){return"number"!=typeof a||n?n?"number"==typeof t&&e.value<=t||e.value>=r:"number"==typeof t?e.value>=t&&e.value<=r:e.value<=r:e.value>=a&&e.value<=r||e.value<=a&&e.value>=r}({mark:e,value:a,offset:i,inverted:s,startPointValue:u}),disabled:n}}),e.label&&(0,l.jsx)("div",{...d("markLabel"),children:e.label})))}):null}function e3({filled:e,children:t,offset:r,disabled:n,marksOffset:a,inverted:i,startPointValue:o,containerProps:s,...u}){let{getStyles:d}=e0();return(0,l.jsx)(x.Box,{...d("trackContainer"),mod:{disabled:n},...s,children:(0,l.jsxs)(x.Box,{...d("track"),mod:{inverted:i,disabled:n},children:[(0,l.jsx)(x.Box,{mod:{inverted:i,disabled:n},__vars:{"--slider-bar-width":`calc(${e}% + 2 * var(--slider-size))`,"--slider-bar-offset":`calc(${r}% - var(--slider-size))`},...d("bar")}),t,(0,l.jsx)(e5,{...u,offset:a,disabled:n,inverted:i,startPointValue:o})]})})}function e8(e,t){return parseFloat(e.toFixed(t))}function e7(e,t){let r=[...t].sort((e,t)=>e.value-t.value).find(t=>t.value>e);return r?r.value:e}function e9(e,t){let r=[...t].sort((e,t)=>t.value-e.value).find(t=>t.value<e);return r?r.value:e}function te(e){let t=[...e].sort((e,t)=>e.value-t.value);return t.length>0?t[0].value:0}function tt(e){let t=[...e].sort((e,t)=>e.value-t.value);return t.length>0?t[t.length-1].value:100}e6.displayName="@mantine/core/SliderThumb",e5.displayName="@mantine/core/SliderMarks",e3.displayName="@mantine/core/SliderTrack";var tr={root:"m_dd36362e",label:"m_c9357328",thumb:"m_c9a9a60a",trackContainer:"m_a8645c2",track:"m_c9ade57f",bar:"m_38aeed47",markWrapper:"m_b7b0423a",mark:"m_dd33bc19",markLabel:"m_68c77a5b"};let tn={radius:"xl",min:0,max:100,step:1,marks:[],label:e=>e,labelTransitionProps:{transition:"fade",duration:0},thumbLabel:"",showLabelOnHover:!0,scale:e=>e,size:"md"},ta=(0,h.createVarsResolver)((e,{size:t,color:r,thumbSize:n,radius:a})=>({root:{"--slider-size":(0,m.getSize)(t,"slider-size"),"--slider-color":r?(0,f.getThemeColor)(r,e):void 0,"--slider-radius":void 0===a?void 0:(0,m.getRadius)(a),"--slider-thumb-size":void 0!==n?(0,c.rem)(n):"calc(var(--slider-size) * 2)"}})),ti=(0,g.factory)(e=>{let t=(0,v.useProps)("Slider",tn,e),{classNames:r,styles:n,value:a,onChange:i,onChangeEnd:s,size:u,min:d,max:c,domain:m,step:h,precision:f,defaultValue:g,name:x,marks:b,label:S,labelTransitionProps:j,labelAlwaysOn:y,thumbLabel:w,thumbValueText:T,showLabelOnHover:k,thumbChildren:C,disabled:N,unstyled:E,scale:_,inverted:B,startPointValue:z,orientation:R,className:I,style:M,vars:V,hiddenInputProps:D,restrictToMarks:A,thumbProps:L,attributes:O,ref:F,...P}=t,$=(0,p.useStyles)({name:"Slider",props:t,classes:tr,classNames:r,className:I,styles:n,style:M,attributes:O,vars:V,varsResolver:ta,unstyled:E}),{dir:G}=(0,eY.useDirection)(),[W,U]=(0,o.useState)(!1),[K,H]=(0,ei.useUncontrolled)({value:"number"==typeof a?ea(a,d,c):a,defaultValue:"number"==typeof g?ea(g,d,c):g,finalValue:ea(0,d,c),onChange:i}),X=(0,o.useRef)(K),q=(0,o.useRef)(s);(0,o.useEffect)(()=>{q.current=s},[s]);let Z=(0,o.useRef)(null),J=(0,o.useRef)(null),[Y,Q]=m||[d,c],ee=e4({value:K,min:Y,max:Q}),et=_(K),er="function"==typeof S?S(et):S,el=f??function(e){if(!e)return 0;let t=e.toString().split(".");return t.length>1?t[1].length:0}(h),eo="number"==typeof z&&!B,es=eo?e4({value:z,min:Y,max:Q}):0,eu=eo?Math.min(ee,es):0,ed=eo?Math.abs(ee-es):ee,ec=(0,o.useCallback)(({x:e})=>{if(!N){let t=ea(function({value:e,containerWidth:t,min:r,max:n,step:a,precision:i}){let l=(t?Math.min(Math.max(e,0),t)/t:e)*(n-r),o=Math.max((0!==l?Math.round(l/a)*a:0)+r,r);return void 0!==i?Number(o.toFixed(i)):o}({value:e,min:Y,max:Q,step:h,precision:el}),d,c);H(A&&b?.length?eJ(t,b.map(e=>e.value)):t),X.current=t}},[N,d,c,Y,Q,h,el,H,b,A]),{ref:em,active:eh}=function(e,t,r="ltr"){let n=(0,o.useRef)(!1),a=(0,o.useRef)(!1),i=(0,o.useRef)(0),l=(0,o.useRef)(null),[s,u]=(0,o.useState)(!1);return(0,o.useEffect)(()=>(n.current=!0,()=>{l.current?.()}),[]),{ref:(0,o.useCallback)(o=>{let s=({x:t,y:a})=>{cancelAnimationFrame(i.current),i.current=requestAnimationFrame(()=>{if(n.current&&o){o.style.userSelect="none";let n=o.getBoundingClientRect();if(n.width&&n.height){let i=ea((t-n.left)/n.width,0,1);e({x:"ltr"===r?i:1-i,y:ea((a-n.top)/n.height,0,1)})}}})},d=()=>{document.removeEventListener("mousemove",f),document.removeEventListener("mouseup",m),document.removeEventListener("touchmove",p),document.removeEventListener("touchend",m)},c=()=>{!a.current&&n.current&&(a.current=!0,"function"==typeof t?.onScrubStart&&t.onScrubStart(),u(!0),document.addEventListener("mousemove",f),document.addEventListener("mouseup",m),document.addEventListener("touchmove",p,{passive:!1}),document.addEventListener("touchend",m))},m=()=>{a.current&&n.current&&(a.current=!1,u(!1),d(),setTimeout(()=>{"function"==typeof t?.onScrubEnd&&t.onScrubEnd()},0))},h=e=>{c(),e.preventDefault(),f(e)},f=e=>s({x:e.clientX,y:e.clientY}),v=e=>{e.cancelable&&e.preventDefault(),c(),p(e)},p=e=>{e.cancelable&&e.preventDefault(),s({x:e.changedTouches[0].clientX,y:e.changedTouches[0].clientY})};return o?.addEventListener("mousedown",h),o?.addEventListener("touchstart",v,{passive:!1}),l.current=()=>{d(),cancelAnimationFrame(i.current)},()=>{o&&(o.removeEventListener("mousedown",h),o.removeEventListener("touchstart",v))}},[r,e]),active:s}}(({x:e,y:t})=>ec({x:"vertical"===R?1-t:e}),{onScrubEnd:(0,o.useCallback)(()=>{if(!N&&q.current){let e=A&&b?.length?eJ(X.current,b.map(e=>e.value)):X.current;q.current(e)}},[N,b,A])},G),ef=(0,o.useCallback)(e=>{!N&&q.current&&q.current(e)},[N]);return(0,l.jsx)(eQ,{value:{getStyles:$},children:(0,l.jsxs)(e1,{...P,ref:(0,en.useMergedRef)(F,Z),onKeyDownCapture:e=>{if(!N)switch(e.key){case"ArrowUp":{if(e.preventDefault(),J.current?.focus(),A&&b){let e=e7(K,b);H(e),ef(e);break}let t=e8(Math.min(Math.max(K+h,Y),Q),el);H(t),ef(t);break}case"ArrowRight":{if(e.preventDefault(),J.current?.focus(),A&&b){let e="rtl"===G?e9(K,b):e7(K,b);H(e),ef(e);break}let t=e8(Math.min(Math.max("rtl"===G?K-h:K+h,Y),Q),el);H(t),ef(t);break}case"ArrowDown":{if(e.preventDefault(),J.current?.focus(),A&&b){let e=e9(K,b);H(e),ef(e);break}let t=e8(Math.min(Math.max(K-h,Y),Q),el);H(t),ef(t);break}case"ArrowLeft":{if(e.preventDefault(),J.current?.focus(),A&&b){let e="rtl"===G?e7(K,b):e9(K,b);H(e),ef(e);break}let t=e8(Math.min(Math.max("rtl"===G?K+h:K-h,Y),Q),el);H(t),ef(t);break}case"Home":if(e.preventDefault(),J.current?.focus(),A&&b){H(te(b)),ef(te(b));break}H(d),ef(d);break;case"End":if(e.preventDefault(),J.current?.focus(),A&&b){H(tt(b)),ef(tt(b));break}H(c),ef(c)}},onMouseDownCapture:()=>Z.current?.focus(),size:u,disabled:N,orientation:R,children:[(0,l.jsx)(e3,{inverted:B,offset:eu,filled:ed,marks:b,min:Y,max:Q,value:et,startPointValue:eo?z:void 0,disabled:N,containerProps:{ref:em,onMouseEnter:k?()=>U(!0):void 0,onMouseLeave:k?()=>U(!1):void 0},children:(0,l.jsx)(e6,{max:Q,min:Y,value:et,position:ee,dragging:eh,label:er,ref:J,labelTransitionProps:j,labelAlwaysOn:y,thumbLabel:w,thumbValueText:T,showLabelOnHover:k,isHovered:W,disabled:N,orientation:R,...L,children:C})}),(0,l.jsx)("input",{type:"hidden",name:x,value:et,...D})]})})});ti.classes=tr,ti.varsResolver=ta,ti.displayName="@mantine/core/Slider";var tl=e.i(77936),to=e.i(64384),ts=e.i(94229),tu=e.i(47167);let td=["borderBottomWidth","borderLeftWidth","borderRightWidth","borderTopWidth","boxSizing","fontFamily","fontSize","fontStyle","fontWeight","letterSpacing","lineHeight","paddingBottom","paddingLeft","paddingRight","paddingTop","tabSize","textIndent","textRendering","textTransform","width","wordBreak","wordSpacing","scrollbarGutter"],tc={"min-height":"0","max-height":"none",height:"0",visibility:"hidden",overflow:"hidden",position:"absolute","z-index":"-1000",top:"0",right:"0",display:"block"};function tm(e){Object.keys(tc).forEach(t=>{e.style.setProperty(t,tc[t],"important")})}let th=null;function tf({maxRows:e,minRows:t,onChange:r,ref:n,...a}){let i=void 0!==a.value,s=(0,o.useRef)(null),u=(0,en.useMergedRef)(s,n),d=(0,o.useRef)(0),c=(0,o.useRef)(0),m=()=>{let r=s.current;if(!r)return;let n=function(e){let t=window.getComputedStyle(e);if(null===t)return null;let r={};for(let e of td)r[e]=t[e];return""===r.boxSizing?null:{sizingStyle:r,paddingSize:parseFloat(r.paddingBottom)+parseFloat(r.paddingTop),borderSize:parseFloat(r.borderBottomWidth)+parseFloat(r.borderTopWidth)}}(r);if(!n)return;let[a]=function(e,t,r=1,n=1/0){th||((th=document.createElement("textarea")).setAttribute("tabindex","-1"),th.setAttribute("aria-hidden","true"),th.setAttribute("aria-label","autosize measurement"),tm(th)),null===th.parentNode&&document.body.appendChild(th);let{paddingSize:a,borderSize:i,sizingStyle:l}=e,{boxSizing:o}=l;Object.keys(l).forEach(e=>{th.style[e]=l[e]}),tm(th),th.value=t;let s="border-box"===o?th.scrollHeight+i:th.scrollHeight-a;th.value=t,s="border-box"===o?th.scrollHeight+i:th.scrollHeight-a,th.value="x";let u=th.scrollHeight-a,d=u*r;"border-box"===o&&(d=d+a+i),s=Math.max(d,s);let c=u*n;return"border-box"===o&&(c=c+a+i),[s=Math.min(c,s),u]}(n,r.value||r.placeholder||"x",t,e);d.current!==a&&(d.current=a,r.style.setProperty("height",`${a}px`,"important"))};return(0,o.useLayoutEffect)(m),(0,o.useEffect)(()=>{let e=()=>m();return window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)},[]),(0,o.useEffect)(()=>{let e=s.current;if(!e||"u"<typeof ResizeObserver)return;c.current=e.offsetWidth;let t=new ResizeObserver(()=>{s.current&&s.current.offsetWidth!==c.current&&(c.current=s.current.offsetWidth,m())});return t.observe(e),()=>t.disconnect()},[]),(0,o.useEffect)(()=>{let e=()=>m();return document.fonts.addEventListener("loadingdone",e),()=>document.fonts.removeEventListener("loadingdone",e)},[]),(0,o.useEffect)(()=>{let e=e=>{if(s.current?.form===e.target&&!i){let e=s.current.value;requestAnimationFrame(()=>{s.current&&e!==s.current.value&&m()})}};return document.body.addEventListener("reset",e),()=>document.body.removeEventListener("reset",e)},[i]),(0,l.jsx)("textarea",{rows:t,...a,onChange:e=>{i||m(),r?.(e)},ref:u})}let tv=(0,g.factory)(e=>{let{autosize:t,maxRows:r,minRows:n,__staticSelector:a,resize:i,bottomSection:o,bottomSectionProps:s,...u}=(0,v.useProps)(["Input","InputWrapper","Textarea"],null,e),d=t&&"test"!=(void 0!==tu.default&&tu.default.env,"development");return(0,l.jsx)(ee.InputBase,{component:d?tf:"textarea",...u,__staticSelector:a||"Textarea",__bottomSection:o,__bottomSectionProps:s,multiline:!0,"data-no-overflow":t&&void 0===r||void 0,__vars:{"--input-resize":i},...d?{maxRows:r,minRows:n}:{}})});tv.classes=ee.InputBase.classes,tv.displayName="@mantine/core/Textarea";var tp=e.i(25293),tg=e.i(92181),tx=e.i(11644),tb=e.i(29765);function tS(e=!1,t={}){let[r,n]=(0,o.useState)(e),a=(0,o.useCallback)(()=>{n(e=>e||(t.onOpen?.(),!0))},[t.onOpen]),i=(0,o.useCallback)(()=>{n(e=>e?(t.onClose?.(),!1):e)},[t.onClose]);return[r,{open:a,close:i,toggle:(0,o.useCallback)(()=>{r?i():a()},[i,a,r]),set:n}]}var tj=e.i(32591),ty=e.i(12522),tw=e.i(33550);let tT=(0,tw.default)("outline","movie","Movie",[["path",{d:"M4 6a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2l0 -12",key:"svg-0"}],["path",{d:"M8 4l0 16",key:"svg-1"}],["path",{d:"M16 4l0 16",key:"svg-2"}],["path",{d:"M4 8l4 0",key:"svg-3"}],["path",{d:"M4 16l4 0",key:"svg-4"}],["path",{d:"M4 12l16 0",key:"svg-5"}],["path",{d:"M16 8l4 0",key:"svg-6"}],["path",{d:"M16 16l4 0",key:"svg-7"}]]);var tk=e.i(17708),tC=e.i(18716),tN=e.i(57662),tE=e.i(6916),t_=e.i(14552);let tB=(0,tw.default)("outline","volume","Volume",[["path",{d:"M15 8a5 5 0 0 1 0 8",key:"svg-0"}],["path",{d:"M17.7 5a9 9 0 0 1 0 14",key:"svg-1"}],["path",{d:"M6 15h-2a1 1 0 0 1 -1 -1v-4a1 1 0 0 1 1 -1h2l3.5 -4.5a.8 .8 0 0 1 1.5 .5v14a.8 .8 0 0 1 -1.5 .5l-3.5 -4.5",key:"svg-2"}]]),tz=(0,tw.default)("outline","volume-off","VolumeOff",[["path",{d:"M15 8a5 5 0 0 1 1.912 4.934m-1.377 2.602a5 5 0 0 1 -.535 .464",key:"svg-0"}],["path",{d:"M17.7 5a9 9 0 0 1 2.362 11.086m-1.676 2.299a9 9 0 0 1 -.686 .615",key:"svg-1"}],["path",{d:"M9.069 5.054l.431 -.554a.8 .8 0 0 1 1.5 .5v2m0 4v8a.8 .8 0 0 1 -1.5 .5l-3.5 -4.5h-2a1 1 0 0 1 -1 -1v-4a1 1 0 0 1 1 -1h2l1.294 -1.664",key:"svg-2"}],["path",{d:"M3 3l18 18",key:"svg-3"}]]);var tR=e.i(85404);function tI(e){if(!e||e<0)return"00:00";let t=Math.floor(e/3600),r=Math.floor(e%3600/60),n=Math.floor(e%60),a=e=>e.toString().padStart(2,"0");return t>0?`${a(t)}:${a(r)}:${a(n)}`:`${a(r)}:${a(n)}`}e.s(["default",0,function(){var e;let{colorScheme:t,toggleColorScheme:r}=(0,tx.useMantineColorScheme)(),[n,{toggle:a}]=tS(),[i,{open:c,close:m}]=tS(),[h,f]=(0,o.useState)([]),[v,p]=(0,o.useState)(null),[g,x]=(0,o.useState)(!1),[b,S]=(0,o.useState)(null),[j,N]=(0,o.useState)(""),[E,_]=(0,o.useState)(""),[B,z]=(0,o.useState)(""),[R,I]=(0,o.useState)(!0),[M,V]=(0,o.useState)(3e3),[D,A]=(0,o.useState)(128),[L,O]=(0,o.useState)(60),[F,P]=(0,o.useState)("Auto"),[$,G]=(0,o.useState)("h264"),[W,U]=(0,o.useState)("mp4a"),[K,H]=(0,o.useState)(44100),[X,Y]=(0,o.useState)("veryfast"),[Q,ee]=(0,o.useState)(60),[et,er]=(0,o.useState)(!1),[en,ea]=(0,o.useState)(!1),[ei,el]=(0,o.useState)(!0),[eo,es]=(0,o.useState)(""),[eu,ed]=(0,o.useState)(!1),[ec,em]=(0,o.useState)(null),[eh,ef]=(0,o.useState)("blue"),[ev,ep]=(0,o.useState)([]),[eg,ex]=(0,o.useState)(null),[eb,eS]=(0,o.useState)(!1),[ej,ey]=(0,o.useState)(!1),[ew,eT]=(0,o.useState)("natural"),ek=(0,o.useRef)(null),eC=()=>{ea(!1),el(!0),N(""),I(!0),V(3e3),A(128),O(60),P("Auto"),G("h264"),U("mp4a"),H(44100),Y("veryfast"),ee(60),eG(null),eU(null),es(""),em(null);let e=localStorage.getItem("twitch_stream_key")||"",t=localStorage.getItem("rtmp_url")||"";_(e),z(t),c()},[eN,{open:eE,close:e_}]=tS(),[eB,ez]=(0,o.useState)(""),[eR,eI]=(0,o.useState)(null),[eM,eV]=(0,o.useState)(!1),[eD,eA]=(0,o.useState)(null),[eL,eO]=(0,o.useState)([]),[eF,eP]=(0,o.useState)([]),[e$,eG]=(0,o.useState)(null),[eW,eU]=(0,o.useState)(null),[eJ,eY]=(0,o.useState)(!1),[eQ,e0]=(0,o.useState)(null),[e1,e2]=(0,o.useState)([]),[e6,e4]=(0,o.useState)([]),[e5,e3]=(0,o.useState)([]),[e8,e7]=(0,o.useState)(null),[e9,te]=(0,o.useState)(null),[tt,tr]=(0,o.useState)(100),[tn,ta]=(0,o.useState)(!1),[tu,td]=(0,o.useState)(100),[tc,tm]=(0,o.useState)(""),[th,tf]=(0,o.useState)([]),[tw,tM]=(0,o.useState)(!1),[tV,tD]=(0,o.useState)(null),[tA,tL]=(0,o.useState)(null),tO=(0,o.useRef)(null),tF=(0,o.useRef)(null),tP=(0,o.useRef)(null),t$=(0,o.useRef)(0),tG=(0,o.useRef)(null);(0,o.useEffect)(()=>{tG.current=v},[v]),(0,o.useEffect)(()=>{let e=()=>{x(!0),fetch(tR.default.LIST_INSTANCES(),{method:"GET"}).then(e=>e.json()).then(e=>{f(e),p(t=>t&&e.some(e=>e.id===t)?t:e[0]?.id??null)}).catch(()=>{}).finally(()=>x(!1))};return e(),tP.current=setInterval(e,3e3),()=>{tP.current&&clearInterval(tP.current)}},[]);let tW=()=>{fetch(tR.default.GET_HISTORY()).then(e=>e.json()).then(e=>{ep(e.history||[])}).catch(()=>{})};(0,o.useEffect)(()=>{let e=localStorage.getItem("twitch_stream_key");e&&_(e);let t=localStorage.getItem("rtmp_url");t&&z(t);let r=localStorage.getItem("watchparty_accent_color");r&&ef(r),tW();let n=new URLSearchParams(window.location.search),a=n.get("play"),i="true"===n.get("folder");a&&(window.history.replaceState({},document.title,window.location.pathname),ea(!1),N(a),ey(i),c())},[]),(0,o.useEffect)(()=>{eN&&(eV(!0),eA(null),fetch(tR.default.MOVIES(eB)).then(e=>{if(!e.ok)throw Error("Failed to load movies directory");return e.json()}).then(e=>{eI(e.message)}).catch(e=>{eA(e.message||String(e)),eI(null)}).finally(()=>eV(!1)))},[eB,eN]),(0,o.useEffect)(()=>{if(!j.trim()||ej){eO([]),eP([]),eG(null),eU(null);return}eY(!0),e0(null),fetch(tR.default.PROBE(j)).then(e=>{if(!e.ok)throw Error("Failed to probe video file");return e.json()}).then(e=>{eO(e.audio||[]),eP(e.subtitle||[]),ei&&(e.audio&&e.audio.length>0?eG(e.audio[0].vlc_index):eG(null),e.subtitle&&e.subtitle.length>0?eU(e.subtitle[0].vlc_index):eU(null))}).catch(e=>{e0(e.message||String(e)),eO([]),eP([]),eG(null),eU(null)}).finally(()=>{eY(!1),el(!0)})},[j,ei]),(0,o.useEffect)(()=>{if(!j.trim()||ej){ex(null),eS(!1);return}let e=ev.find(e=>e.file_path===j);e&&e.resume_position>0?(ex(e.resume_position),eS(!0)):(ex(null),eS(!1))},[j,ev,ej]),(0,o.useEffect)(()=>{if(tF.current&&clearInterval(tF.current),S(null),e2([]),!v)return;let e=()=>{let e=tG.current;e&&(fetch(tR.default.STATUS(e),{method:"GET"}).then(e=>e.json()).then(t=>{if(tG.current===e){S(t),t.message&&"number"==typeof t.message.volume&&(tr(Math.round(t.message.volume/256*100)),ta(0===t.message.volume));let r=Date.now();if(t.message&&t.message.time>0&&(!ek.current||r-ek.current>=1e4)){ek.current=r;let n=h.find(t=>t.id===e);n&&n.video_path&&fetch(tR.default.UPDATE_HISTORY(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({file_path:n.video_path,resume_position:t.message.time})}).then(()=>{tW()}).catch(()=>{})}}}).catch(()=>{}),fetch(tR.default.LOGS(e),{method:"GET"}).then(e=>e.json()).then(t=>{tG.current===e&&"success"===t.status&&e2(t.message)}).catch(()=>{}))};return e(),tF.current=setInterval(e,1e3),()=>{tF.current&&clearInterval(tF.current)}},[v]),(0,o.useEffect)(()=>{let e=h.find(e=>e.id===v);if(!e){e4([]),e3([]);return}fetch(tR.default.PROBE(e.video_path)).then(e=>{if(!e.ok)throw Error();return e.json()}).then(e=>{e4(e.audio||[]),e3(e.subtitle||[])}).catch(()=>{e4([]),e3([])})},[v,h]);let tU=e=>{if(!v)return;tr(e),ta(0===e);let t=Math.round(e/100*256);fetch(tR.default.VOLUME(v,String(t)),{method:"POST"}).catch(()=>{})},tK=(e,t)=>{v&&("audio"===e?e7(t):te(t),fetch(tR.default.TRACK(v,e,t),{method:"POST"}).catch(()=>{}))},tH=e=>{v&&(tM(!0),fetch(tR.default.EXECUTE(v),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({command:e})}).then(e=>e.json()).then(t=>{t$.current+=1,tf(r=>[{id:t$.current,command:e,response:t,timestamp:new Date().toLocaleTimeString()},...r].slice(0,50))}).catch(t=>{t$.current+=1,tf(r=>[{id:t$.current,command:e,response:{status:"error",message:String(t)},timestamp:new Date().toLocaleTimeString()},...r].slice(0,50))}).finally(()=>tM(!1)))},tX=()=>{tc.trim()&&(tH(tc),tm(""))},tq=e=>{v&&fetch(e?tR.default.KILL(v):tR.default.STOP(v),{method:"POST"}).then(e=>e.json()).then(e=>{f(t=>t.map(t=>t.id===e.id?e:t))}).catch(()=>{})},tZ=h.find(e=>e.id===v)??null,tJ=b?.status!=="error"?b?.message:void 0,tY=tJ?.information?.category,tQ=tY?Object.entries(tY).filter(([e,t])=>{var r;return"meta"!==e&&!!(r=t)&&"object"==typeof r&&"Type"in r}):[],t0=tY?.meta,t1=tQ.find(([,e])=>"Video"===e.Type)?.[1],t2=tQ.find(([,e])=>"Audio"===e.Type)?.[1],t6=tQ.find(([,e])=>"Subtitle"===e.Type)?.[1];return(0,l.jsx)(tb.MantineProvider,{theme:{primaryColor:eh},forceColorScheme:"dark",children:(0,l.jsxs)(u.AppShell,{header:{height:60},navbar:{width:300,breakpoint:"sm",collapsed:{mobile:!n,desktop:!1}},padding:"md",children:[(0,l.jsx)(u.AppShell.Header,{children:(0,l.jsxs)(Z.Group,{h:"100%",px:"md",justify:"space-between",style:{width:"100%",flexWrap:"nowrap"},children:[(0,l.jsxs)(Z.Group,{gap:"xs",style:{flexWrap:"nowrap"},children:[(0,l.jsx)(y,{opened:n,onClick:a,hiddenFrom:"sm",size:"sm"}),(0,l.jsx)(tg.Title,{order:4,style:{whiteSpace:"nowrap"},children:"The TWITCH WatchParty Bridge"})]}),(0,l.jsxs)(Z.Group,{gap:"xs",style:{flexWrap:"nowrap"},children:[tZ&&(0,l.jsxs)(d.Badge,{color:"running"===(e=tZ.status)?"green":"starting"===e?"yellow":"error"===e?"red":"gray",children:[tZ.name," · ",tZ.status]}),(0,l.jsx)(w.Button,{component:"a",href:"/manager",variant:"light",size:"sm",leftSection:(0,l.jsx)(ty.IconFolder,{size:16}),children:"Media Manager"}),(0,l.jsx)(s.ActionIcon,{variant:"default",onClick:()=>r(),size:"lg","aria-label":"Toggle color scheme",children:"dark"===t?(0,l.jsx)(tE.IconSun,{size:18}):(0,l.jsx)(t_.IconMoon,{size:18})})]})]})}),(0,l.jsx)(u.AppShell.Navbar,{p:"md",children:(0,l.jsx)(eX.ScrollArea,{h:"100%",scrollbarSize:6,offsetScrollbars:!0,children:(0,l.jsxs)(tl.Stack,{gap:"xs",pr:"xs",children:[(0,l.jsxs)(Z.Group,{justify:"space-between",children:[(0,l.jsx)(ts.Text,{size:"sm",c:"dimmed",children:"VLC Instances"}),(0,l.jsxs)(Z.Group,{gap:4,children:[(0,l.jsx)(s.ActionIcon,{variant:"subtle",onClick:()=>fetch(tR.default.LIST_INSTANCES()).then(e=>e.json()).then(f),loading:g,"aria-label":"Refresh instances",children:(0,l.jsx)(tC.IconRefresh,{size:16})}),(0,l.jsx)(s.ActionIcon,{variant:"filled",onClick:eC,"aria-label":"Start new instance",children:(0,l.jsx)(tk.IconPlus,{size:16})})]})]}),(0,l.jsx)(eq.Select,{placeholder:"Select an instance",data:h.filter((e,t,r)=>r.findIndex(t=>t.id===e.id)===t).map(e=>({value:e.id,label:`${e.name} (${e.status})`})),value:v,onChange:p,searchable:!0,nothingFoundMessage:"No instances yet"}),tZ&&(0,l.jsxs)(T.Card,{withBorder:!0,padding:"xs",children:[(0,l.jsxs)(tl.Stack,{gap:2,children:[(0,l.jsxs)(ts.Text,{size:"xs",c:"dimmed",children:["PID: ",tZ.pid??"—"]}),(0,l.jsx)(ts.Text,{size:"xs",c:"dimmed",truncate:!0,children:tZ.video_path}),(0,l.jsxs)(ts.Text,{size:"xs",c:"dimmed",children:["telnet:",tZ.telnet_port," · http:",tZ.http_port]})]}),(0,l.jsxs)(Z.Group,{mt:"xs",grow:!0,gap:4,children:[(0,l.jsx)(w.Button,{size:"xs",color:"blue",variant:"light",onClick:()=>{var e;tZ&&(ea(!0),el(!1),N((e=tZ.start_req||{video_path:tZ.video_path,loop:!0,video_bitrate:3e3,audio_bitrate:128,fps:60,scale:"Auto",vcodec:"h264",acodec:"mp4a",samplerate:44100,preset:"veryfast",keyint:60,audio_track:null,sub_track:null,name:tZ.name,stream_key:localStorage.getItem("twitch_stream_key")||"",rtmp_url:localStorage.getItem("rtmp_url")||""}).video_path),_(e.stream_key||""),z(e.rtmp_url||""),I(e.loop),V(e.video_bitrate),A(e.audio_bitrate),O(e.fps),P(e.scale||"Auto"),G(e.vcodec||"h264"),U(e.acodec||"mp4a"),H(e.samplerate||44100),Y(e.preset||"veryfast"),ee(e.keyint||60),eG(e.audio_track??null),eU(e.sub_track??null),es(e.name||""),c())},children:"Configure"}),(0,l.jsx)(w.Button,{size:"xs",color:"orange",variant:"light",onClick:()=>tq(!1),children:"Stop"}),(0,l.jsx)(w.Button,{size:"xs",color:"red",variant:"light",onClick:()=>tq(!0),children:"Kill"})]}),(0,l.jsx)(w.Button,{size:"xs",mt:6,fullWidth:!0,color:"red",variant:"subtle",leftSection:(0,l.jsx)(tN.IconTrash,{size:14}),onClick:()=>{v&&fetch(tR.default.DELETE(v),{method:"DELETE"}).then(()=>{f(e=>e.filter(e=>e.id!==v)),p(e=>e===v?null:e)}).catch(()=>{})},children:"Remove"})]}),(0,l.jsx)(C.Divider,{label:"Media Controls",my:"xs"}),(0,l.jsxs)(eZ.SimpleGrid,{cols:2,children:[(0,l.jsx)(w.Button,{onClick:()=>tH("play"),loading:tw,disabled:!v,children:"Play"}),(0,l.jsx)(w.Button,{onClick:()=>tH("pause"),loading:tw,variant:"light",disabled:!v,children:"Pause"}),(0,l.jsx)(w.Button,{onClick:()=>tH("stop"),loading:tw,color:"red",variant:"light",disabled:!v,children:"Stop"}),(0,l.jsx)(w.Button,{onClick:()=>tH("fullscreen"),loading:tw,variant:"light",disabled:!v,children:"Fullscreen"}),(0,l.jsx)(w.Button,{onClick:()=>tH("prev"),loading:tw,variant:"light",disabled:!v,children:"Previous"}),(0,l.jsx)(w.Button,{onClick:()=>tH("next"),loading:tw,variant:"light",disabled:!v,children:"Next"}),(0,l.jsx)(w.Button,{onClick:()=>tH("snapshot"),loading:tw,variant:"light",disabled:!v,children:"Snapshot"})]}),(0,l.jsx)(C.Divider,{label:"Seek",my:"xs"}),(0,l.jsxs)(eZ.SimpleGrid,{cols:2,children:[(0,l.jsx)(w.Button,{onClick:()=>tH("seek -60s"),variant:"default",disabled:!v,children:"-60s"}),(0,l.jsx)(w.Button,{onClick:()=>tH("seek +60s"),variant:"default",disabled:!v,children:"+60s"}),(0,l.jsx)(w.Button,{onClick:()=>tH("seek -10s"),variant:"default",disabled:!v,children:"-10s"}),(0,l.jsx)(w.Button,{onClick:()=>tH("seek +10s"),variant:"default",disabled:!v,children:"+10s"})]}),(0,l.jsx)(C.Divider,{label:"Volume",my:"xs"}),(0,l.jsxs)(eZ.SimpleGrid,{cols:2,children:[(0,l.jsx)(w.Button,{onClick:()=>tH("voldown 1"),variant:"default",disabled:!v,children:"Vol -"}),(0,l.jsx)(w.Button,{onClick:()=>tH("volup 1"),variant:"default",disabled:!v,children:"Vol +"})]}),(0,l.jsx)(C.Divider,{label:"Playback rate",my:"xs"}),(0,l.jsxs)(eZ.SimpleGrid,{cols:3,children:[(0,l.jsx)(w.Button,{onClick:()=>tH("slower"),variant:"default",disabled:!v,children:"Slower"}),(0,l.jsx)(w.Button,{onClick:()=>tH("normal"),variant:"default",disabled:!v,children:"Normal"}),(0,l.jsx)(w.Button,{onClick:()=>tH("faster"),variant:"default",disabled:!v,children:"Faster"})]}),(0,l.jsx)(C.Divider,{label:"Toggles",my:"xs"}),(0,l.jsxs)(eZ.SimpleGrid,{cols:3,children:[(0,l.jsx)(w.Button,{size:"xs",variant:tJ?.loop?"filled":"default",onClick:()=>tH("loop"),disabled:!v,children:"Loop"}),(0,l.jsx)(w.Button,{size:"xs",variant:tJ?.repeat?"filled":"default",onClick:()=>tH("repeat"),disabled:!v,children:"Repeat"}),(0,l.jsx)(w.Button,{size:"xs",variant:tJ?.random?"filled":"default",onClick:()=>tH("random"),disabled:!v,children:"Random"})]}),(0,l.jsx)(C.Divider,{label:"Custom command",my:"xs"}),(0,l.jsx)(tp.TextInput,{value:tc,onChange:e=>tm(e.currentTarget.value),placeholder:"e.g. volume 150",onKeyDown:e=>"Enter"===e.key&&tX(),disabled:!v}),(0,l.jsx)(w.Button,{fullWidth:!0,onClick:tX,loading:tw,disabled:!v,children:"Execute"})]})})}),(0,l.jsx)(u.AppShell.Main,{children:v?(0,l.jsxs)(tl.Stack,{gap:"md",children:[(0,l.jsxs)(T.Card,{withBorder:!0,children:[(0,l.jsxs)(Z.Group,{justify:"space-between",mb:4,children:[(0,l.jsx)(ts.Text,{size:"sm",children:tI(tJ?.time??0)}),(0,l.jsx)(ts.Text,{size:"sm",c:"dimmed",children:tI(tJ?.length??0)})]}),(0,l.jsxs)("div",{ref:tO,onClick:e=>{if(!tO.current||!tJ?.length)return;let t=tO.current.getBoundingClientRect(),r=Math.min(100,Math.max(0,(e.clientX-t.left)/t.width*100));tH(`seek ${r.toFixed(1)}%`)},onMouseMove:e=>{if(!tO.current||!tJ?.length)return;let t=tO.current.getBoundingClientRect(),r=Math.min(100,Math.max(0,(e.clientX-t.left)/t.width*100));tD(r),tL(r/100*tJ.length)},onMouseLeave:()=>tD(null),style:{position:"relative",cursor:tJ?.length?"pointer":"default",padding:"8px 0"},children:[(0,l.jsx)(eH.Progress,{value:(tJ?.position??0)*100,animated:tJ?.state==="playing",size:"lg"}),null!==tV&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("div",{style:{position:"absolute",top:4,left:`${tV}%`,width:2,height:"calc(100% - 8px)",background:"var(--mantine-color-gray-6)",pointerEvents:"none"}}),(0,l.jsx)("div",{style:{position:"absolute",top:-20,left:`${tV}%`,transform:"translateX(-50%)",background:"var(--mantine-color-dark-6)",color:"white",fontSize:11,padding:"2px 6px",borderRadius:4,pointerEvents:"none",whiteSpace:"nowrap"},children:tI(tA??0)})]})]})]}),(0,l.jsxs)(T.Card,{withBorder:!0,children:[(0,l.jsx)(tg.Title,{order:5,mb:"sm",children:"Live Stream Controls"}),(0,l.jsxs)(q,{align:"flex-end",children:[(0,l.jsx)(q.Col,{span:{base:12,md:4},children:(0,l.jsxs)(Z.Group,{gap:"xs",align:"flex-end",children:[(0,l.jsx)(s.ActionIcon,{variant:"light",size:"lg",onClick:()=>{v&&(tn?(tU(tu||100),ta(!1)):(td(tt),tU(0),ta(!0)))},color:tn?"red":"blue",style:{marginBottom:4},children:tn?(0,l.jsx)(tz,{size:18}):(0,l.jsx)(tB,{size:18})}),(0,l.jsxs)("div",{style:{flex:1},children:[(0,l.jsxs)(ts.Text,{size:"xs",c:"dimmed",mb:4,children:["Volume: ",tt,"%"]}),(0,l.jsx)(ti,{value:tt,onChange:tU,min:0,max:150,step:1,label:e=>`${e}%`})]})]})}),(0,l.jsx)(q.Col,{span:{base:12,md:4},children:(0,l.jsx)(eq.Select,{label:"Live Audio Track",placeholder:0===e6.length?"No audio tracks":"Select audio track",value:null!==e8?String(e8):"",onChange:e=>e&&tK("audio",Number(e)),disabled:0===e6.length,data:e6.map(e=>({value:String(e.vlc_index),label:`Track ${e.vlc_index} [${e.language.toUpperCase()}] (${e.title||e.codec})`}))})}),(0,l.jsx)(q.Col,{span:{base:12,md:4},children:(0,l.jsx)(eq.Select,{label:"Live Subtitle Track",placeholder:"None / Disabled",value:null!==e9?String(e9):"none",onChange:e=>tK("subtitle","none"===e?-1:Number(e)),disabled:0===e5.length,data:[{value:"none",label:"None / Disabled"},...e5.map(e=>({value:String(e.vlc_index),label:`Track ${e.vlc_index} [${e.language.toUpperCase()}] (${e.title||e.codec})`}))]})})]})]}),(0,l.jsxs)(q,{children:[(0,l.jsx)(q.Col,{span:{base:12,md:6},children:(0,l.jsxs)(T.Card,{withBorder:!0,h:"100%",children:[(0,l.jsx)(tg.Title,{order:5,mb:"sm",children:"Playback"}),(0,l.jsxs)(eZ.SimpleGrid,{cols:2,spacing:"xs",children:[(0,l.jsx)(ts.Text,{size:"sm",c:"dimmed",children:"State"}),(0,l.jsx)(ts.Text,{size:"sm",children:tJ?.state??"—"}),(0,l.jsx)(ts.Text,{size:"sm",c:"dimmed",children:"Volume"}),(0,l.jsx)(ts.Text,{size:"sm",children:tJ?.volume??"—"}),(0,l.jsx)(ts.Text,{size:"sm",c:"dimmed",children:"Rate"}),(0,l.jsxs)(ts.Text,{size:"sm",children:[tJ?.rate??"—","x"]}),(0,l.jsx)(ts.Text,{size:"sm",c:"dimmed",children:"Loop / Repeat / Random"}),(0,l.jsxs)(ts.Text,{size:"sm",children:[tJ?.loop?"on":"off"," / ",tJ?.repeat?"on":"off"," / ",tJ?.random?"on":"off"]})]})]})}),(0,l.jsx)(q.Col,{span:{base:12,md:6},children:(0,l.jsxs)(T.Card,{withBorder:!0,h:"100%",children:[(0,l.jsx)(tg.Title,{order:5,mb:"sm",children:"Metadata"}),(0,l.jsxs)(eZ.SimpleGrid,{cols:2,spacing:"xs",children:[(0,l.jsx)(ts.Text,{size:"sm",c:"dimmed",children:"Title"}),(0,l.jsx)(ts.Text,{size:"sm",truncate:!0,children:t0?.title??"—"}),(0,l.jsx)(ts.Text,{size:"sm",c:"dimmed",children:"Filename"}),(0,l.jsx)(ts.Text,{size:"sm",truncate:!0,children:t0?.filename??"—"}),(0,l.jsx)(ts.Text,{size:"sm",c:"dimmed",children:"Duration"}),(0,l.jsx)(ts.Text,{size:"sm",children:t0?.DURATION??"—"})]})]})}),(0,l.jsx)(q.Col,{span:{base:12,md:4},children:(0,l.jsxs)(T.Card,{withBorder:!0,h:"100%",children:[(0,l.jsx)(tg.Title,{order:5,mb:"sm",children:"Video"}),t1?(0,l.jsxs)(eZ.SimpleGrid,{cols:2,spacing:"xs",children:[(0,l.jsx)(ts.Text,{size:"sm",c:"dimmed",children:"Codec"}),(0,l.jsx)(ts.Text,{size:"sm",children:t1.Codec}),(0,l.jsx)(ts.Text,{size:"sm",c:"dimmed",children:"Resolution"}),(0,l.jsx)(ts.Text,{size:"sm",children:t1.Video_resolution}),(0,l.jsx)(ts.Text,{size:"sm",c:"dimmed",children:"Frame rate"}),(0,l.jsx)(ts.Text,{size:"sm",children:t1.Frame_rate})]}):(0,l.jsx)(ts.Text,{size:"sm",c:"dimmed",children:"No video stream"})]})}),(0,l.jsx)(q.Col,{span:{base:12,md:4},children:(0,l.jsxs)(T.Card,{withBorder:!0,h:"100%",children:[(0,l.jsx)(tg.Title,{order:5,mb:"sm",children:"Audio"}),t2?(0,l.jsxs)(eZ.SimpleGrid,{cols:2,spacing:"xs",children:[(0,l.jsx)(ts.Text,{size:"sm",c:"dimmed",children:"Codec"}),(0,l.jsx)(ts.Text,{size:"sm",children:t2.Codec}),(0,l.jsx)(ts.Text,{size:"sm",c:"dimmed",children:"Sample rate"}),(0,l.jsx)(ts.Text,{size:"sm",children:t2.Sample_rate}),(0,l.jsx)(ts.Text,{size:"sm",c:"dimmed",children:"Language"}),(0,l.jsx)(ts.Text,{size:"sm",children:t2.Language??"—"})]}):(0,l.jsx)(ts.Text,{size:"sm",c:"dimmed",children:"No audio stream"})]})}),(0,l.jsx)(q.Col,{span:{base:12,md:4},children:(0,l.jsxs)(T.Card,{withBorder:!0,h:"100%",children:[(0,l.jsx)(tg.Title,{order:5,mb:"sm",children:"Subtitles"}),t6?(0,l.jsxs)(eZ.SimpleGrid,{cols:2,spacing:"xs",children:[(0,l.jsx)(ts.Text,{size:"sm",c:"dimmed",children:"Codec"}),(0,l.jsx)(ts.Text,{size:"sm",children:t6.Codec}),(0,l.jsx)(ts.Text,{size:"sm",c:"dimmed",children:"Description"}),(0,l.jsx)(ts.Text,{size:"sm",children:t6.Description})]}):(0,l.jsx)(ts.Text,{size:"sm",c:"dimmed",children:"No subtitle stream"})]})}),(0,l.jsx)(q.Col,{span:12,children:(0,l.jsxs)(T.Card,{withBorder:!0,children:[(0,l.jsxs)(tg.Title,{order:5,mb:"sm",children:["All Streams (",tQ.length,")"]}),(0,l.jsx)(eZ.SimpleGrid,{cols:{base:1,sm:2,lg:3},children:tQ.map(([e,t])=>(0,l.jsxs)(T.Card,{withBorder:!0,padding:"xs",children:[(0,l.jsx)(ts.Text,{size:"sm",fw:600,mb:4,children:e}),Object.entries(t).map(([e,t])=>(0,l.jsxs)(Z.Group,{justify:"space-between",gap:"xs",children:[(0,l.jsx)(ts.Text,{size:"xs",c:"dimmed",children:e}),(0,l.jsx)(ts.Text,{size:"xs",children:t})]},e))]},e))})]})})]}),(0,l.jsxs)(T.Card,{withBorder:!0,children:[(0,l.jsx)(tg.Title,{order:5,mb:"sm",children:"Command Log"}),(0,l.jsx)(eX.ScrollArea,{h:220,children:(0,l.jsxs)(tl.Stack,{gap:4,children:[0===th.length&&(0,l.jsx)(ts.Text,{size:"sm",c:"dimmed",children:"No commands sent yet."}),th.map(e=>(0,l.jsxs)(Z.Group,{justify:"space-between",wrap:"nowrap",children:[(0,l.jsx)(ts.Text,{size:"xs",c:"dimmed",children:e.timestamp}),(0,l.jsx)(ts.Text,{size:"xs",fw:600,children:e.command}),(0,l.jsx)(d.Badge,{size:"xs",color:"error"===e.response.status?"red":"green",children:e.response.status}),(0,l.jsx)(ts.Text,{size:"xs",c:"dimmed",truncate:!0,style:{flex:1},children:e.response.message})]},e.id))]})}),(0,l.jsx)(tv,{mt:"sm",label:"Raw status",value:JSON.stringify(b,null,2),readOnly:!0,autosize:!0,minRows:4,maxRows:10})]}),(0,l.jsxs)(T.Card,{withBorder:!0,children:[(0,l.jsx)(tg.Title,{order:5,mb:"sm",children:"VLC System Logs"}),(0,l.jsx)(eX.ScrollArea,{h:250,style:{backgroundColor:"var(--mantine-color-dark-8)",borderRadius:"4px",padding:"8px"},children:(0,l.jsxs)(tl.Stack,{gap:2,children:[0===e1.length&&(0,l.jsx)(ts.Text,{size:"xs",c:"dimmed",style:{fontFamily:"monospace"},children:"No logs yet..."}),e1.map((e,t)=>{let r="white";return(e.toLowerCase().includes("error")||e.toLowerCase().includes("failed"))&&(r="var(--mantine-color-red-3)"),(0,l.jsx)(ts.Text,{size:"xs",style:{fontFamily:"monospace",color:r,whiteSpace:"pre-wrap"},children:e},t)})]})})]})]}):(0,l.jsxs)(T.Card,{withBorder:!0,children:[(0,l.jsx)(ts.Text,{c:"dimmed",children:"No instance selected. Start a new VLC stream to begin."}),(0,l.jsx)(w.Button,{mt:"sm",leftSection:(0,l.jsx)(tk.IconPlus,{size:16}),onClick:eC,children:"Start VLC"})]})}),(0,l.jsx)(J.Modal,{opened:i,onClose:m,title:en?"Configure Stream Settings":"Start a new VLC stream",children:(0,l.jsxs)(tl.Stack,{gap:"sm",children:[(0,l.jsxs)(Z.Group,{align:"flex-end",gap:"xs",children:[(0,l.jsx)(tp.TextInput,{label:"Video path",description:"Relative to the server's movies folder, or an absolute path",placeholder:String.raw`bbb_sunflower_1080p_30fps_normal.mp4`,value:j,onChange:e=>N(e.currentTarget.value),required:!0,style:{flex:1}}),(0,l.jsx)(w.Button,{variant:"default",onClick:eE,children:"Browse..."})]}),eJ&&(0,l.jsx)(ts.Text,{size:"xs",c:"dimmed",children:"Probing video file tracks..."}),eQ&&(0,l.jsxs)(ts.Text,{size:"xs",c:"red",children:["Failed to probe tracks: ",eQ]}),!eJ&&!eQ&&eL.length>0&&(0,l.jsx)(eq.Select,{label:"Audio Track",placeholder:"Select audio track",value:null!==e$?String(e$):"",onChange:e=>eG(e?Number(e):null),data:eL.map(e=>({value:String(e.vlc_index),label:`Track ${e.vlc_index} [${e.language.toUpperCase()}] (${e.title||e.codec})`}))}),!eJ&&!eQ&&eF.length>0&&(0,l.jsx)(eq.Select,{label:"Subtitle Track",placeholder:"None",value:null!==eW?String(eW):"none",onChange:e=>eU("none"===e?null:Number(e)),data:[{value:"none",label:"None / Disabled"},...eF.map(e=>({value:String(e.vlc_index),label:`Track ${e.vlc_index} [${e.language.toUpperCase()}] (${e.title||e.codec})`}))]}),null!==eg&&eg>0&&(0,l.jsx)(k.Checkbox,{label:`Resume playback from last position: ${tI(eg)}`,checked:eb,onChange:e=>eS(e.currentTarget.checked)}),ej&&(0,l.jsx)(eq.Select,{label:"Folder Playlist Sort Order",value:ew,onChange:e=>eT(e||"natural"),data:[{value:"natural",label:"Natural Alphanumeric (1, 2, ... 10)"},{value:"ctime_oldest",label:"Date Created (Oldest First)"},{value:"ctime_newest",label:"Date Created (Newest First)"}]}),(0,l.jsx)(tp.TextInput,{label:"Instance name",placeholder:"optional label, defaults to a random id",value:eo,onChange:e=>es(e.currentTarget.value)}),(0,l.jsx)(tp.TextInput,{label:"Twitch stream key",placeholder:"live_xxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx",value:E,onChange:e=>_(e.currentTarget.value)}),(0,l.jsx)(tp.TextInput,{label:"Or full RTMP URL",description:"Overrides stream key if set",placeholder:"rtmp://live.twitch.tv/app/...",value:B,onChange:e=>z(e.currentTarget.value)}),(0,l.jsx)(to.Switch,{label:"Loop video",checked:R,onChange:e=>I(e.currentTarget.checked)}),(0,l.jsxs)(eZ.SimpleGrid,{cols:3,children:[(0,l.jsx)(eK,{label:"Video kbps",value:M,onChange:e=>V(Number(e)),min:200}),(0,l.jsx)(eK,{label:"Audio kbps",value:D,onChange:e=>A(Number(e)),min:32}),(0,l.jsx)(eK,{label:"FPS",value:L,onChange:e=>O(Number(e)),min:1,max:60})]}),(0,l.jsx)(to.Switch,{label:"Show advanced transcode settings",checked:et,onChange:e=>er(e.currentTarget.checked)}),et&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(C.Divider,{label:"Advanced transcode options"}),(0,l.jsxs)(eZ.SimpleGrid,{cols:3,children:[(0,l.jsx)(tp.TextInput,{label:"Video Codec",placeholder:"h264",value:$,onChange:e=>G(e.currentTarget.value)}),(0,l.jsx)(tp.TextInput,{label:"Audio Codec",placeholder:"mp4a",value:W,onChange:e=>U(e.currentTarget.value)}),(0,l.jsx)(tp.TextInput,{label:"Scale",placeholder:"Auto",value:F,onChange:e=>P(e.currentTarget.value)})]}),(0,l.jsxs)(eZ.SimpleGrid,{cols:3,children:[(0,l.jsx)(eK,{label:"Samplerate",value:K,onChange:e=>H(Number(e)),min:8e3}),(0,l.jsx)(tp.TextInput,{label:"Preset",placeholder:"veryfast",value:X,onChange:e=>Y(e.currentTarget.value)}),(0,l.jsx)(eK,{label:"Keyframe interval",value:Q,onChange:e=>ee(Number(e)),min:1})]})]}),ec&&(0,l.jsx)(ts.Text,{size:"sm",c:"red",children:ec}),(0,l.jsx)(w.Button,{onClick:()=>{(em(null),j.trim())?E.trim()||B.trim()?(E.trim()?localStorage.setItem("twitch_stream_key",E.trim()):localStorage.removeItem("twitch_stream_key"),B.trim()?localStorage.setItem("rtmp_url",B.trim()):localStorage.removeItem("rtmp_url"),ed(!0),fetch(en&&v?tR.default.RECONFIGURE(v):tR.default.START(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({video_path:j,stream_key:E||void 0,rtmp_url:B||void 0,loop:R,video_bitrate:M,audio_bitrate:D,fps:L,name:eo||void 0,audio_track:null!==e$?e$:void 0,sub_track:null!==eW?eW:void 0,scale:F,vcodec:$,acodec:W,samplerate:K,preset:X,keyint:Q,start_time:eb&&eg?eg:void 0,sort_by:ej?ew:void 0})}).then(async e=>{let t=await e.json();if(!e.ok)throw Error(t?.detail??"Failed to start VLC");return t}).then(e=>{f(t=>t.some(t=>t.id===e.id)?t.map(t=>t.id===e.id?e:t):[...t,e]),p(e.id),m(),N(""),es(""),tW()}).catch(e=>em(String(e.message??e))).finally(()=>ed(!1))):em("Provide a stream key or a full RTMP URL."):em("Video path is required.")},loading:eu,fullWidth:!0,children:en?"Reconfigure & Restart Stream":"Start VLC"})]})}),(0,l.jsx)(J.Modal,{opened:eN,onClose:e_,title:"Browse Movies",size:"lg",children:(0,l.jsxs)(tl.Stack,{gap:"sm",children:[(0,l.jsxs)(Z.Group,{justify:"space-between",align:"center",children:[(0,l.jsxs)(Z.Group,{gap:"xs",children:[eB&&(0,l.jsx)(s.ActionIcon,{variant:"subtle",onClick:()=>{let e=eB.split("/").filter(Boolean);e.pop(),ez(e.join("/"))},title:"Go back",children:(0,l.jsx)(tj.IconArrowLeft,{size:18})}),(0,l.jsxs)(ts.Text,{size:"sm",fw:500,children:["Path: ",(0,l.jsxs)("span",{style:{fontFamily:"monospace"},children:["/ ",eB||"(root)"]})]})]}),eB&&(0,l.jsx)(w.Button,{size:"xs",variant:"subtle",onClick:()=>ez(""),children:"Root"})]}),(0,l.jsx)(C.Divider,{}),eM?(0,l.jsx)(ts.Text,{size:"sm",c:"dimmed",ta:"center",py:"xl",children:"Loading directory contents..."}):eD?(0,l.jsxs)(ts.Text,{size:"sm",c:"red",ta:"center",py:"xl",children:["Error: ",eD]}):(0,l.jsx)(eX.ScrollArea,{h:350,type:"auto",children:(0,l.jsx)(tl.Stack,{gap:"xs",children:eR&&(0!==(eR.subfolders||[]).length||0!==(eR.files||[]).length)?(0,l.jsxs)(l.Fragment,{children:[(eR.subfolders||[]).map(e=>(0,l.jsx)(T.Card,{withBorder:!0,padding:"xs",shadow:"none",style:{cursor:"pointer"},onClick:()=>{ez(eB?`${eB}/${e}`:e)},children:(0,l.jsxs)(Z.Group,{gap:"sm",children:[(0,l.jsx)(ty.IconFolder,{size:20,color:"var(--mantine-color-blue-6)"}),(0,l.jsx)(ts.Text,{size:"sm",fw:500,children:e})]})},e)),(eR.files||[]).map(e=>(0,l.jsx)(T.Card,{withBorder:!0,padding:"xs",shadow:"none",style:{cursor:"pointer"},onClick:()=>{N(eB?`${eB}/${e}`:e),e_()},children:(0,l.jsxs)(Z.Group,{gap:"sm",children:[(0,l.jsx)(tT,{size:20,color:"var(--mantine-color-teal-6)"}),(0,l.jsx)(ts.Text,{size:"sm",style:{wordBreak:"break-all"},children:e})]})},e))]}):(0,l.jsx)(ts.Text,{size:"sm",c:"dimmed",ta:"center",py:"xl",children:"This directory is empty."})})})]})})]})})}],31713)}]);
|
out/_next/static/chunks/2v-rv291cn1b-.css
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
out/_next/static/chunks/3rxl-jt3pdxgx.js
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
out/_next/static/chunks/3sfsn9t1uaymg.js
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
out/_next/static/chunks/3y0d2nz4u4vwb.js
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
out/_next/static/chunks/turbopack-3v560ngbdsqcf.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,{otherChunks:["static/chunks/1u8kf-cumb-f7.js","static/chunks/2dkoocrktt9k-.js","static/chunks/3rxl-jt3pdxgx.js"],runtimeModuleIds:[94553]}]),(()=>{let e;if(!Array.isArray(globalThis.TURBOPACK))return;let t="/_next/",r=function(){if(null!=self.TURBOPACK_ASSET_SUFFIX)return self.TURBOPACK_ASSET_SUFFIX;let e=document?.currentScript?.getAttribute?.("src")??"",t=e.indexOf("?");return t>=0?e.slice(t):""}(),n=["NEXT_DEPLOYMENT_ID","NEXT_CLIENT_ASSET_SUFFIX"];var o,l=((o=l||{})[o.Runtime=0]="Runtime",o[o.Parent=1]="Parent",o[o.Update=2]="Update",o);let i=new WeakMap;function u(e,t){this.m=e,this.e=t}let s=u.prototype,a=Object.prototype.hasOwnProperty,c="u">typeof Symbol&&Symbol.toStringTag;function f(e,t,r){a.call(e,t)||Object.defineProperty(e,t,r)}function p(e,t){let r=e[t];return r||(r=h(t),e[t]=r),r}function h(e){return{exports:{},error:void 0,id:e,namespaceObject:void 0}}function d(e,t){f(e,"__esModule",{value:!0}),c&&f(e,c,{value:"Module"});let r=0;for(;r<t.length;){let n=t[r++],o=t[r++];if("number"==typeof o)if(0===o)f(e,n,{value:t[r++],enumerable:!0,writable:!1});else throw Error(`unexpected tag: ${o}`);else"function"==typeof t[r]?f(e,n,{get:o,set:t[r++],enumerable:!0}):f(e,n,{get:o,enumerable:!0})}Object.seal(e)}function m(e,t){(null!=t?p(this.c,t):this.m).exports=e}s.s=function(e,t){let r,n;null!=t?n=(r=p(this.c,t)).exports:(r=this.m,n=this.e),r.namespaceObject=n,d(n,e)},s.j=function(e,t){var r,n;let o,l,u;null!=t?l=(o=p(this.c,t)).exports:(o=this.m,l=this.e);let s=(r=o,n=l,(u=i.get(r))||(i.set(r,u=[]),r.exports=r.namespaceObject=new Proxy(n,{get(e,t){if(a.call(e,t)||"default"===t||"__esModule"===t)return Reflect.get(e,t);for(let e of u){let r=Reflect.get(e,t);if(void 0!==r)return r}},ownKeys(e){let t=Reflect.ownKeys(e);for(let e of u)for(let r of Reflect.ownKeys(e))"default"===r||t.includes(r)||t.push(r);return t}})),u);"object"==typeof e&&null!==e&&s.push(e)},s.v=m,s.n=function(e,t){let r;(r=null!=t?p(this.c,t):this.m).exports=r.namespaceObject=e};let b=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,y=[null,b({}),b([]),b(b)];function g(e,t,r){let n=[],o=-1;for(let t=e;("object"==typeof t||"function"==typeof t)&&!y.includes(t);t=b(t))for(let r of Object.getOwnPropertyNames(t))n.push(r,function(e,t){return()=>e[t]}(e,r)),-1===o&&"default"===r&&(o=n.length-1);return r&&o>=0||(o>=0?n.splice(o,1,0,e):n.push("default",0,e)),d(t,n),t}function O(e){let t=B(e,this.m);if(t.namespaceObject)return t.namespaceObject;let r=t.exports;return t.namespaceObject=g(r,"function"==typeof r?function(...e){return r.apply(this,e)}:Object.create(null),r&&r.__esModule)}function w(e){let t=e.indexOf("#");-1!==t&&(e=e.substring(0,t));let r=e.indexOf("?");return -1!==r&&(e=e.substring(0,r)),e}function k(){let e,t;return{promise:new Promise((r,n)=>{t=n,e=r}),resolve:e,reject:t}}s.i=O,s.A=function(e){return this.r(e)(O.bind(this))},s.t="function"==typeof require?require:function(){throw Error("Unexpected use of runtime require")},s.r=function(e){return B(e,this.m).exports},s.f=function(e){function t(t){if(t=w(t),a.call(e,t))return e[t].module();let r=Error(`Cannot find module '${t}'`);throw r.code="MODULE_NOT_FOUND",r}return t.keys=()=>Object.keys(e),t.resolve=t=>{if(t=w(t),a.call(e,t))return e[t].id();let r=Error(`Cannot find module '${t}'`);throw r.code="MODULE_NOT_FOUND",r},t.import=async e=>await t(e),t};let j=Symbol("turbopack queues"),U=Symbol("turbopack exports"),C=Symbol("turbopack error");function P(e){e&&1!==e.status&&(e.status=1,e.forEach(e=>e.queueCount--),e.forEach(e=>e.queueCount--?e.queueCount++:e()))}s.a=function(e,t){let r=this.m,n=t?Object.assign([],{status:-1}):void 0,o=new Set,{resolve:l,reject:i,promise:u}=k(),s=Object.assign(u,{[U]:r.exports,[j]:e=>{n&&e(n),o.forEach(e),s.catch(()=>{})}}),a={get:()=>s,set(e){e!==s&&(s[U]=e)}};Object.defineProperty(r,"exports",a),Object.defineProperty(r,"namespaceObject",a),e(function(e){let t=e.map(e=>{if(null!==e&&"object"==typeof e){if(j in e)return e;if(null!=e&&"object"==typeof e&&"then"in e&&"function"==typeof e.then){let t=Object.assign([],{status:0}),r={[U]:{},[j]:e=>e(t)};return e.then(e=>{r[U]=e,P(t)},e=>{r[C]=e,P(t)}),r}}return{[U]:e,[j]:()=>{}}}),r=()=>t.map(e=>{if(e[C])throw e[C];return e[U]}),{promise:l,resolve:i}=k(),u=Object.assign(()=>i(r),{queueCount:0});function s(e){e!==n&&!o.has(e)&&(o.add(e),e&&0===e.status&&(u.queueCount++,e.push(u)))}return t.map(e=>e[j](s)),u.queueCount?l:r()},function(e){e?i(s[C]=e):l(s[U]),P(n)}),n&&-1===n.status&&(n.status=0)};let v=function(e){let t=new URL(e,"x:/"),r={};for(let e in t)r[e]=t[e];for(let t in r.href=e,r.pathname=e.replace(/[?#].*/,""),r.origin=r.protocol="",r.toString=r.toJSON=(...t)=>e,r)Object.defineProperty(this,t,{enumerable:!0,configurable:!0,value:r[t]})};function R(e,t){throw Error(`Invariant: ${t(e)}`)}v.prototype=URL.prototype,s.U=v,s.z=function(e){throw Error("dynamic usage of require is not supported")},s.g=globalThis;let S=u.prototype,$=new Map;s.M=$;let E=new Map,_=new Map;async function T(e,t,r){let n;if("string"==typeof r)return M(e,t,N(r));let o=r.included||[],l=o.map(e=>!!$.has(e)||E.get(e));if(l.length>0&&l.every(e=>e))return void await Promise.all(l);let i=r.moduleChunks||[],u=i.map(e=>_.get(e)).filter(e=>e);if(u.length>0){if(u.length===i.length)return void await Promise.all(u);let r=new Set;for(let e of i)_.has(e)||r.add(e);for(let n of r){let r=M(e,t,N(n));_.set(n,r),u.push(r)}n=Promise.all(u)}else{for(let o of(n=M(e,t,N(r.path)),i))_.has(o)||_.set(o,n)}for(let e of o)E.has(e)||E.set(e,n);await n}S.l=function(e){return T(l.Parent,this.m.id,e)};let x=Promise.resolve(void 0),A=new WeakMap;function M(t,r,n){let o=e.loadChunkCached(t,n),i=A.get(o);if(void 0===i){let e=A.set.bind(A,o,x);i=o.then(e).catch(e=>{let o;switch(t){case l.Runtime:o=`as a runtime dependency of chunk ${r}`;break;case l.Parent:o=`from module ${r}`;break;case l.Update:o="from an HMR update";break;default:R(t,e=>`Unknown source type: ${e}`)}let i=Error(`Failed to load chunk ${n} ${o}${e?`: ${e}`:""}`,e?{cause:e}:void 0);throw i.name="ChunkLoadError",i}),A.set(o,i)}return i}function N(e){return`${t}${e.split("/").map(e=>encodeURIComponent(e)).join("/")}${r}`}S.L=function(e){return M(l.Parent,this.m.id,e)},S.R=function(e){let t=this.r(e);return t?.default??t},S.P=function(e){return`/ROOT/${e??""}`},S.q=function(e,t){m.call(this,`${e}${r}`,t)},S.b=function(e,t,o,l){let i="SharedWorker"===e.name,u=[o.map(e=>N(e)).reverse(),r];for(let e of n)u.push(globalThis[e]);let s=new URL(N(t),location.origin),a=JSON.stringify(u);return i?s.searchParams.set("params",a):s.hash="#params="+encodeURIComponent(a),new e(s,l?{...l,type:void 0}:void 0)};let K=/\.js(?:\?[^#]*)?(?:#.*)?$/,q=/\.css(?:\?[^#]*)?(?:#.*)?$/;function L(e){return q.test(e)}s.w=function(t,r,n){return e.loadWebAssembly(l.Parent,this.m.id,t,r,n)},s.u=function(t,r){return e.loadWebAssemblyModule(l.Parent,this.m.id,t,r)};let I={};s.c=I;let B=(e,t)=>{let r=I[e];if(r){if(r.error)throw r.error;return r}return W(e,l.Parent,t.id)};function W(e,t,r){let n=$.get(e);if("function"!=typeof n)throw Error(function(e,t,r){let n;switch(t){case 0:n=`as a runtime entry of chunk ${r}`;break;case 1:n=`because it was required from module ${r}`;break;case 2:n="because of an HMR update";break;default:R(t,e=>`Unknown source type: ${e}`)}return`Module ${e} was instantiated ${n}, but the module factory is not available.`}(e,t,r));let o=h(e),l=o.exports;I[e]=o;let i=new u(o,l);try{n(i,o,l)}catch(e){throw o.error=e,e}return o.namespaceObject&&o.exports!==o.namespaceObject&&g(o.exports,o.namespaceObject),o}function F(t){let r,n=function(e){if("string"==typeof e)return e;if(e)return{src:e.getAttribute("src")};if("u">typeof TURBOPACK_NEXT_CHUNK_URLS)return{src:TURBOPACK_NEXT_CHUNK_URLS.pop()};throw Error("chunk path empty but not in a worker")}(t[0]);return 2===t.length?r=t[1]:(r=void 0,!function(e,t){let r=1;for(;r<e.length;){let n,o=r+1;for(;o<e.length&&"function"!=typeof e[o];)o++;if(o===e.length)throw Error("malformed chunk format, expected a factory function");let l=e[o];for(let l=r;l<o;l++){let r=e[l],o=t.get(r);if(o){n=o;break}}let i=n??l,u=!1;for(let n=r;n<o;n++){let r=e[n];t.has(r)||(u||(i===l&&Object.defineProperty(l,"name",{value:"module evaluation"}),u=!0),t.set(r,i))}r=o+1}}(t,$)),e.registerChunk(n,r)}let X=new Map;function D(e){let t=X.get(e);if(!t){let r,n;t={resolved:!1,loadingStarted:!1,promise:new Promise((e,t)=>{r=e,n=t}),resolve:()=>{t.resolved=!0,r()},reject:n},X.set(e,t)}return t}e={async registerChunk(e,r){let n=function(e){if("string"==typeof e)return e;let r=decodeURIComponent(e.src.replace(/[?#].*$/,""));return r.startsWith(t)?r.slice(t.length):r}(e);if(D("string"==typeof e?N(e):e.src).resolve(),null!=r){for(let e of r.otherChunks)D(N("string"==typeof e?e:e.path));if(await Promise.all(r.otherChunks.map(e=>T(l.Runtime,n,e))),r.runtimeModuleIds.length>0)for(let e of r.runtimeModuleIds)!function(e,t){let r=I[t];if(r){if(r.error)throw r.error;return}W(t,l.Runtime,e)}(n,e)}},loadChunkCached:(e,t)=>(function(e,t){let r=D(t);if(r.loadingStarted)return r.promise;if(e===l.Runtime)return r.loadingStarted=!0,L(t)&&r.resolve(),r.promise;if("function"==typeof importScripts)if(L(t));else if(K.test(t))self.TURBOPACK_NEXT_CHUNK_URLS.push(t),importScripts(t);else throw Error(`can't infer type of chunk from URL ${t} in worker`);else{let e=decodeURI(t);if(L(t))if(document.querySelectorAll(`link[rel=stylesheet][href="${t}"],link[rel=stylesheet][href^="${t}?"],link[rel=stylesheet][href="${e}"],link[rel=stylesheet][href^="${e}?"]`).length>0)r.resolve();else{let e=document.createElement("link");e.rel="stylesheet",e.href=t,e.onerror=()=>{r.reject()},e.onload=()=>{r.resolve()},document.head.appendChild(e)}else if(K.test(t)){let n=document.querySelectorAll(`script[src="${t}"],script[src^="${t}?"],script[src="${e}"],script[src^="${e}?"]`);if(n.length>0)for(let e of Array.from(n))e.addEventListener("error",()=>{r.reject()});else{let e=document.createElement("script");e.src=t,e.onerror=()=>{r.reject()},document.head.appendChild(e)}}else throw Error(`can't infer type of chunk from URL ${t}`)}return r.loadingStarted=!0,r.promise})(e,t),async loadWebAssembly(e,t,r,n,o){let l=fetch(N(r)),{instance:i}=await WebAssembly.instantiateStreaming(l,o);return i.exports},async loadWebAssemblyModule(e,t,r,n){let o=fetch(N(r));return await WebAssembly.compileStreaming(o)}};let H=globalThis.TURBOPACK;globalThis.TURBOPACK={push:F},H.forEach(F)})();
|
out/_next/static/media/favicon.2vob68tjqpejf.ico
ADDED
|
|
out/_next/static/nBKcDuA1Pt7_3iMhIbjDI/_buildManifest.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
self.__BUILD_MANIFEST = {
|
| 2 |
+
"__rewrites": {
|
| 3 |
+
"afterFiles": [
|
| 4 |
+
{
|
| 5 |
+
"source": "/vlc/:path*"
|
| 6 |
+
},
|
| 7 |
+
{
|
| 8 |
+
"source": "/movies/:path*"
|
| 9 |
+
}
|
| 10 |
+
],
|
| 11 |
+
"beforeFiles": [],
|
| 12 |
+
"fallback": []
|
| 13 |
+
},
|
| 14 |
+
"sortedPages": [
|
| 15 |
+
"/_app",
|
| 16 |
+
"/_error"
|
| 17 |
+
]
|
| 18 |
+
};self.__BUILD_MANIFEST_CB && self.__BUILD_MANIFEST_CB()
|
out/_next/static/nBKcDuA1Pt7_3iMhIbjDI/_clientMiddlewareManifest.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
self.__MIDDLEWARE_MATCHERS = [];self.__MIDDLEWARE_MATCHERS_CB && self.__MIDDLEWARE_MATCHERS_CB()
|
out/_next/static/nBKcDuA1Pt7_3iMhIbjDI/_ssgManifest.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
self.__SSG_MANIFEST=new Set([]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB()
|
out/_not-found/__next._full.txt
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
1:"$Sreact.fragment"
|
| 2 |
+
2:I[29765,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"MantineProvider"]
|
| 3 |
+
3:I[39756,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"default"]
|
| 4 |
+
4:I[37457,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"default"]
|
| 5 |
+
5:I[97367,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"OutletBoundary"]
|
| 6 |
+
6:"$Sreact.suspense"
|
| 7 |
+
9:I[97367,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"ViewportBoundary"]
|
| 8 |
+
b:I[97367,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"MetadataBoundary"]
|
| 9 |
+
d:I[68027,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"default",1]
|
| 10 |
+
:HL["/_next/static/chunks/2v-rv291cn1b-.css","style"]
|
| 11 |
+
0:{"P":null,"c":["","_not-found",""],"q":"","i":false,"f":[[["",{"children":["/_not-found",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/2v-rv291cn1b-.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/0d-c12mml-h6p.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/158myu8e_yme3.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"data-mantine-color-scheme":"light","children":[["$","head",null,{}],["$","body",null,{"children":["$","$L2",null,{"children":["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:style","children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]]}]}]],null,["$","$L5",null,{"children":["$","$6",null,{"name":"Next.MetadataOutlet","children":"$@7"}]}]]}],{},null,false,null]},null,false,"$@8"]},null,false,null],["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$L9",null,{"children":"$La"}],["$","div",null,{"hidden":true,"children":["$","$Lb",null,{"children":["$","$6",null,{"name":"Next.Metadata","children":"$Lc"}]}]}],null]}],false]],"m":"$undefined","G":["$d",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/2v-rv291cn1b-.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"nBKcDuA1Pt7_3iMhIbjDI"}
|
| 12 |
+
e:[]
|
| 13 |
+
8:"$We"
|
| 14 |
+
a:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
|
| 15 |
+
f:I[27201,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"IconMark"]
|
| 16 |
+
7:null
|
| 17 |
+
c:[["$","title","0",{"children":"My Mantine app"}],["$","meta","1",{"name":"description","content":"I have followed setup instructions carefully"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.2vob68tjqpejf.ico","sizes":"256x256","type":"image/x-icon"}],["$","$Lf","3",{}]]
|
out/_not-found/__next._head.txt
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
1:"$Sreact.fragment"
|
| 2 |
+
2:I[97367,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"ViewportBoundary"]
|
| 3 |
+
3:I[97367,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"MetadataBoundary"]
|
| 4 |
+
4:"$Sreact.suspense"
|
| 5 |
+
5:I[27201,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"IconMark"]
|
| 6 |
+
0:{"rsc":["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"My Mantine app"}],["$","meta","1",{"name":"description","content":"I have followed setup instructions carefully"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.2vob68tjqpejf.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L5","3",{}]]}]}]}],null]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"nBKcDuA1Pt7_3iMhIbjDI"}
|
out/_not-found/__next._index.txt
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
1:"$Sreact.fragment"
|
| 2 |
+
2:I[29765,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"MantineProvider"]
|
| 3 |
+
3:I[39756,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"default"]
|
| 4 |
+
4:I[37457,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"default"]
|
| 5 |
+
:HL["/_next/static/chunks/2v-rv291cn1b-.css","style"]
|
| 6 |
+
0:{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/2v-rv291cn1b-.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/0d-c12mml-h6p.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/158myu8e_yme3.js","async":true}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"data-mantine-color-scheme":"light","children":[["$","head",null,{}],["$","body",null,{"children":["$","$L2",null,{"children":["$","$L3",null,{"parallelRouterKey":"children","template":["$","$L4",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}]}]]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"nBKcDuA1Pt7_3iMhIbjDI"}
|
out/_not-found/__next._not-found.txt
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
1:"$Sreact.fragment"
|
| 2 |
+
2:I[39756,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"default"]
|
| 3 |
+
3:I[37457,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"default"]
|
| 4 |
+
4:[]
|
| 5 |
+
0:{"rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"isPartial":false,"staleTime":300,"varyParams":"$W4","buildId":"nBKcDuA1Pt7_3iMhIbjDI"}
|
out/_not-found/__next._not-found/__PAGE__.txt
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
1:"$Sreact.fragment"
|
| 2 |
+
2:I[97367,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"OutletBoundary"]
|
| 3 |
+
3:"$Sreact.suspense"
|
| 4 |
+
0:{"rsc":["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],null,["$","$L2",null,{"children":["$","$3",null,{"name":"Next.MetadataOutlet","children":"$@4"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"nBKcDuA1Pt7_3iMhIbjDI"}
|
| 5 |
+
4:null
|
out/_not-found/__next._tree.txt
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
:HL["/_next/static/chunks/2v-rv291cn1b-.css","style"]
|
| 2 |
+
0:{"tree":{"name":"","param":null,"prefetchHints":16,"slots":{"children":{"name":"/_not-found","param":null,"prefetchHints":0,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}}}},"staleTime":300,"buildId":"nBKcDuA1Pt7_3iMhIbjDI"}
|
out/_not-found/index.html
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html><html lang="en" data-mantine-color-scheme="light"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/2v-rv291cn1b-.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/1u8kf-cumb-f7.js"/><script src="/_next/static/chunks/2dkoocrktt9k-.js" async=""></script><script src="/_next/static/chunks/3rxl-jt3pdxgx.js" async=""></script><script src="/_next/static/chunks/turbopack-3v560ngbdsqcf.js" async=""></script><script src="/_next/static/chunks/0d-c12mml-h6p.js" async=""></script><script src="/_next/static/chunks/158myu8e_yme3.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>My Mantine app</title><meta name="description" content="I have followed setup instructions carefully"/><link rel="icon" href="/favicon.ico?favicon.2vob68tjqpejf.ico" sizes="256x256" type="image/x-icon"/><script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><style data-mantine-styles="true">
|
| 2 |
+
|
| 3 |
+
|
| 4 |
+
|
| 5 |
+
</style><style data-mantine-styles="classes">@media (max-width: 35.99375em) {.mantine-visible-from-xs {display: none !important;}}@media (min-width: 36em) {.mantine-hidden-from-xs {display: none !important;}}@media (max-width: 47.99375em) {.mantine-visible-from-sm {display: none !important;}}@media (min-width: 48em) {.mantine-hidden-from-sm {display: none !important;}}@media (max-width: 61.99375em) {.mantine-visible-from-md {display: none !important;}}@media (min-width: 62em) {.mantine-hidden-from-md {display: none !important;}}@media (max-width: 74.99375em) {.mantine-visible-from-lg {display: none !important;}}@media (min-width: 75em) {.mantine-hidden-from-lg {display: none !important;}}@media (max-width: 87.99375em) {.mantine-visible-from-xl {display: none !important;}}@media (min-width: 88em) {.mantine-hidden-from-xl {display: none !important;}}</style><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/1u8kf-cumb-f7.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[29765,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"MantineProvider\"]\n3:I[39756,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"default\"]\n4:I[37457,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"default\"]\n5:I[97367,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"OutletBoundary\"]\n6:\"$Sreact.suspense\"\n9:I[97367,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"ViewportBoundary\"]\nb:I[97367,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"MetadataBoundary\"]\nd:I[68027,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/2v-rv291cn1b-.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_not-found\",\"\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/2v-rv291cn1b-.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0d-c12mml-h6p.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/158myu8e_yme3.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"data-mantine-color-scheme\":\"light\",\"children\":[[\"$\",\"head\",null,{}],[\"$\",\"body\",null,{\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L5\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@7\"}]}]]}],{},null,false,null]},null,false,\"$@8\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L9\",null,{\"children\":\"$La\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lb\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lc\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/2v-rv291cn1b-.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"nBKcDuA1Pt7_3iMhIbjDI\"}\n"])</script><script>self.__next_f.push([1,"e:[]\n8:\"$We\"\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"f:I[27201,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"IconMark\"]\n7:null\nc:[[\"$\",\"title\",\"0\",{\"children\":\"My Mantine app\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"I have followed setup instructions carefully\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.2vob68tjqpejf.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$Lf\",\"3\",{}]]\n"])</script></body></html>
|
out/_not-found/index.txt
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
1:"$Sreact.fragment"
|
| 2 |
+
2:I[29765,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"MantineProvider"]
|
| 3 |
+
3:I[39756,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"default"]
|
| 4 |
+
4:I[37457,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"default"]
|
| 5 |
+
5:I[97367,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"OutletBoundary"]
|
| 6 |
+
6:"$Sreact.suspense"
|
| 7 |
+
9:I[97367,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"ViewportBoundary"]
|
| 8 |
+
b:I[97367,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"MetadataBoundary"]
|
| 9 |
+
d:I[68027,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"default",1]
|
| 10 |
+
:HL["/_next/static/chunks/2v-rv291cn1b-.css","style"]
|
| 11 |
+
0:{"P":null,"c":["","_not-found",""],"q":"","i":false,"f":[[["",{"children":["/_not-found",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/2v-rv291cn1b-.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/0d-c12mml-h6p.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/158myu8e_yme3.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"data-mantine-color-scheme":"light","children":[["$","head",null,{}],["$","body",null,{"children":["$","$L2",null,{"children":["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:style","children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]]}]}]],null,["$","$L5",null,{"children":["$","$6",null,{"name":"Next.MetadataOutlet","children":"$@7"}]}]]}],{},null,false,null]},null,false,"$@8"]},null,false,null],["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$L9",null,{"children":"$La"}],["$","div",null,{"hidden":true,"children":["$","$Lb",null,{"children":["$","$6",null,{"name":"Next.Metadata","children":"$Lc"}]}]}],null]}],false]],"m":"$undefined","G":["$d",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/2v-rv291cn1b-.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"nBKcDuA1Pt7_3iMhIbjDI"}
|
| 12 |
+
e:[]
|
| 13 |
+
8:"$We"
|
| 14 |
+
a:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
|
| 15 |
+
f:I[27201,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"IconMark"]
|
| 16 |
+
7:null
|
| 17 |
+
c:[["$","title","0",{"children":"My Mantine app"}],["$","meta","1",{"name":"description","content":"I have followed setup instructions carefully"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.2vob68tjqpejf.ico","sizes":"256x256","type":"image/x-icon"}],["$","$Lf","3",{}]]
|
out/favicon.ico
ADDED
|
|
out/file.svg
ADDED
|
|
out/globe.svg
ADDED
|
|
out/index.html
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html><html lang="en" data-mantine-color-scheme="light"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/2v-rv291cn1b-.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/1u8kf-cumb-f7.js"/><script src="/_next/static/chunks/2dkoocrktt9k-.js" async=""></script><script src="/_next/static/chunks/3rxl-jt3pdxgx.js" async=""></script><script src="/_next/static/chunks/turbopack-3v560ngbdsqcf.js" async=""></script><script src="/_next/static/chunks/0d-c12mml-h6p.js" async=""></script><script src="/_next/static/chunks/158myu8e_yme3.js" async=""></script><script src="/_next/static/chunks/2fc-6082kgcrk.js" async=""></script><script src="/_next/static/chunks/3y0d2nz4u4vwb.js" async=""></script><title>My Mantine app</title><meta name="description" content="I have followed setup instructions carefully"/><link rel="icon" href="/favicon.ico?favicon.2vob68tjqpejf.ico" sizes="256x256" type="image/x-icon"/><script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><style data-mantine-styles="true">
|
| 2 |
+
|
| 3 |
+
|
| 4 |
+
|
| 5 |
+
</style><style data-mantine-styles="classes">@media (max-width: 35.99375em) {.mantine-visible-from-xs {display: none !important;}}@media (min-width: 36em) {.mantine-hidden-from-xs {display: none !important;}}@media (max-width: 47.99375em) {.mantine-visible-from-sm {display: none !important;}}@media (min-width: 48em) {.mantine-hidden-from-sm {display: none !important;}}@media (max-width: 61.99375em) {.mantine-visible-from-md {display: none !important;}}@media (min-width: 62em) {.mantine-hidden-from-md {display: none !important;}}@media (max-width: 74.99375em) {.mantine-visible-from-lg {display: none !important;}}@media (min-width: 75em) {.mantine-hidden-from-lg {display: none !important;}}@media (max-width: 87.99375em) {.mantine-visible-from-xl {display: none !important;}}@media (min-width: 88em) {.mantine-hidden-from-xl {display: none !important;}}</style><style data-mantine-styles="true">
|
| 6 |
+
|
| 7 |
+
|
| 8 |
+
|
| 9 |
+
</style><style data-mantine-styles="classes">@media (max-width: 35.99375em) {.mantine-visible-from-xs {display: none !important;}}@media (min-width: 36em) {.mantine-hidden-from-xs {display: none !important;}}@media (max-width: 47.99375em) {.mantine-visible-from-sm {display: none !important;}}@media (min-width: 48em) {.mantine-hidden-from-sm {display: none !important;}}@media (max-width: 61.99375em) {.mantine-visible-from-md {display: none !important;}}@media (min-width: 62em) {.mantine-hidden-from-md {display: none !important;}}@media (max-width: 74.99375em) {.mantine-visible-from-lg {display: none !important;}}@media (min-width: 75em) {.mantine-hidden-from-lg {display: none !important;}}@media (max-width: 87.99375em) {.mantine-visible-from-xl {display: none !important;}}@media (min-width: 88em) {.mantine-hidden-from-xl {display: none !important;}}</style><style data-mantine-styles="inline">:root{--app-shell-navbar-width:calc(18.75rem * var(--mantine-scale));--app-shell-navbar-offset:calc(18.75rem * var(--mantine-scale));--app-shell-header-height:calc(3.75rem * var(--mantine-scale));--app-shell-header-offset:calc(3.75rem * var(--mantine-scale));--app-shell-padding:var(--mantine-spacing-md);}@media(max-width: 47.99375em){:root{--app-shell-navbar-width:100%;--app-shell-navbar-offset:0px;--app-shell-navbar-transform:translateX(calc(var(--app-shell-navbar-width) * -1));--app-shell-navbar-transform-rtl:translateX(var(--app-shell-navbar-width));}}</style><div style="--app-shell-transition-duration:200ms;--app-shell-transition-timing-function:ease" class="m_89ab340 mantine-AppShell-root" data-resizing="true" data-mode="fixed" id="mantine-_R_1lftb_"><header style="--app-shell-header-z-index:100" class="m_3b16f56b mantine-AppShell-header right-scroll-bar-position" data-with-border="true"><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap;width:100%;flex-wrap:nowrap;padding-inline:var(--mantine-spacing-md);height:100%" class="m_4081bf90 mantine-Group-root"><div style="--group-gap:var(--mantine-spacing-xs);--group-align:center;--group-justify:flex-start;--group-wrap:wrap;flex-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><button style="--burger-size:var(--burger-size-sm)" class="mantine-focus-auto m_fea6bf1a mantine-Burger-root m_87cf2631 mantine-UnstyledButton-root mantine-hidden-from-sm" data-size="sm" type="button"><div class="m_d4fb9cad mantine-Burger-burger" data-reduce-motion="true"></div></button><h4 style="--title-fw:var(--mantine-h4-font-weight);--title-lh:var(--mantine-h4-line-height);--title-fz:var(--mantine-h4-font-size);white-space:nowrap" class="m_8a5d1357 mantine-Title-root" data-order="4">The TWITCH WatchParty Bridge</h4></div><div style="--group-gap:var(--mantine-spacing-xs);--group-align:center;--group-justify:flex-start;--group-wrap:wrap;flex-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><a style="--button-height:var(--button-height-sm);--button-padding-x:var(--button-padding-x-sm);--button-fz:var(--mantine-font-size-sm);--button-bg:var(--mantine-color-blue-light);--button-hover:var(--mantine-color-blue-light-hover);--button-color:var(--mantine-color-blue-light-color);--button-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent" class="mantine-focus-auto mantine-active m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" data-variant="light" data-size="sm" data-with-left-section="true" href="/manager"><span class="m_80f1301b mantine-Button-inner"><span class="m_a74036a mantine-Button-section" data-position="left"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-folder "><path d="M5 4h4l3 3h7a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-11a2 2 0 0 1 2 -2"></path></svg></span><span class="m_811560b9 mantine-Button-label">Media Manager</span></span></a><button style="--ai-size:var(--ai-size-lg);--ai-bg:var(--mantine-color-default);--ai-hover:var(--mantine-color-default-hover);--ai-color:var(--mantine-color-default-color);--ai-bd:calc(0.0625rem * var(--mantine-scale)) solid var(--mantine-color-default-border)" class="mantine-focus-auto mantine-active m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="default" data-size="lg" type="button" aria-label="Toggle color scheme"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-moon "><path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454l0 .008"></path></svg></span></button></div></div></header><nav style="--app-shell-navbar-z-index:calc(100 + 1);padding:var(--mantine-spacing-md)" class="m_45252eee mantine-AppShell-navbar" data-with-border="true"><div style="--scrollarea-scrollbar-size:calc(0.375rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px;height:100%" class="m_d57069b5 mantine-ScrollArea-root"><div style="overflow-x:hidden;overflow-y:hidden" class="m_c0783ff9 mantine-ScrollArea-viewport" data-offset-scrollbars="xy" data-scrollbars="xy" data-scrollarea-viewport="true"><div class="m_b1336c6 mantine-ScrollArea-content"><div style="--stack-gap:var(--mantine-spacing-xs);--stack-align:stretch;--stack-justify:flex-start;padding-right:var(--mantine-spacing-xs)" class="m_6d731127 mantine-Stack-root"><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root"><p style="--text-fz:var(--mantine-font-size-sm);--text-lh:var(--mantine-line-height-sm);color:var(--mantine-color-dimmed)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root" data-size="sm">VLC Instances</p><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root"><button style="--ai-bg:transparent;--ai-hover:var(--mantine-color-blue-light-hover);--ai-color:var(--mantine-color-blue-light-color);--ai-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent" class="mantine-focus-auto mantine-active m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="subtle" type="button" aria-label="Refresh instances"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-refresh "><path d="M20 11a8.1 8.1 0 0 0 -15.5 -2m-.5 -4v4h4"></path><path d="M4 13a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4"></path></svg></span></button><button style="--ai-bg:var(--mantine-color-blue-filled);--ai-hover:var(--mantine-color-blue-filled-hover);--ai-color:var(--mantine-color-white);--ai-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent" class="mantine-focus-auto mantine-active m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="filled" type="button" aria-label="Start new instance"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-plus "><path d="M12 5l0 14"></path><path d="M5 12l14 0"></path></svg></span></button></div></div><div class="m_46b77525 mantine-InputWrapper-root mantine-Select-root" data-size="sm"><div style="--input-height:var(--input-height-sm);--input-fz:var(--mantine-font-size-sm);--input-right-section-pointer-events:none" class="m_6c018570 mantine-Input-wrapper mantine-Select-wrapper" data-variant="default" data-size="sm" data-with-right-section="true"><input class="m_8fb7ebe7 mantine-Input-input mantine-Select-input" data-variant="default" placeholder="Select an instance" role="combobox" aria-haspopup="listbox" aria-expanded="false" autoComplete="off" id="mantine-_R_2mjdarlftb_" value=""/><div data-position="right" class="m_82577fc2 mantine-Input-section mantine-Select-section"><svg style="--combobox-chevron-size:var(--combobox-chevron-size-sm)" class="m_2943220b mantine-ComboboxChevron-chevron" data-size="sm" data-combobox-chevron="true" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M4.93179 5.43179C4.75605 5.60753 4.75605 5.89245 4.93179 6.06819C5.10753 6.24392 5.39245 6.24392 5.56819 6.06819L7.49999 4.13638L9.43179 6.06819C9.60753 6.24392 9.89245 6.24392 10.0682 6.06819C10.2439 5.89245 10.2439 5.60753 10.0682 5.43179L7.81819 3.18179C7.73379 3.0974 7.61933 3.04999 7.49999 3.04999C7.38064 3.04999 7.26618 3.0974 7.18179 3.18179L4.93179 5.43179ZM10.0682 9.56819C10.2439 9.39245 10.2439 9.10753 10.0682 8.93179C9.89245 8.75606 9.60753 8.75606 9.43179 8.93179L7.49999 10.8636L5.56819 8.93179C5.39245 8.75606 5.10753 8.75606 4.93179 8.93179C4.75605 9.10753 4.75605 9.39245 4.93179 9.56819L7.18179 11.8182C7.35753 11.9939 7.64245 11.9939 7.81819 11.8182L10.0682 9.56819Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></div></div></div><input type="hidden" value=""/><div style="margin-block:var(--mantine-spacing-xs)" class="m_3eebeb36 mantine-Divider-root" data-orientation="horizontal" data-with-label="true" role="separator"><span class="m_9e365f20 mantine-Divider-label">Media Controls</span></div><style data-mantine-styles="inline">.__m__-_R_5mjdarlftb_{--sg-spacing-x:var(--mantine-spacing-md);--sg-spacing-y:var(--mantine-spacing-md);--sg-cols:2;}</style><div class="m_2415a157 mantine-SimpleGrid-root __m__-_R_5mjdarlftb_"><button style="--button-color:var(--mantine-color-white)" class="mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" data-disabled="true" type="button" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">Play</span></span></button><button style="--button-bg:var(--mantine-color-blue-light);--button-hover:var(--mantine-color-blue-light-hover);--button-color:var(--mantine-color-blue-light-color);--button-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent" class="mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" data-variant="light" data-disabled="true" type="button" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">Pause</span></span></button><button style="--button-bg:var(--mantine-color-red-light);--button-hover:var(--mantine-color-red-light-hover);--button-color:var(--mantine-color-red-light-color);--button-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent" class="mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" data-variant="light" data-disabled="true" type="button" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">Stop</span></span></button><button style="--button-bg:var(--mantine-color-blue-light);--button-hover:var(--mantine-color-blue-light-hover);--button-color:var(--mantine-color-blue-light-color);--button-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent" class="mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" data-variant="light" data-disabled="true" type="button" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">Fullscreen</span></span></button><button style="--button-bg:var(--mantine-color-blue-light);--button-hover:var(--mantine-color-blue-light-hover);--button-color:var(--mantine-color-blue-light-color);--button-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent" class="mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" data-variant="light" data-disabled="true" type="button" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">Previous</span></span></button><button style="--button-bg:var(--mantine-color-blue-light);--button-hover:var(--mantine-color-blue-light-hover);--button-color:var(--mantine-color-blue-light-color);--button-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent" class="mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" data-variant="light" data-disabled="true" type="button" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">Next</span></span></button><button style="--button-bg:var(--mantine-color-blue-light);--button-hover:var(--mantine-color-blue-light-hover);--button-color:var(--mantine-color-blue-light-color);--button-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent" class="mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" data-variant="light" data-disabled="true" type="button" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">Snapshot</span></span></button></div><div style="margin-block:var(--mantine-spacing-xs)" class="m_3eebeb36 mantine-Divider-root" data-orientation="horizontal" data-with-label="true" role="separator"><span class="m_9e365f20 mantine-Divider-label">Seek</span></div><style data-mantine-styles="inline">.__m__-_R_7mjdarlftb_{--sg-spacing-x:var(--mantine-spacing-md);--sg-spacing-y:var(--mantine-spacing-md);--sg-cols:2;}</style><div class="m_2415a157 mantine-SimpleGrid-root __m__-_R_7mjdarlftb_"><button style="--button-bg:var(--mantine-color-default);--button-hover:var(--mantine-color-default-hover);--button-color:var(--mantine-color-default-color);--button-bd:calc(0.0625rem * var(--mantine-scale)) solid var(--mantine-color-default-border)" class="mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" data-variant="default" data-disabled="true" type="button" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">-60s</span></span></button><button style="--button-bg:var(--mantine-color-default);--button-hover:var(--mantine-color-default-hover);--button-color:var(--mantine-color-default-color);--button-bd:calc(0.0625rem * var(--mantine-scale)) solid var(--mantine-color-default-border)" class="mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" data-variant="default" data-disabled="true" type="button" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">+60s</span></span></button><button style="--button-bg:var(--mantine-color-default);--button-hover:var(--mantine-color-default-hover);--button-color:var(--mantine-color-default-color);--button-bd:calc(0.0625rem * var(--mantine-scale)) solid var(--mantine-color-default-border)" class="mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" data-variant="default" data-disabled="true" type="button" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">-10s</span></span></button><button style="--button-bg:var(--mantine-color-default);--button-hover:var(--mantine-color-default-hover);--button-color:var(--mantine-color-default-color);--button-bd:calc(0.0625rem * var(--mantine-scale)) solid var(--mantine-color-default-border)" class="mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" data-variant="default" data-disabled="true" type="button" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">+10s</span></span></button></div><div style="margin-block:var(--mantine-spacing-xs)" class="m_3eebeb36 mantine-Divider-root" data-orientation="horizontal" data-with-label="true" role="separator"><span class="m_9e365f20 mantine-Divider-label">Volume</span></div><style data-mantine-styles="inline">.__m__-_R_9mjdarlftb_{--sg-spacing-x:var(--mantine-spacing-md);--sg-spacing-y:var(--mantine-spacing-md);--sg-cols:2;}</style><div class="m_2415a157 mantine-SimpleGrid-root __m__-_R_9mjdarlftb_"><button style="--button-bg:var(--mantine-color-default);--button-hover:var(--mantine-color-default-hover);--button-color:var(--mantine-color-default-color);--button-bd:calc(0.0625rem * var(--mantine-scale)) solid var(--mantine-color-default-border)" class="mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" data-variant="default" data-disabled="true" type="button" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">Vol -</span></span></button><button style="--button-bg:var(--mantine-color-default);--button-hover:var(--mantine-color-default-hover);--button-color:var(--mantine-color-default-color);--button-bd:calc(0.0625rem * var(--mantine-scale)) solid var(--mantine-color-default-border)" class="mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" data-variant="default" data-disabled="true" type="button" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">Vol +</span></span></button></div><div style="margin-block:var(--mantine-spacing-xs)" class="m_3eebeb36 mantine-Divider-root" data-orientation="horizontal" data-with-label="true" role="separator"><span class="m_9e365f20 mantine-Divider-label">Playback rate</span></div><style data-mantine-styles="inline">.__m__-_R_bmjdarlftb_{--sg-spacing-x:var(--mantine-spacing-md);--sg-spacing-y:var(--mantine-spacing-md);--sg-cols:3;}</style><div class="m_2415a157 mantine-SimpleGrid-root __m__-_R_bmjdarlftb_"><button style="--button-bg:var(--mantine-color-default);--button-hover:var(--mantine-color-default-hover);--button-color:var(--mantine-color-default-color);--button-bd:calc(0.0625rem * var(--mantine-scale)) solid var(--mantine-color-default-border)" class="mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" data-variant="default" data-disabled="true" type="button" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">Slower</span></span></button><button style="--button-bg:var(--mantine-color-default);--button-hover:var(--mantine-color-default-hover);--button-color:var(--mantine-color-default-color);--button-bd:calc(0.0625rem * var(--mantine-scale)) solid var(--mantine-color-default-border)" class="mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" data-variant="default" data-disabled="true" type="button" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">Normal</span></span></button><button style="--button-bg:var(--mantine-color-default);--button-hover:var(--mantine-color-default-hover);--button-color:var(--mantine-color-default-color);--button-bd:calc(0.0625rem * var(--mantine-scale)) solid var(--mantine-color-default-border)" class="mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" data-variant="default" data-disabled="true" type="button" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">Faster</span></span></button></div><div style="margin-block:var(--mantine-spacing-xs)" class="m_3eebeb36 mantine-Divider-root" data-orientation="horizontal" data-with-label="true" role="separator"><span class="m_9e365f20 mantine-Divider-label">Toggles</span></div><style data-mantine-styles="inline">.__m__-_R_dmjdarlftb_{--sg-spacing-x:var(--mantine-spacing-md);--sg-spacing-y:var(--mantine-spacing-md);--sg-cols:3;}</style><div class="m_2415a157 mantine-SimpleGrid-root __m__-_R_dmjdarlftb_"><button style="--button-height:var(--button-height-xs);--button-padding-x:var(--button-padding-x-xs);--button-fz:var(--mantine-font-size-xs);--button-bg:var(--mantine-color-default);--button-hover:var(--mantine-color-default-hover);--button-color:var(--mantine-color-default-color);--button-bd:calc(0.0625rem * var(--mantine-scale)) solid var(--mantine-color-default-border)" class="mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" data-variant="default" data-size="xs" data-disabled="true" type="button" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">Loop</span></span></button><button style="--button-height:var(--button-height-xs);--button-padding-x:var(--button-padding-x-xs);--button-fz:var(--mantine-font-size-xs);--button-bg:var(--mantine-color-default);--button-hover:var(--mantine-color-default-hover);--button-color:var(--mantine-color-default-color);--button-bd:calc(0.0625rem * var(--mantine-scale)) solid var(--mantine-color-default-border)" class="mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" data-variant="default" data-size="xs" data-disabled="true" type="button" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">Repeat</span></span></button><button style="--button-height:var(--button-height-xs);--button-padding-x:var(--button-padding-x-xs);--button-fz:var(--mantine-font-size-xs);--button-bg:var(--mantine-color-default);--button-hover:var(--mantine-color-default-hover);--button-color:var(--mantine-color-default-color);--button-bd:calc(0.0625rem * var(--mantine-scale)) solid var(--mantine-color-default-border)" class="mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" data-variant="default" data-size="xs" data-disabled="true" type="button" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">Random</span></span></button></div><div style="margin-block:var(--mantine-spacing-xs)" class="m_3eebeb36 mantine-Divider-root" data-orientation="horizontal" data-with-label="true" role="separator"><span class="m_9e365f20 mantine-Divider-label">Custom command</span></div><div class="m_46b77525 mantine-InputWrapper-root mantine-TextInput-root" data-size="sm"><div style="--input-height:var(--input-height-sm);--input-fz:var(--mantine-font-size-sm)" class="m_6c018570 mantine-Input-wrapper mantine-TextInput-wrapper" data-variant="default" data-size="sm" data-disabled="true"><input class="m_8fb7ebe7 mantine-Input-input mantine-TextInput-input" data-variant="default" data-disabled="true" placeholder="e.g. volume 150" disabled="" id="mantine-_R_fmjdarlftb_" value=""/></div></div><button style="--button-color:var(--mantine-color-white)" class="mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" data-disabled="true" data-block="true" type="button" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">Execute</span></span></button></div></div></div></div></nav><main class="m_8983817 mantine-AppShell-main"><div class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true" data-orientation="vertical"><p style="color:var(--mantine-color-dimmed)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">No instance selected. Start a new VLC stream to begin.</p><button style="--button-color:var(--mantine-color-white);margin-top:var(--mantine-spacing-sm)" class="mantine-focus-auto mantine-active m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" data-with-left-section="true" type="button"><span class="m_80f1301b mantine-Button-inner"><span class="m_a74036a mantine-Button-section" data-position="left"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-plus "><path d="M12 5l0 14"></path><path d="M5 12l14 0"></path></svg></span><span class="m_811560b9 mantine-Button-label">Start VLC</span></span></button></div></main></div><!--$--><!--/$--><script src="/_next/static/chunks/1u8kf-cumb-f7.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[29765,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"MantineProvider\"]\n3:I[39756,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"default\"]\n4:I[37457,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"default\"]\n5:I[47257,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"ClientPageRoot\"]\n6:I[31713,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\",\"/_next/static/chunks/2fc-6082kgcrk.js\",\"/_next/static/chunks/3y0d2nz4u4vwb.js\"],\"default\"]\n9:I[97367,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"OutletBoundary\"]\na:\"$Sreact.suspense\"\nc:I[97367,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"ViewportBoundary\"]\ne:I[97367,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"MetadataBoundary\"]\n10:I[68027,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/2v-rv291cn1b-.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/2v-rv291cn1b-.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0d-c12mml-h6p.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/158myu8e_yme3.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"data-mantine-color-scheme\":\"light\",\"children\":[[\"$\",\"head\",null,{}],[\"$\",\"body\",null,{\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L5\",null,{\"Component\":\"$6\",\"serverProvidedParams\":{\"searchParams\":{},\"params\":{},\"promises\":[\"$@7\",\"$@8\"]}}],[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/2fc-6082kgcrk.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/3y0d2nz4u4vwb.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$a\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@b\"}]}]]}],{},null,false,null]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$Lc\",null,{\"children\":\"$Ld\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Le\",null,{\"children\":[\"$\",\"$a\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lf\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$10\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/2v-rv291cn1b-.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"nBKcDuA1Pt7_3iMhIbjDI\"}\n"])</script><script>self.__next_f.push([1,"7:{}\n8:\"$0:f:0:1:1:children:0:props:children:0:props:serverProvidedParams:params\"\n"])</script><script>self.__next_f.push([1,"d:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"11:I[27201,[\"/_next/static/chunks/0d-c12mml-h6p.js\",\"/_next/static/chunks/158myu8e_yme3.js\"],\"IconMark\"]\nb:null\nf:[[\"$\",\"title\",\"0\",{\"children\":\"My Mantine app\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"I have followed setup instructions carefully\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.2vob68tjqpejf.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$L11\",\"3\",{}]]\n"])</script></body></html>
|
out/index.txt
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
1:"$Sreact.fragment"
|
| 2 |
+
2:I[29765,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"MantineProvider"]
|
| 3 |
+
3:I[39756,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"default"]
|
| 4 |
+
4:I[37457,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"default"]
|
| 5 |
+
5:I[47257,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"ClientPageRoot"]
|
| 6 |
+
6:I[31713,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js","/_next/static/chunks/2fc-6082kgcrk.js","/_next/static/chunks/3y0d2nz4u4vwb.js"],"default"]
|
| 7 |
+
9:I[97367,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"OutletBoundary"]
|
| 8 |
+
a:"$Sreact.suspense"
|
| 9 |
+
c:I[97367,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"ViewportBoundary"]
|
| 10 |
+
e:I[97367,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"MetadataBoundary"]
|
| 11 |
+
10:I[68027,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"default",1]
|
| 12 |
+
:HL["/_next/static/chunks/2v-rv291cn1b-.css","style"]
|
| 13 |
+
0:{"P":null,"c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/2v-rv291cn1b-.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/0d-c12mml-h6p.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/158myu8e_yme3.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"data-mantine-color-scheme":"light","children":[["$","head",null,{}],["$","body",null,{"children":["$","$L2",null,{"children":["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]]}]]}],{"children":[["$","$1","c",{"children":[["$","$L5",null,{"Component":"$6","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@7","$@8"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/2fc-6082kgcrk.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3y0d2nz4u4vwb.js","async":true,"nonce":"$undefined"}]],["$","$L9",null,{"children":["$","$a",null,{"name":"Next.MetadataOutlet","children":"$@b"}]}]]}],{},null,false,null]},null,false,null],["$","$1","h",{"children":[null,["$","$Lc",null,{"children":"$Ld"}],["$","div",null,{"hidden":true,"children":["$","$Le",null,{"children":["$","$a",null,{"name":"Next.Metadata","children":"$Lf"}]}]}],null]}],false]],"m":"$undefined","G":["$10",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/2v-rv291cn1b-.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"nBKcDuA1Pt7_3iMhIbjDI"}
|
| 14 |
+
7:{}
|
| 15 |
+
8:"$0:f:0:1:1:children:0:props:children:0:props:serverProvidedParams:params"
|
| 16 |
+
d:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
|
| 17 |
+
11:I[27201,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"IconMark"]
|
| 18 |
+
b:null
|
| 19 |
+
f:[["$","title","0",{"children":"My Mantine app"}],["$","meta","1",{"name":"description","content":"I have followed setup instructions carefully"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.2vob68tjqpejf.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L11","3",{}]]
|
out/manager/__next._full.txt
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
1:"$Sreact.fragment"
|
| 2 |
+
2:I[29765,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"MantineProvider"]
|
| 3 |
+
3:I[39756,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"default"]
|
| 4 |
+
4:I[37457,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"default"]
|
| 5 |
+
5:I[47257,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"ClientPageRoot"]
|
| 6 |
+
6:I[10555,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js","/_next/static/chunks/0xm351i8abo9i.js","/_next/static/chunks/3sfsn9t1uaymg.js"],"default"]
|
| 7 |
+
9:I[97367,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"OutletBoundary"]
|
| 8 |
+
a:"$Sreact.suspense"
|
| 9 |
+
d:I[97367,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"ViewportBoundary"]
|
| 10 |
+
f:I[97367,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"MetadataBoundary"]
|
| 11 |
+
11:I[68027,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"default",1]
|
| 12 |
+
:HL["/_next/static/chunks/2v-rv291cn1b-.css","style"]
|
| 13 |
+
0:{"P":null,"c":["","manager",""],"q":"","i":false,"f":[[["",{"children":["manager",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/2v-rv291cn1b-.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/0d-c12mml-h6p.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/158myu8e_yme3.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"data-mantine-color-scheme":"light","children":[["$","head",null,{}],["$","body",null,{"children":["$","$L2",null,{"children":["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","$L5",null,{"Component":"$6","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@7","$@8"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/0xm351i8abo9i.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3sfsn9t1uaymg.js","async":true,"nonce":"$undefined"}]],["$","$L9",null,{"children":["$","$a",null,{"name":"Next.MetadataOutlet","children":"$@b"}]}]]}],{},null,false,null]},null,false,"$@c"]},null,false,null],["$","$1","h",{"children":[null,["$","$Ld",null,{"children":"$Le"}],["$","div",null,{"hidden":true,"children":["$","$Lf",null,{"children":["$","$a",null,{"name":"Next.Metadata","children":"$L10"}]}]}],null]}],false]],"m":"$undefined","G":["$11",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/2v-rv291cn1b-.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"nBKcDuA1Pt7_3iMhIbjDI"}
|
| 14 |
+
12:[]
|
| 15 |
+
c:"$W12"
|
| 16 |
+
7:{}
|
| 17 |
+
8:"$0:f:0:1:1:children:1:children:0:props:children:0:props:serverProvidedParams:params"
|
| 18 |
+
e:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
|
| 19 |
+
13:I[27201,["/_next/static/chunks/0d-c12mml-h6p.js","/_next/static/chunks/158myu8e_yme3.js"],"IconMark"]
|
| 20 |
+
b:null
|
| 21 |
+
10:[["$","title","0",{"children":"My Mantine app"}],["$","meta","1",{"name":"description","content":"I have followed setup instructions carefully"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.2vob68tjqpejf.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L13","3",{}]]
|