diff --git a/.github/workflows/rollout.yml b/.github/workflows/rollout.yml index 1e143ced..5c04c8d3 100644 --- a/.github/workflows/rollout.yml +++ b/.github/workflows/rollout.yml @@ -1,27 +1,26 @@ name: Eval Protocol Rollout -run-name: rollout:${{ inputs.rollout_id }} +run-name: rollout:${{ fromJSON(inputs.metadata).rollout_id }} on: workflow_dispatch: inputs: model: - description: 'Model to use for the rollout' + description: 'Model to use' required: true type: string - rollout_id: - description: 'Rollout ID for tracking' + metadata: + description: 'JSON serialized metadata object' required: true type: string - prompt: - description: 'User prompt for the rollout' + model_base_url: + description: 'Base URL for the model API' required: true type: string jobs: rollout: runs-on: ubuntu-latest - name: rollout-${{ inputs.rollout_id }} steps: - name: Checkout code @@ -43,13 +42,5 @@ jobs: run: | python tests/github_actions/rollout_worker.py \ --model "${{ inputs.model }}" \ - --rollout-id "${{ inputs.rollout_id }}" \ - --prompt "${{ inputs.prompt }}" - - - name: Upload rollout trace - uses: actions/upload-artifact@v4 - if: always() # Upload even if the rollout failed - with: - name: rollout-trace-${{ inputs.rollout_id }} - path: rollout_trace_${{ inputs.rollout_id }}.json - retention-days: 7 + --metadata '${{ inputs.metadata }}' \ + --model-base-url "${{ inputs.model_base_url }}" diff --git a/eval_protocol/__init__.py b/eval_protocol/__init__.py index f832d690..10eebab8 100644 --- a/eval_protocol/__init__.py +++ b/eval_protocol/__init__.py @@ -30,7 +30,7 @@ from .reward_function import RewardFunction from .typed_interface import reward_function from .quickstart import aha_judge, multi_turn_assistant_to_ground_truth, assistant_to_ground_truth -from .pytest import evaluation_test, SingleTurnRolloutProcessor, RemoteRolloutProcessor +from .pytest import evaluation_test, SingleTurnRolloutProcessor, RemoteRolloutProcessor, GithubActionRolloutProcessor from .pytest.remote_rollout_processor import create_elasticsearch_config_from_env from .pytest.parameterize import DefaultParameterIdGenerator from .log_utils.elasticsearch_direct_http_handler import ElasticsearchDirectHttpHandler @@ -85,6 +85,7 @@ "DataLoaderConfig", "Status", "RemoteRolloutProcessor", + "GithubActionRolloutProcessor", "InputMetadata", "EvaluationRow", "DefaultParameterIdGenerator", diff --git a/eval_protocol/models.py b/eval_protocol/models.py index 40bb1e44..d3fe0f61 100644 --- a/eval_protocol/models.py +++ b/eval_protocol/models.py @@ -598,7 +598,9 @@ class EvaluationRow(BaseModel): model_config = ConfigDict(extra="allow") # Core OpenAI ChatCompletion compatible conversation data - messages: List[Message] = Field(description="List of messages in the conversation. Also known as a trajectory.") + messages: List[Message] = Field( + default_factory=list, description="List of messages in the conversation. Also known as a trajectory." + ) # Tool and function call information tools: Optional[List[Dict[str, Any]]] = Field( diff --git a/eval_protocol/pytest/__init__.py b/eval_protocol/pytest/__init__.py index 35832b6f..31c81167 100644 --- a/eval_protocol/pytest/__init__.py +++ b/eval_protocol/pytest/__init__.py @@ -4,6 +4,7 @@ from .default_no_op_rollout_processor import NoOpRolloutProcessor from .default_single_turn_rollout_process import SingleTurnRolloutProcessor from .remote_rollout_processor import RemoteRolloutProcessor +from .github_action_rollout_processor import GithubActionRolloutProcessor from .evaluation_test import evaluation_test from .exception_config import ExceptionHandlerConfig, BackoffConfig, get_default_exception_handler_config from .rollout_processor import RolloutProcessor @@ -33,6 +34,7 @@ "RolloutProcessor", "SingleTurnRolloutProcessor", "RemoteRolloutProcessor", + "GithubActionRolloutProcessor", "NoOpRolloutProcessor", "default_dataset_adapter", "RolloutProcessorConfig", diff --git a/eval_protocol/pytest/evaluation_test.py b/eval_protocol/pytest/evaluation_test.py index 57f36a9f..b562c3c1 100644 --- a/eval_protocol/pytest/evaluation_test.py +++ b/eval_protocol/pytest/evaluation_test.py @@ -47,7 +47,7 @@ ) -from eval_protocol.pytest.utils import ( +from eval_protocol.pytest.evaluation_test_utils import ( AggregationMethod, add_cost_metrics, log_eval_status_and_rows, diff --git a/eval_protocol/pytest/evaluation_test_postprocess.py b/eval_protocol/pytest/evaluation_test_postprocess.py index 838ae4cd..7fa7e3fe 100644 --- a/eval_protocol/pytest/evaluation_test_postprocess.py +++ b/eval_protocol/pytest/evaluation_test_postprocess.py @@ -10,7 +10,12 @@ from eval_protocol.models import CompletionParams, EvaluationRow, EvaluationThreshold, Status from eval_protocol.pytest.handle_persist_flow import handle_persist_flow from eval_protocol.pytest.types import EvaluationTestMode -from eval_protocol.pytest.utils import AggregationMethod, aggregate, extract_effort_tag, sanitize_filename +from eval_protocol.pytest.evaluation_test_utils import ( + AggregationMethod, + aggregate, + extract_effort_tag, + sanitize_filename, +) from eval_protocol.stats.confidence_intervals import compute_fixed_set_mu_ci diff --git a/eval_protocol/pytest/utils.py b/eval_protocol/pytest/evaluation_test_utils.py similarity index 100% rename from eval_protocol/pytest/utils.py rename to eval_protocol/pytest/evaluation_test_utils.py diff --git a/eval_protocol/pytest/generate_parameter_combinations.py b/eval_protocol/pytest/generate_parameter_combinations.py index cf2da2c6..06c8eb41 100644 --- a/eval_protocol/pytest/generate_parameter_combinations.py +++ b/eval_protocol/pytest/generate_parameter_combinations.py @@ -2,7 +2,7 @@ from eval_protocol.data_loader.models import EvaluationDataLoader from eval_protocol.models import CompletionParams, EvaluationRow from eval_protocol.pytest.types import Dataset, DatasetPathParam, EvaluationInputParam, InputMessagesParam -from eval_protocol.pytest.utils import parse_ep_max_rows +from eval_protocol.pytest.evaluation_test_utils import parse_ep_max_rows from collections.abc import Sequence diff --git a/eval_protocol/pytest/github_action_rollout_processor.py b/eval_protocol/pytest/github_action_rollout_processor.py new file mode 100644 index 00000000..6fe1ea8b --- /dev/null +++ b/eval_protocol/pytest/github_action_rollout_processor.py @@ -0,0 +1,223 @@ +import asyncio +import os +import time +from typing import Any, Callable, Dict, List, Optional + +import requests +from datetime import datetime, timezone, timedelta +from eval_protocol.models import EvaluationRow, Status +from eval_protocol.data_loader.dynamic_data_loader import DynamicDataLoader +from eval_protocol.types.remote_rollout_processor import DataLoaderConfig + +from .rollout_processor import RolloutProcessor +from .types import RolloutProcessorConfig +from .tracing_utils import default_fireworks_output_data_loader, build_init_request, update_row_with_remote_trace + + +class GithubActionRolloutProcessor(RolloutProcessor): + """ + Rollout processor that dispatches and monitors a GitHub Actions workflow per evaluation row. + + Expected GitHub Actions workflow: + - Workflow dispatch with inputs: model, metadata (JSON), model_base_url + - Workflow makes API calls that get traced (e.g., via Fireworks tracing proxy) + - Traces are fetched later via output_data_loader using rollout_id tags + + NOTE: GHA has a rate limit of 5000 requests per hour. + """ + + def __init__( + self, + *, + owner: str, + repo: str, + workflow_id: str, + ref: str = "main", + model_base_url: str = "https://tracing.fireworks.ai", + poll_interval: float = 10.0, + timeout_seconds: float = 1800.0, + max_find_workflow_retries: int = 5, + github_token: Optional[str] = None, + output_data_loader: Optional[Callable[[DataLoaderConfig], DynamicDataLoader]] = None, + ): + self.owner = owner + self.repo = repo + self.workflow_id = workflow_id + self.ref = ref + self.model_base_url = model_base_url + _ep_model_base_url = os.getenv("EP_MODEL_BASE_URL") + if _ep_model_base_url: + self.model_base_url = _ep_model_base_url + self.poll_interval = poll_interval + self.timeout_seconds = timeout_seconds + self.max_find_workflow_retries = max_find_workflow_retries + self.github_token = github_token + self._output_data_loader = output_data_loader or default_fireworks_output_data_loader + + def _headers(self) -> Dict[str, str]: + headers = {"Accept": "application/vnd.github+json"} + token = self.github_token or os.getenv("GITHUB_TOKEN") + if not token: + raise ValueError( + "GitHub token is required. Provide it via github_token parameter or GITHUB_TOKEN environment variable" + ) + headers["Authorization"] = f"Bearer {token}" + return headers + + def __call__(self, rows: List[EvaluationRow], config: RolloutProcessorConfig) -> List[asyncio.Task[EvaluationRow]]: + # Calculate max_pages based on number of rows we're processing + num_rows = len(rows) + max_pages = (num_rows + 99) // 100 # Round up pages + + async def _process_row(row: EvaluationRow) -> EvaluationRow: + start_time = time.perf_counter() + + if row.execution_metadata.invocation_id is None: + raise ValueError("Invocation ID is required in GithubActionRolloutProcessor") + if row.execution_metadata.experiment_id is None: + raise ValueError("Experiment ID is required in GithubActionRolloutProcessor") + if row.execution_metadata.rollout_id is None: + raise ValueError("Rollout ID is required in GithubActionRolloutProcessor") + if row.execution_metadata.run_id is None: + raise ValueError("Run ID is required in GithubActionRolloutProcessor") + if row.input_metadata.row_id is None: + raise ValueError("Row ID is required in GithubActionRolloutProcessor") + + init_request = build_init_request(row, config, self.model_base_url) + + def _dispatch_workflow(): + url = f"https://api.github.com/repos/{self.owner}/{self.repo}/actions/workflows/{self.workflow_id}/dispatches" + payload = { + "ref": self.ref, + "inputs": { + "model": init_request.model, + "metadata": init_request.metadata.model_dump_json(), + "model_base_url": init_request.model_base_url, + }, + } + r = requests.post(url, json=payload, headers=self._headers(), timeout=30) + r.raise_for_status() + + await asyncio.to_thread(_dispatch_workflow) + + run = None + target_name = f"rollout:{row.execution_metadata.rollout_id}" + + # Look for runs created in the last 15 minutes (we just dispatched it) + cutoff_time = datetime.now(timezone.utc) - timedelta(minutes=15) + cutoff_iso = cutoff_time.isoformat() + + for attempt in range(self.max_find_workflow_retries): + try: + page = 1 + while page <= max_pages: + + def _list_runs(): + url = f"https://api.github.com/repos/{self.owner}/{self.repo}/actions/workflows/{self.workflow_id}/runs" + params = { + "event": "workflow_dispatch", + "branch": self.ref, + "per_page": 100, # Max per_page is 100, minimize total number of pages + "page": page, + "created": f">={cutoff_iso}", # Only look at recent runs + } + + r = requests.get(url, params=params, headers=self._headers(), timeout=30) + r.raise_for_status() + return r.json() + + runs_data = await asyncio.to_thread(_list_runs) + + # Search for our target run in this page + for candidate_run in runs_data.get("workflow_runs", []): + if candidate_run.get("name") == target_name: + run = candidate_run + + # If we got fewer results than 100, we've reached the end, since we paginate in chunks of 100 + if len(runs_data.get("workflow_runs", [])) < 100: + break + + page += 1 + + # If no run found, GHA might still be populating it, retry + if attempt < self.max_find_workflow_retries - 1: + delay = 2**attempt # Exponential backoff + await asyncio.sleep(delay) + + except requests.exceptions.HTTPError as e: + # Retry on rate limits (HTTP 429) + if e.response and e.response.status_code == 429: + if attempt < self.max_find_workflow_retries - 1: + delay = 2**attempt # Exponential backoff + await asyncio.sleep(delay) + else: + # Give up after max attempts + raise e + else: + raise e + + if not run: + row.rollout_status = Status.rollout_error( + f"Failed to find workflow run in GHA with rollout_id {row.execution_metadata.rollout_id}" + ) + row.execution_metadata.duration_seconds = time.perf_counter() - start_time + return row + + run_id = run.get("id") + if not run_id: + row.rollout_status = Status.rollout_error( + f"Failed to find workflow run in GHA with rollout_id {row.execution_metadata.rollout_id}" + ) + row.execution_metadata.duration_seconds = time.perf_counter() - start_time + return row + + # Poll the specific run until completion + deadline = time.time() + self.timeout_seconds + + def _get_run() -> Dict[str, Any]: + """Get status of a specific workflow run.""" + url = f"https://api.github.com/repos/{self.owner}/{self.repo}/actions/runs/{run_id}" + r = requests.get(url, headers=self._headers(), timeout=30) + r.raise_for_status() + return r.json() + + while time.time() < deadline: + run_data = await asyncio.to_thread(_get_run) + + if run_data.get("status") == "completed": + break + + await asyncio.sleep(self.poll_interval) + else: + row.rollout_status = Status.rollout_error( + f"GitHub Actions run timed out after {self.timeout_seconds} seconds" + ) + row.execution_metadata.duration_seconds = time.perf_counter() - start_time + return row + + row.execution_metadata.duration_seconds = time.perf_counter() - start_time + + def _update_with_trace() -> None: + return update_row_with_remote_trace(row, self._output_data_loader, self.model_base_url) + + await asyncio.to_thread(_update_with_trace) + + # Add GitHub Actions run URL to session data + if run_id: + github_run_url = f"https://github.com/{self.owner}/{self.repo}/actions/runs/{run_id}" + if not row.input_metadata.session_data: + row.input_metadata.session_data = {} + row.input_metadata.session_data["github_actions_run_url"] = github_run_url + + return row + + semaphore = config.semaphore + + async def _sem_wrapper(r: EvaluationRow) -> EvaluationRow: + async with semaphore: + return await _process_row(r) + + return [asyncio.create_task(_sem_wrapper(row)) for row in rows] + + def cleanup(self) -> None: + return None diff --git a/eval_protocol/pytest/remote_rollout_processor.py b/eval_protocol/pytest/remote_rollout_processor.py index d5bce2ee..0db806c7 100644 --- a/eval_protocol/pytest/remote_rollout_processor.py +++ b/eval_protocol/pytest/remote_rollout_processor.py @@ -1,5 +1,4 @@ import asyncio -import base64 import time from typing import Any, Dict, List, Optional, Callable @@ -11,14 +10,11 @@ from eval_protocol.types.remote_rollout_processor import ( DataLoaderConfig, ElasticsearchConfig, - InitRequest, - RolloutMetadata, ) -from eval_protocol.adapters.fireworks_tracing import FireworksTracingAdapter -from eval_protocol.quickstart.utils import filter_longest_conversation from .rollout_processor import RolloutProcessor from .types import RolloutProcessorConfig from .elasticsearch_setup import ElasticsearchSetup +from .tracing_utils import default_fireworks_output_data_loader, build_init_request, update_row_with_remote_trace import logging import os @@ -45,55 +41,6 @@ def create_elasticsearch_config_from_env() -> ElasticsearchConfig: ) -def _build_fireworks_tracing_url( - base_url: str, metadata: RolloutMetadata, completion_params_base_url: Optional[str] = None -) -> str: - """Build a Fireworks tracing URL by appending rollout metadata to the base URL path, - allowing the Fireworks tracing proxy to automatically tag traces. - - Format: {base_url}/rollout_id/{id}/invocation_id/{id}/experiment_id/{id}/run_id/{id}/row_id/{id} - - Args: - base_url: Fireworks tracing proxy URL (we expect this to be https://tracing.fireworks.ai or - https://tracing.fireworks.ai/project_id/{project_id}) - metadata: Rollout metadata containing IDs to embed in the URL - completion_params_base_url: Optional LLM base URL to encode and append to the final URL - """ - url = ( - f"{base_url}/rollout_id/{metadata.rollout_id}" - f"/invocation_id/{metadata.invocation_id}" - f"/experiment_id/{metadata.experiment_id}" - f"/run_id/{metadata.run_id}" - f"/row_id/{metadata.row_id}" - ) - - if ( - completion_params_base_url - ): # The final URL is both tracing.fireworks.ai and the actual LLM base URL we want to use - encoded_base_url = base64.urlsafe_b64encode(completion_params_base_url.encode()).decode() - url = f"{url}/encoded_base_url/{encoded_base_url}" - - return url - - -def _default_output_data_loader(config: DataLoaderConfig) -> DynamicDataLoader: - """Default output data loader that fetches traces from Fireworks tracing proxy. - - Args: - config: Configuration containing rollout_id and optional model_base_url - - Returns: - DynamicDataLoader configured to fetch and process traces - """ - - def fetch_traces() -> List[EvaluationRow]: - base_url = config.model_base_url or "https://tracing.fireworks.ai" - adapter = FireworksTracingAdapter(base_url=base_url) - return adapter.get_evaluation_rows(tags=[f"rollout_id:{config.rollout_id}"], max_retries=5) - - return DynamicDataLoader(generators=[fetch_traces], preprocess_fn=filter_longest_conversation) - - class RemoteRolloutProcessor(RolloutProcessor): """ Rollout processor that triggers a remote HTTP server to perform the rollout. @@ -126,7 +73,7 @@ def __init__( self._model_base_url = _ep_model_base_url self._poll_interval = poll_interval self._timeout_seconds = timeout_seconds - self._output_data_loader = output_data_loader or _default_output_data_loader + self._output_data_loader = output_data_loader or default_fireworks_output_data_loader self._disable_elastic_search_setup = disable_elastic_search_setup self._elastic_search_config = elastic_search_config @@ -176,70 +123,7 @@ async def _process_row(row: EvaluationRow) -> EvaluationRow: if row.input_metadata.row_id is None: raise ValueError("Row ID is required in RemoteRolloutProcessor") - # Build request metadata and payload - meta: RolloutMetadata = RolloutMetadata( - invocation_id=row.execution_metadata.invocation_id, - experiment_id=row.execution_metadata.experiment_id, - rollout_id=row.execution_metadata.rollout_id, - run_id=row.execution_metadata.run_id, - row_id=row.input_metadata.row_id, - ) - - model: Optional[str] = None - if row.input_metadata and row.input_metadata.completion_params: - model = row.input_metadata.completion_params.get("model") - if model is None and config.completion_params: - model = config.completion_params.get("model") - if model is None: - raise ValueError( - "Model must be provided in row.input_metadata.completion_params or config.completion_params" - ) - - # Extract base_url from completion_params if provided. If we're using tracing.fireworks.ai, this base_url gets encoded and passed to LiteLLM inside the proxy. - completion_params_base_url: Optional[str] = None - if row.input_metadata and row.input_metadata.completion_params: - completion_params_base_url = row.input_metadata.completion_params.get("base_url") - if completion_params_base_url is None and config.completion_params: - completion_params_base_url = config.completion_params.get("base_url") - - # Strip non-OpenAI fields from messages before sending to remote - allowed_message_fields = {"role", "content", "tool_calls", "tool_call_id", "name"} - clean_messages = [] - for m in row.messages: - md: Dict[str, Any] - if hasattr(m, "model_dump"): - md = m.model_dump() # type: ignore[assignment] - elif isinstance(m, dict): - md = m # type: ignore[assignment] - else: - # Fallback to constructing a dict from Message-like object - md = { - "role": getattr(m, "role", None), - "content": getattr(m, "content", None), - "tool_calls": getattr(m, "tool_calls", None), - "tool_call_id": getattr(m, "tool_call_id", None), - "name": getattr(m, "name", None), - } - clean_messages.append({k: v for k, v in md.items() if k in allowed_message_fields and v is not None}) - - if row.execution_metadata.rollout_id is None: - raise ValueError("Rollout ID is required in RemoteRolloutProcessor") - - final_model_base_url = model_base_url - if model_base_url and ( - model_base_url.startswith("https://tracing.fireworks.ai") - or model_base_url.startswith("http://localhost") - ): - final_model_base_url = _build_fireworks_tracing_url(model_base_url, meta, completion_params_base_url) - - init_payload: InitRequest = InitRequest( - model=model, - messages=clean_messages, - tools=row.tools, - metadata=meta, - model_base_url=final_model_base_url, - elastic_search_config=self._elastic_search_config, - ) + init_payload = build_init_request(row, config, model_base_url, self._elastic_search_config) # Fire-and-poll def _post_init() -> None: @@ -329,45 +213,13 @@ def _get_status() -> Dict[str, Any]: f"Rollout {row.execution_metadata.rollout_id} timed out after {timeout_seconds} seconds" ) - # Update duration, regardless of termination row.execution_metadata.duration_seconds = time.perf_counter() - start_time - if row.execution_metadata.rollout_id is None: - raise ValueError("Rollout ID is required in RemoteRolloutProcessor") + def _update_with_trace() -> None: + return update_row_with_remote_trace(row, self._output_data_loader, model_base_url) - loader_config = DataLoaderConfig( - rollout_id=row.execution_metadata.rollout_id, model_base_url=model_base_url - ) - data_loader = self._output_data_loader(loader_config) - - def _load_data(): - return data_loader.load() - - results = await asyncio.to_thread(_load_data) - - output_rows: List[EvaluationRow] = [row for result in results for row in result.rows] - - if len(output_rows) == 0: # Fallback to original row if no Remote data found - row.rollout_status = Status(code=Status.Code.NOT_FOUND, message="No remote data found for rollout") - return row - elif len(output_rows) == 1: # Return the remote row - remote_row = output_rows[0] - - # if the remote_row has the same number of messages as the original row, - # something went wrong - if len(remote_row.messages) == len(row.messages): - row.rollout_status = Status.rollout_error( - "Rollout finished with the same number of messages as the original row" - ) - return row - - row.messages = remote_row.messages - row.tools = remote_row.tools - row.input_metadata.session_data = remote_row.input_metadata.session_data - row.execution_metadata = remote_row.execution_metadata - return row - else: - raise ValueError("RemoteRolloutProcessor's output_data_loader should return exactly one row.") + await asyncio.to_thread(_update_with_trace) # Update row with remote trace in-place + return row semaphore = config.semaphore diff --git a/eval_protocol/pytest/tracing_utils.py b/eval_protocol/pytest/tracing_utils.py new file mode 100644 index 00000000..0c729d14 --- /dev/null +++ b/eval_protocol/pytest/tracing_utils.py @@ -0,0 +1,167 @@ +""" +Shared utilities for rollout processors. +""" + +import base64 +from typing import Any, Callable, Dict, List, Optional + +from eval_protocol.adapters.fireworks_tracing import FireworksTracingAdapter +from eval_protocol.data_loader.dynamic_data_loader import DynamicDataLoader +from eval_protocol.models import EvaluationRow, Status +from eval_protocol.quickstart.utils import filter_longest_conversation +from eval_protocol.types.remote_rollout_processor import DataLoaderConfig, RolloutMetadata, InitRequest +from eval_protocol.pytest.types import RolloutProcessorConfig + + +def default_fireworks_output_data_loader(config: DataLoaderConfig) -> DynamicDataLoader: + """Default output data loader that fetches traces from Fireworks tracing proxy.""" + + def fetch_traces() -> List[EvaluationRow]: + base_url = config.model_base_url or "https://tracing.fireworks.ai" + adapter = FireworksTracingAdapter(base_url=base_url) + return adapter.get_evaluation_rows(tags=[f"rollout_id:{config.rollout_id}"], max_retries=5) + + return DynamicDataLoader(generators=[fetch_traces], preprocess_fn=filter_longest_conversation) + + +def build_fireworks_tracing_url( + base_url: str, metadata: RolloutMetadata, completion_params_base_url: Optional[str] = None +) -> str: + """Build a Fireworks tracing URL by appending rollout metadata to the base URL path, + allowing the Fireworks tracing proxy to automatically tag traces. + + Format: {base_url}/rollout_id/{id}/invocation_id/{id}/experiment_id/{id}/run_id/{id}/row_id/{id} + + Args: + base_url: Fireworks tracing proxy URL (e.g., https://tracing.fireworks.ai) + metadata: Rollout metadata containing IDs to embed in the URL + completion_params_base_url: Optional LLM base URL to encode and append to the final URL + """ + url = ( + f"{base_url}/rollout_id/{metadata.rollout_id}" + f"/invocation_id/{metadata.invocation_id}" + f"/experiment_id/{metadata.experiment_id}" + f"/run_id/{metadata.run_id}" + f"/row_id/{metadata.row_id}" + ) + + if completion_params_base_url: + encoded_base_url = base64.urlsafe_b64encode(completion_params_base_url.encode()).decode() + url = f"{url}/encoded_base_url/{encoded_base_url}" + + return url + + +def build_init_request( + row: EvaluationRow, + config: RolloutProcessorConfig, + model_base_url: str, + elastic_search_config: Optional[Any] = None, +) -> InitRequest: + """Build an InitRequest from an EvaluationRow and config (shared logic).""" + # Validation + if row.execution_metadata.invocation_id is None: + raise ValueError("Invocation ID is required") + if row.execution_metadata.experiment_id is None: + raise ValueError("Experiment ID is required") + if row.execution_metadata.rollout_id is None: + raise ValueError("Rollout ID is required") + if row.execution_metadata.run_id is None: + raise ValueError("Run ID is required") + if row.input_metadata.row_id is None: + raise ValueError("Row ID is required") + + # Build metadata + meta = RolloutMetadata( + invocation_id=row.execution_metadata.invocation_id, + experiment_id=row.execution_metadata.experiment_id, + rollout_id=row.execution_metadata.rollout_id, + run_id=row.execution_metadata.run_id, + row_id=row.input_metadata.row_id, + ) + + # Extract model + model: Optional[str] = None + if row.input_metadata and row.input_metadata.completion_params: + model = row.input_metadata.completion_params.get("model") + if model is None and config.completion_params: + model = config.completion_params.get("model") + if model is None: + raise ValueError("Model must be provided in row.input_metadata.completion_params or config.completion_params") + + # Extract base_url from completion_params + completion_params_base_url: Optional[str] = None + if row.input_metadata and row.input_metadata.completion_params: + completion_params_base_url = row.input_metadata.completion_params.get("base_url") + if completion_params_base_url is None and config.completion_params: + completion_params_base_url = config.completion_params.get("base_url") + + # Strip non-OpenAI fields from messages + allowed_message_fields = {"role", "content", "tool_calls", "tool_call_id", "name"} + clean_messages = [] + for m in row.messages: + md: Dict[str, Any] + if hasattr(m, "model_dump"): + md = m.model_dump() + elif isinstance(m, dict): + md = m + else: + # Fallback to constructing a dict from Message-like object + md = { + "role": getattr(m, "role", None), + "content": getattr(m, "content", None), + "tool_calls": getattr(m, "tool_calls", None), + "tool_call_id": getattr(m, "tool_call_id", None), + "name": getattr(m, "name", None), + } + clean_messages.append({k: v for k, v in md.items() if k in allowed_message_fields and v is not None}) + + # Build final model base URL with tracing metadata + final_model_base_url = model_base_url + if model_base_url and ( + model_base_url.startswith("https://tracing.fireworks.ai") or model_base_url.startswith("http://localhost") + ): + final_model_base_url = build_fireworks_tracing_url(model_base_url, meta, completion_params_base_url) + + return InitRequest( + model=model, + messages=clean_messages, + tools=row.tools, + metadata=meta, + model_base_url=final_model_base_url, + elastic_search_config=elastic_search_config, + ) + + +def update_row_with_remote_trace( + row: EvaluationRow, output_data_loader: Callable[[DataLoaderConfig], DynamicDataLoader], model_base_url: str +) -> None: + """Update row with remote trace data using output_data_loader (shared logic).""" + if not row.execution_metadata.rollout_id: + return None + + loader_config = DataLoaderConfig(rollout_id=row.execution_metadata.rollout_id, model_base_url=model_base_url) + data_loader = output_data_loader(loader_config) + results = data_loader.load() + output_rows: List[EvaluationRow] = [r for result in results for r in result.rows] + + if len(output_rows) == 0: # Fallback to original row if no remote data found + row.rollout_status = Status(code=Status.Code.NOT_FOUND, message="No remote data found for rollout") + return None + elif len(output_rows) == 1: # Return the remote row + remote_row = output_rows[0] + + # if the remote_row has the same number of messages as the original row, something went wrong + if len(remote_row.messages) == len(row.messages): + row.rollout_status = Status.rollout_error( + "Rollout finished with the same number of messages as the original row" + ) + return None + + row.messages = remote_row.messages + row.tools = remote_row.tools + row.input_metadata.session_data = remote_row.input_metadata.session_data + row.execution_metadata = remote_row.execution_metadata + return None + else: + raise ValueError("Output data loader should return exactly one row.") diff --git a/tests/github_actions/__init__.py b/tests/github_actions/__init__.py new file mode 100644 index 00000000..8a2d522a --- /dev/null +++ b/tests/github_actions/__init__.py @@ -0,0 +1 @@ +# GitHub Actions rollout processor tests and scripts diff --git a/tests/github_actions/rollout_worker.py b/tests/github_actions/rollout_worker.py new file mode 100644 index 00000000..45df9f11 --- /dev/null +++ b/tests/github_actions/rollout_worker.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 +""" +GitHub Actions rollout worker script. + +This script is called by the GitHub Actions workflow to perform the actual rollout. +It makes an OpenAI completion call that gets automatically traced via the tracing proxy. +""" + +import argparse +import json +import os + +from openai import OpenAI + + +def main(): + parser = argparse.ArgumentParser(description="GitHub Actions rollout worker") + + # Required arguments from workflow inputs + parser.add_argument("--model", required=True, help="Model to use") + parser.add_argument("--metadata", required=True, help="JSON serialized metadata object") + parser.add_argument("--model-base-url", required=True, help="Base URL for the model API") + + args = parser.parse_args() + + # Parse the metadata + try: + metadata = json.loads(args.metadata) + except Exception as e: + print(f"❌ Failed to parse metadata: {e}") + exit(1) + + rollout_id = metadata["rollout_id"] + row_id = metadata["row_id"] + + print(f"🚀 Starting rollout {rollout_id}") + print(f" Model: {args.model}") + print(f" Row ID: {row_id}") + + dataset = [ # In this example, worker has access to the dataset and we use index to associate rows. + "What is the capital of France?", + "What is the capital of Germany?", + "What is the capital of Italy?", + ] + + user_content = dataset[int(row_id)] + messages = [{"role": "user", "content": user_content}] + + print(f" Messages: {len(messages)} messages") + + try: + completion_kwargs = {"model": args.model, "messages": messages} + + client = OpenAI(base_url=args.model_base_url, api_key=os.environ.get("FIREWORKS_API_KEY")) + + print("📡 Calling OpenAI completion...") + completion = client.chat.completions.create(**completion_kwargs) + + print(f"✅ Rollout {rollout_id} completed successfully") + + except Exception as e: + print(f"❌ Error in rollout {rollout_id}: {e}") + + +if __name__ == "__main__": + main() diff --git a/tests/github_actions/test_github_actions_rollout.py b/tests/github_actions/test_github_actions_rollout.py new file mode 100644 index 00000000..a4c80dcf --- /dev/null +++ b/tests/github_actions/test_github_actions_rollout.py @@ -0,0 +1,89 @@ +# GitHub Actions rollout processor test +# +# Pattern: Test creates empty rows with row_id, worker loads dataset by row_id +# Setup: GitHub repo with rollout.yml, FIREWORKS_API_KEY secret, GITHUB_TOKEN env var + +import os +from typing import List + +import pytest + +from eval_protocol.data_loader.dynamic_data_loader import DynamicDataLoader +from eval_protocol.models import EvaluationRow, InputMetadata +from eval_protocol.pytest import evaluation_test +from eval_protocol.pytest.github_action_rollout_processor import GithubActionRolloutProcessor +from eval_protocol.types.remote_rollout_processor import DataLoaderConfig +from eval_protocol.adapters.fireworks_tracing import FireworksTracingAdapter +from eval_protocol.quickstart.utils import filter_longest_conversation + +ROLLOUT_IDS = set() + + +@pytest.fixture(autouse=True) +def check_rollout_coverage(): + """Ensure we processed all expected rollout_ids""" + global ROLLOUT_IDS + ROLLOUT_IDS.clear() + yield + + assert len(ROLLOUT_IDS) == 3, f"Expected to see 3 rollout_ids, but only saw {ROLLOUT_IDS}" + + +def fetch_fireworks_traces(config: DataLoaderConfig) -> List[EvaluationRow]: + global ROLLOUT_IDS # Track all rollout_ids we've seen + ROLLOUT_IDS.add(config.rollout_id) + + base_url = config.model_base_url or "https://tracing.fireworks.ai" + adapter = FireworksTracingAdapter(base_url=base_url) + return adapter.get_evaluation_rows(tags=[f"rollout_id:{config.rollout_id}"], max_retries=5) + + +def fireworks_output_data_loader(config: DataLoaderConfig) -> DynamicDataLoader: + return DynamicDataLoader( + generators=[lambda: fetch_fireworks_traces(config)], preprocess_fn=filter_longest_conversation + ) + + +def rows() -> List[EvaluationRow]: + return [ + EvaluationRow(input_metadata=InputMetadata(row_id=str(i))) + for i in range( + 3 + ) # In this example we use index to associate rows. Dataset is assumed to be accessible to the worker. + ] + + +@pytest.mark.skipif(os.environ.get("CI") == "true", reason="Only run this test locally (skipped in CI)") +@pytest.mark.parametrize("completion_params", [{"model": "fireworks_ai/accounts/fireworks/models/gpt-oss-120b"}]) +@evaluation_test( + data_loaders=DynamicDataLoader( + generators=[rows], + ), + rollout_processor=GithubActionRolloutProcessor( + owner="eval-protocol", + repo="python-sdk", + workflow_id="rollout.yml", # or you can use numeric ID like "12345678" + ref=os.getenv("GITHUB_REF", "main"), + poll_interval=3.0, # For multi-turn, you'll likely want higher poll interval + timeout_seconds=300, + output_data_loader=fireworks_output_data_loader, + ), +) +async def test_github_actions_rollout(row: EvaluationRow) -> EvaluationRow: + """Test GitHub Actions rollout with worker-controlled dataset.""" + # Track rollout IDs for coverage check + global ROLLOUT_IDS + ROLLOUT_IDS.add(row.execution_metadata.rollout_id) + + # This dataset is built into github_actions/rollout_worker.py + if row.messages[0].content == "What is the capital of France?": + assert row.input_metadata.row_id == "0" + elif row.messages[0].content == "What is the capital of Germany?": + assert row.input_metadata.row_id == "1" + elif row.messages[0].content == "What is the capital of Italy?": + assert row.input_metadata.row_id == "2" + else: + assert False, "Row should have correct message content" + assert len(row.messages) > 1, "Row should have a response. If this fails, we fell back to the original row." + + return row diff --git a/tests/pytest/test_execution_metadata.py b/tests/pytest/test_execution_metadata.py index ba3b883d..edfbd734 100644 --- a/tests/pytest/test_execution_metadata.py +++ b/tests/pytest/test_execution_metadata.py @@ -2,7 +2,7 @@ from openai.types import CompletionUsage from eval_protocol.models import EvaluationRow, ExecutionMetadata, InputMetadata, CostMetrics, Message -from eval_protocol.pytest.utils import add_cost_metrics +from eval_protocol.pytest.evaluation_test_utils import add_cost_metrics class TestExecutionMetadata: diff --git a/tests/pytest/test_utils.py b/tests/pytest/test_utils.py index e8d64d99..0176c279 100644 --- a/tests/pytest/test_utils.py +++ b/tests/pytest/test_utils.py @@ -1,8 +1,8 @@ import asyncio -from unittest.mock import AsyncMock, MagicMock, patch +from unittest.mock import MagicMock import pytest -from eval_protocol.pytest.utils import rollout_processor_with_retry +from eval_protocol.pytest.evaluation_test_utils import rollout_processor_with_retry from eval_protocol.pytest.types import RolloutProcessorConfig from eval_protocol.models import EvaluationRow, Status, InputMetadata, ExecutionMetadata from eval_protocol.dataset_logger.dataset_logger import DatasetLogger @@ -112,12 +112,14 @@ async def flaky_task(): if call_count == 1: raise ConnectionError("Connection failed") else: + from datetime import datetime + row = EvaluationRow( messages=[], - input_metadata={}, + input_metadata=InputMetadata(completion_params={}), rollout_status=Status.rollout_finished(), - execution_metadata={}, - created_at="2024-01-01T00:00:00Z", + execution_metadata=ExecutionMetadata(), + created_at=datetime.fromisoformat("2024-01-01T00:00:00"), ) return row diff --git a/tests/test_evaluation_postprocess.py b/tests/test_evaluation_postprocess.py index 4bc790f9..05452151 100644 --- a/tests/test_evaluation_postprocess.py +++ b/tests/test_evaluation_postprocess.py @@ -1,6 +1,5 @@ """Tests for evaluation postprocess functionality.""" -import pytest from unittest.mock import Mock, patch from eval_protocol.models import EvaluationRow, EvaluateResult, EvalMetadata, ExecutionMetadata, InputMetadata, Message @@ -212,7 +211,7 @@ class TestBootstrapEquivalence: def test_bootstrap_equivalence_pandas_vs_pure_python(self): import random import pandas as pd - from eval_protocol.pytest.utils import calculate_bootstrap_scores as py_bootstrap + from eval_protocol.pytest.evaluation_test_utils import calculate_bootstrap_scores as py_bootstrap # Deterministic synthetic scores rng = random.Random(123) diff --git a/vite-app/dist/assets/index-BGlGI2LH.css b/vite-app/dist/assets/index-BGlGI2LH.css deleted file mode 100644 index 2091e90e..00000000 --- a/vite-app/dist/assets/index-BGlGI2LH.css +++ /dev/null @@ -1 +0,0 @@ -/*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-200:oklch(88.5% .062 18.334);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-800:oklch(47.6% .114 61.907);--color-yellow-900:oklch(42.1% .095 57.708);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-2xl:42rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--radius-md:.375rem;--radius-lg:.5rem;--animate-spin:spin 1s linear infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.top-0{top:calc(var(--spacing)*0)}.top-1{top:calc(var(--spacing)*1)}.right-0{right:calc(var(--spacing)*0)}.right-1{right:calc(var(--spacing)*1)}.left-0{left:calc(var(--spacing)*0)}.z-10{z-index:10}.z-50{z-index:50}.\!container{width:100%!important}@media (min-width:40rem){.\!container{max-width:40rem!important}}@media (min-width:48rem){.\!container{max-width:48rem!important}}@media (min-width:64rem){.\!container{max-width:64rem!important}}@media (min-width:80rem){.\!container{max-width:80rem!important}}@media (min-width:96rem){.\!container{max-width:96rem!important}}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mb-0\.5{margin-bottom:calc(var(--spacing)*.5)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-2{margin-left:calc(var(--spacing)*2)}.block{display:block}.contents{display:contents}.flex{display:flex}.flow-root{display:flow-root}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.inline-grid{display:inline-grid}.inline-table{display:inline-table}.list-item{display:list-item}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-column{display:table-column}.table-column-group{display:table-column-group}.table-footer-group{display:table-footer-group}.table-header-group{display:table-header-group}.table-row{display:table-row}.table-row-group{display:table-row-group}.h-1{height:calc(var(--spacing)*1)}.h-1\.5{height:calc(var(--spacing)*1.5)}.h-3{height:calc(var(--spacing)*3)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-8{height:calc(var(--spacing)*8)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-96{height:calc(var(--spacing)*96)}.max-h-48{max-height:calc(var(--spacing)*48)}.max-h-60{max-height:calc(var(--spacing)*60)}.max-h-\[800px\]{max-height:800px}.max-h-\[calc\(100vh-80px\)\]{max-height:calc(100vh - 80px)}.min-h-4{min-height:calc(var(--spacing)*4)}.min-h-screen{min-height:100vh}.w-1{width:calc(var(--spacing)*1)}.w-1\.5{width:calc(var(--spacing)*1.5)}.w-3{width:calc(var(--spacing)*3)}.w-4{width:calc(var(--spacing)*4)}.w-6{width:calc(var(--spacing)*6)}.w-8{width:calc(var(--spacing)*8)}.w-12{width:calc(var(--spacing)*12)}.w-\[500px\]{width:500px}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-\[200px\]{max-width:200px}.max-w-\[1200px\]{max-width:1200px}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-32{min-width:calc(var(--spacing)*32)}.min-w-36{min-width:calc(var(--spacing)*36)}.min-w-40{min-width:calc(var(--spacing)*40)}.min-w-48{min-width:calc(var(--spacing)*48)}.min-w-64{min-width:calc(var(--spacing)*64)}.min-w-max{min-width:max-content}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.grow{flex-grow:1}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.transform\!{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)!important}.animate-spin{animation:var(--animate-spin)}.cursor-col-resize{cursor:col-resize}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-nw-resize{cursor:nw-resize}.cursor-pointer{cursor:pointer}.cursor-row-resize{cursor:row-resize}.resize{resize:both}.flex-row{flex-direction:row}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-gray-200>:not(:last-child)){border-color:var(--color-gray-200)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-t-md{border-top-left-radius:var(--radius-md);border-top-right-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-blue-200{border-color:var(--color-blue-200)}.border-current{border-color:currentColor}.border-gray-100{border-color:var(--color-gray-100)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.border-gray-900{border-color:var(--color-gray-900)}.border-green-200{border-color:var(--color-green-200)}.border-red-200{border-color:var(--color-red-200)}.border-transparent{border-color:#0000}.border-yellow-200{border-color:var(--color-yellow-200)}.border-t-gray-600{border-top-color:var(--color-gray-600)}.border-t-transparent{border-top-color:#0000}.border-l-blue-500{border-left-color:var(--color-blue-500)}.border-l-gray-300{border-left-color:var(--color-gray-300)}.border-l-green-500{border-left-color:var(--color-green-500)}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-gray-300{background-color:var(--color-gray-300)}.bg-gray-500{background-color:var(--color-gray-500)}.bg-gray-800{background-color:var(--color-gray-800)}.bg-green-50{background-color:var(--color-green-50)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-500{background-color:var(--color-green-500)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-500{background-color:var(--color-red-500)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-yellow-50{background-color:var(--color-yellow-50)}.bg-yellow-100{background-color:var(--color-yellow-100)}.bg-yellow-500{background-color:var(--color-yellow-500)}.p-0{padding:calc(var(--spacing)*0)}.p-0\.5{padding:calc(var(--spacing)*.5)}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-8{padding:calc(var(--spacing)*8)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-3{padding-inline:calc(var(--spacing)*3)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-6{padding-block:calc(var(--spacing)*6)}.py-8{padding-block:calc(var(--spacing)*8)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-2{padding-top:calc(var(--spacing)*2)}.pr-8{padding-right:calc(var(--spacing)*8)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pl-3{padding-left:calc(var(--spacing)*3)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.text-nowrap{text-wrap:nowrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-blue-900{color:var(--color-blue-900)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-green-800{color:var(--color-green-800)}.text-green-900{color:var(--color-green-900)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-white{color:var(--color-white)}.text-yellow-600{color:var(--color-yellow-600)}.text-yellow-700{color:var(--color-yellow-700)}.text-yellow-800{color:var(--color-yellow-800)}.text-yellow-900{color:var(--color-yellow-900)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.line-through{text-decoration-line:line-through}.overline{text-decoration-line:overline}.underline{text-decoration-line:underline}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter\!{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)!important}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,visibility,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.select-none{-webkit-user-select:none;user-select:none}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media (hover:hover){.hover\:border-gray-400:hover{border-color:var(--color-gray-400)}.hover\:bg-blue-100:hover{background-color:var(--color-blue-100)}.hover\:bg-gray-50:hover{background-color:var(--color-gray-50)}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-gray-200:hover{background-color:var(--color-gray-200)}.hover\:bg-gray-400:hover{background-color:var(--color-gray-400)}.hover\:bg-green-100:hover{background-color:var(--color-green-100)}.hover\:bg-yellow-100:hover{background-color:var(--color-yellow-100)}.hover\:text-blue-800:hover{color:var(--color-blue-800)}.hover\:text-gray-600:hover{color:var(--color-gray-600)}.hover\:text-gray-900:hover{color:var(--color-gray-900)}.hover\:text-red-800:hover{color:var(--color-red-800)}.hover\:no-underline:hover{text-decoration-line:none}.hover\:opacity-100:hover{opacity:1}}.focus\:border-gray-500:focus{border-color:var(--color-gray-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}@media (min-width:64rem){.lg\:max-w-md{max-width:var(--container-md)}}@media (min-width:80rem){.xl\:max-w-lg{max-width:var(--container-lg)}}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}} diff --git a/vite-app/dist/assets/index-BnDJont9.css b/vite-app/dist/assets/index-BnDJont9.css new file mode 100644 index 00000000..c1932773 --- /dev/null +++ b/vite-app/dist/assets/index-BnDJont9.css @@ -0,0 +1 @@ +/*! tailwindcss v4.1.12 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-200:oklch(88.5% .062 18.334);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-800:oklch(47.6% .114 61.907);--color-yellow-900:oklch(42.1% .095 57.708);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-2xl:42rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--radius-md:.375rem;--radius-lg:.5rem;--animate-spin:spin 1s linear infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.top-0{top:calc(var(--spacing)*0)}.top-1{top:calc(var(--spacing)*1)}.right-0{right:calc(var(--spacing)*0)}.right-1{right:calc(var(--spacing)*1)}.left-0{left:calc(var(--spacing)*0)}.z-10{z-index:10}.z-50{z-index:50}.\!container{width:100%!important}@media (min-width:40rem){.\!container{max-width:40rem!important}}@media (min-width:48rem){.\!container{max-width:48rem!important}}@media (min-width:64rem){.\!container{max-width:64rem!important}}@media (min-width:80rem){.\!container{max-width:80rem!important}}@media (min-width:96rem){.\!container{max-width:96rem!important}}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mb-0\.5{margin-bottom:calc(var(--spacing)*.5)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-2{margin-left:calc(var(--spacing)*2)}.block{display:block}.contents{display:contents}.flex{display:flex}.flow-root{display:flow-root}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.inline-grid{display:inline-grid}.inline-table{display:inline-table}.list-item{display:list-item}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-column{display:table-column}.table-column-group{display:table-column-group}.table-footer-group{display:table-footer-group}.table-header-group{display:table-header-group}.table-row{display:table-row}.table-row-group{display:table-row-group}.h-1{height:calc(var(--spacing)*1)}.h-1\.5{height:calc(var(--spacing)*1.5)}.h-3{height:calc(var(--spacing)*3)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-8{height:calc(var(--spacing)*8)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-96{height:calc(var(--spacing)*96)}.max-h-48{max-height:calc(var(--spacing)*48)}.max-h-60{max-height:calc(var(--spacing)*60)}.max-h-\[800px\]{max-height:800px}.max-h-\[calc\(100vh-80px\)\]{max-height:calc(100vh - 80px)}.min-h-4{min-height:calc(var(--spacing)*4)}.min-h-screen{min-height:100vh}.w-1{width:calc(var(--spacing)*1)}.w-1\.5{width:calc(var(--spacing)*1.5)}.w-3{width:calc(var(--spacing)*3)}.w-4{width:calc(var(--spacing)*4)}.w-6{width:calc(var(--spacing)*6)}.w-8{width:calc(var(--spacing)*8)}.w-12{width:calc(var(--spacing)*12)}.w-\[500px\]{width:500px}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-\[200px\]{max-width:200px}.max-w-\[1200px\]{max-width:1200px}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-32{min-width:calc(var(--spacing)*32)}.min-w-36{min-width:calc(var(--spacing)*36)}.min-w-40{min-width:calc(var(--spacing)*40)}.min-w-48{min-width:calc(var(--spacing)*48)}.min-w-64{min-width:calc(var(--spacing)*64)}.min-w-max{min-width:max-content}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.grow{flex-grow:1}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.transform\!{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)!important}.animate-spin{animation:var(--animate-spin)}.cursor-col-resize{cursor:col-resize}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-nw-resize{cursor:nw-resize}.cursor-pointer{cursor:pointer}.cursor-row-resize{cursor:row-resize}.resize{resize:both}.flex-row{flex-direction:row}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-gray-200>:not(:last-child)){border-color:var(--color-gray-200)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-t-md{border-top-left-radius:var(--radius-md);border-top-right-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-blue-200{border-color:var(--color-blue-200)}.border-current{border-color:currentColor}.border-gray-100{border-color:var(--color-gray-100)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.border-gray-900{border-color:var(--color-gray-900)}.border-green-200{border-color:var(--color-green-200)}.border-red-200{border-color:var(--color-red-200)}.border-transparent{border-color:#0000}.border-yellow-200{border-color:var(--color-yellow-200)}.border-t-gray-600{border-top-color:var(--color-gray-600)}.border-t-transparent{border-top-color:#0000}.border-l-blue-500{border-left-color:var(--color-blue-500)}.border-l-gray-300{border-left-color:var(--color-gray-300)}.border-l-green-500{border-left-color:var(--color-green-500)}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-gray-300{background-color:var(--color-gray-300)}.bg-gray-500{background-color:var(--color-gray-500)}.bg-gray-800{background-color:var(--color-gray-800)}.bg-green-50{background-color:var(--color-green-50)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-500{background-color:var(--color-green-500)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-500{background-color:var(--color-red-500)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-yellow-50{background-color:var(--color-yellow-50)}.bg-yellow-100{background-color:var(--color-yellow-100)}.bg-yellow-500{background-color:var(--color-yellow-500)}.p-0{padding:calc(var(--spacing)*0)}.p-0\.5{padding:calc(var(--spacing)*.5)}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-8{padding:calc(var(--spacing)*8)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-3{padding-inline:calc(var(--spacing)*3)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-6{padding-block:calc(var(--spacing)*6)}.py-8{padding-block:calc(var(--spacing)*8)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-2{padding-top:calc(var(--spacing)*2)}.pr-8{padding-right:calc(var(--spacing)*8)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pl-3{padding-left:calc(var(--spacing)*3)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.text-nowrap{text-wrap:nowrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-blue-900{color:var(--color-blue-900)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-green-800{color:var(--color-green-800)}.text-green-900{color:var(--color-green-900)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-white{color:var(--color-white)}.text-yellow-600{color:var(--color-yellow-600)}.text-yellow-700{color:var(--color-yellow-700)}.text-yellow-800{color:var(--color-yellow-800)}.text-yellow-900{color:var(--color-yellow-900)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.line-through{text-decoration-line:line-through}.overline{text-decoration-line:overline}.underline{text-decoration-line:underline}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter\!{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)!important}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,visibility,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.select-none{-webkit-user-select:none;user-select:none}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media (hover:hover){.hover\:border-gray-400:hover{border-color:var(--color-gray-400)}.hover\:bg-blue-100:hover{background-color:var(--color-blue-100)}.hover\:bg-gray-50:hover{background-color:var(--color-gray-50)}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-gray-200:hover{background-color:var(--color-gray-200)}.hover\:bg-gray-400:hover{background-color:var(--color-gray-400)}.hover\:bg-green-100:hover{background-color:var(--color-green-100)}.hover\:bg-yellow-100:hover{background-color:var(--color-yellow-100)}.hover\:text-blue-800:hover{color:var(--color-blue-800)}.hover\:text-gray-600:hover{color:var(--color-gray-600)}.hover\:text-gray-900:hover{color:var(--color-gray-900)}.hover\:text-red-800:hover{color:var(--color-red-800)}.hover\:no-underline:hover{text-decoration-line:none}.hover\:opacity-100:hover{opacity:1}}.focus\:border-gray-500:focus{border-color:var(--color-gray-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}@media (min-width:64rem){.lg\:max-w-md{max-width:var(--container-md)}}@media (min-width:80rem){.xl\:max-w-lg{max-width:var(--container-lg)}}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}} diff --git a/vite-app/dist/assets/index-Cu9t0G5i.js b/vite-app/dist/assets/index-Cu9t0G5i.js new file mode 100644 index 00000000..3d415958 --- /dev/null +++ b/vite-app/dist/assets/index-Cu9t0G5i.js @@ -0,0 +1,137 @@ +(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const s of i)if(s.type==="childList")for(const o of s.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&n(o)}).observe(document,{childList:!0,subtree:!0});function A(i){const s={};return i.integrity&&(s.integrity=i.integrity),i.referrerPolicy&&(s.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?s.credentials="include":i.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function n(i){if(i.ep)return;i.ep=!0;const s=A(i);fetch(i.href,s)}})();function kB(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var Sp={exports:{}},ml={};/** + * @license React + * react-jsx-runtime.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var gy;function RO(){if(gy)return ml;gy=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.fragment");function A(n,i,s){var o=null;if(s!==void 0&&(o=""+s),i.key!==void 0&&(o=""+i.key),"key"in i){s={};for(var c in i)c!=="key"&&(s[c]=i[c])}else s=i;return i=s.ref,{$$typeof:t,type:n,key:o,ref:i!==void 0?i:null,props:s}}return ml.Fragment=e,ml.jsx=A,ml.jsxs=A,ml}var py;function IO(){return py||(py=1,Sp.exports=RO()),Sp.exports}var x=IO(),Op={exports:{}},Ue={};/** + * @license React + * react.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var my;function NO(){if(my)return Ue;my=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.portal"),A=Symbol.for("react.fragment"),n=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),s=Symbol.for("react.consumer"),o=Symbol.for("react.context"),c=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),h=Symbol.for("react.memo"),d=Symbol.for("react.lazy"),p=Symbol.iterator;function B(T){return T===null||typeof T!="object"?null:(T=p&&T[p]||T["@@iterator"],typeof T=="function"?T:null)}var v={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},w=Object.assign,b={};function _(T,j,Ae){this.props=T,this.context=j,this.refs=b,this.updater=Ae||v}_.prototype.isReactComponent={},_.prototype.setState=function(T,j){if(typeof T!="object"&&typeof T!="function"&&T!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,T,j,"setState")},_.prototype.forceUpdate=function(T){this.updater.enqueueForceUpdate(this,T,"forceUpdate")};function C(){}C.prototype=_.prototype;function Q(T,j,Ae){this.props=T,this.context=j,this.refs=b,this.updater=Ae||v}var E=Q.prototype=new C;E.constructor=Q,w(E,_.prototype),E.isPureReactComponent=!0;var O=Array.isArray,S={H:null,A:null,T:null,S:null,V:null},D=Object.prototype.hasOwnProperty;function R(T,j,Ae,ee,Y,fe){return Ae=fe.ref,{$$typeof:t,type:T,key:j,ref:Ae!==void 0?Ae:null,props:fe}}function z(T,j){return R(T.type,j,void 0,void 0,void 0,T.props)}function N(T){return typeof T=="object"&&T!==null&&T.$$typeof===t}function J(T){var j={"=":"=0",":":"=2"};return"$"+T.replace(/[=:]/g,function(Ae){return j[Ae]})}var te=/\/+/g;function ne(T,j){return typeof T=="object"&&T!==null&&T.key!=null?J(""+T.key):j.toString(36)}function oe(){}function he(T){switch(T.status){case"fulfilled":return T.value;case"rejected":throw T.reason;default:switch(typeof T.status=="string"?T.then(oe,oe):(T.status="pending",T.then(function(j){T.status==="pending"&&(T.status="fulfilled",T.value=j)},function(j){T.status==="pending"&&(T.status="rejected",T.reason=j)})),T.status){case"fulfilled":return T.value;case"rejected":throw T.reason}}throw T}function se(T,j,Ae,ee,Y){var fe=typeof T;(fe==="undefined"||fe==="boolean")&&(T=null);var le=!1;if(T===null)le=!0;else switch(fe){case"bigint":case"string":case"number":le=!0;break;case"object":switch(T.$$typeof){case t:case e:le=!0;break;case d:return le=T._init,se(le(T._payload),j,Ae,ee,Y)}}if(le)return Y=Y(T),le=ee===""?"."+ne(T,0):ee,O(Y)?(Ae="",le!=null&&(Ae=le.replace(te,"$&/")+"/"),se(Y,j,Ae,"",function($e){return $e})):Y!=null&&(N(Y)&&(Y=z(Y,Ae+(Y.key==null||T&&T.key===Y.key?"":(""+Y.key).replace(te,"$&/")+"/")+le)),j.push(Y)),1;le=0;var dt=ee===""?".":ee+":";if(O(T))for(var Ke=0;Ke>>1,T=L[ce];if(0>>1;cei(ee,q))Yi(fe,ee)?(L[ce]=fe,L[Y]=q,ce=Y):(L[ce]=ee,L[Ae]=q,ce=Ae);else if(Yi(fe,q))L[ce]=fe,L[Y]=q,ce=Y;else break e}}return G}function i(L,G){var q=L.sortIndex-G.sortIndex;return q!==0?q:L.id-G.id}if(t.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var s=performance;t.unstable_now=function(){return s.now()}}else{var o=Date,c=o.now();t.unstable_now=function(){return o.now()-c}}var u=[],h=[],d=1,p=null,B=3,v=!1,w=!1,b=!1,_=!1,C=typeof setTimeout=="function"?setTimeout:null,Q=typeof clearTimeout=="function"?clearTimeout:null,E=typeof setImmediate<"u"?setImmediate:null;function O(L){for(var G=A(h);G!==null;){if(G.callback===null)n(h);else if(G.startTime<=L)n(h),G.sortIndex=G.expirationTime,e(u,G);else break;G=A(h)}}function S(L){if(b=!1,O(L),!w)if(A(u)!==null)w=!0,D||(D=!0,ne());else{var G=A(h);G!==null&&se(S,G.startTime-L)}}var D=!1,R=-1,z=5,N=-1;function J(){return _?!0:!(t.unstable_now()-NL&&J());){var ce=p.callback;if(typeof ce=="function"){p.callback=null,B=p.priorityLevel;var T=ce(p.expirationTime<=L);if(L=t.unstable_now(),typeof T=="function"){p.callback=T,O(L),G=!0;break t}p===A(u)&&n(u),O(L)}else n(u);p=A(u)}if(p!==null)G=!0;else{var j=A(h);j!==null&&se(S,j.startTime-L),G=!1}}break e}finally{p=null,B=q,v=!1}G=void 0}}finally{G?ne():D=!1}}}var ne;if(typeof E=="function")ne=function(){E(te)};else if(typeof MessageChannel<"u"){var oe=new MessageChannel,he=oe.port2;oe.port1.onmessage=te,ne=function(){he.postMessage(null)}}else ne=function(){C(te,0)};function se(L,G){R=C(function(){L(t.unstable_now())},G)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(L){L.callback=null},t.unstable_forceFrameRate=function(L){0>L||125ce?(L.sortIndex=q,e(h,L),A(u)===null&&L===A(h)&&(b?(Q(R),R=-1):b=!0,se(S,q-ce))):(L.sortIndex=T,e(u,L),w||v||(w=!0,D||(D=!0,ne()))),L},t.unstable_shouldYield=J,t.unstable_wrapCallback=function(L){var G=B;return function(){var q=B;B=G;try{return L.apply(this,arguments)}finally{B=q}}}})(Dp)),Dp}var wy;function KO(){return wy||(wy=1,Tp.exports=kO()),Tp.exports}var Mp={exports:{}},pA={};/** + * @license React + * react-dom.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var by;function zO(){if(by)return pA;by=1;var t=Nh();function e(u){var h="https://react.dev/errors/"+u;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(e){console.error(e)}}return t(),Mp.exports=zO(),Mp.exports}/** + * @license React + * react-dom-client.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Cy;function VO(){if(Cy)return Bl;Cy=1;var t=KO(),e=Nh(),A=yQ();function n(r){var a="https://react.dev/errors/"+r;if(1T||(r.current=ce[T],ce[T]=null,T--)}function ee(r,a){T++,ce[T]=r.current,r.current=a}var Y=j(null),fe=j(null),le=j(null),dt=j(null);function Ke(r,a){switch(ee(le,a),ee(fe,r),ee(Y,null),a.nodeType){case 9:case 11:r=(r=a.documentElement)&&(r=r.namespaceURI)?Vb(r):0;break;default:if(r=a.tagName,a=a.namespaceURI)a=Vb(a),r=Pb(a,r);else switch(r){case"svg":r=1;break;case"math":r=2;break;default:r=0}}Ae(Y),ee(Y,r)}function $e(){Ae(Y),Ae(fe),Ae(le)}function An(r){r.memoizedState!==null&&ee(dt,r);var a=Y.current,l=Pb(a,r.type);a!==l&&(ee(fe,r),ee(Y,l))}function Xt(r){fe.current===r&&(Ae(Y),Ae(fe)),dt.current===r&&(Ae(dt),fl._currentValue=q)}var iA=Object.prototype.hasOwnProperty,FA=t.unstable_scheduleCallback,SA=t.unstable_cancelCallback,ta=t.unstable_shouldYield,_A=t.unstable_requestPaint,xA=t.unstable_now,mi=t.unstable_getCurrentPriorityLevel,Pn=t.unstable_ImmediatePriority,at=t.unstable_UserBlockingPriority,jn=t.unstable_NormalPriority,ts=t.unstable_LowPriority,Ar=t.unstable_IdlePriority,As=t.log,Aa=t.unstable_setDisableYieldValue,nn=null,xt=null;function OA(r){if(typeof As=="function"&&Aa(r),xt&&typeof xt.setStrictMode=="function")try{xt.setStrictMode(nn,r)}catch{}}var Ot=Math.clz32?Math.clz32:ir,nr=Math.log,yo=Math.LN2;function ir(r){return r>>>=0,r===0?32:31-(nr(r)/yo|0)|0}var rn=256,uA=4194304;function We(r){var a=r&42;if(a!==0)return a;switch(r&-r){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return r&4194048;case 4194304:case 8388608:case 16777216:case 33554432:return r&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return r}}function Bi(r,a,l){var f=r.pendingLanes;if(f===0)return 0;var g=0,m=r.suspendedLanes,y=r.pingedLanes;r=r.warmLanes;var U=f&134217727;return U!==0?(f=U&~m,f!==0?g=We(f):(y&=U,y!==0?g=We(y):l||(l=U&~r,l!==0&&(g=We(l))))):(U=f&~m,U!==0?g=We(U):y!==0?g=We(y):l||(l=f&~r,l!==0&&(g=We(l)))),g===0?0:a!==0&&a!==g&&(a&m)===0&&(m=g&-g,l=a&-a,m>=l||m===32&&(l&4194048)!==0)?a:g}function En(r,a){return(r.pendingLanes&~(r.suspendedLanes&~r.pingedLanes)&a)===0}function rr(r,a){switch(r){case 1:case 2:case 4:case 8:case 64:return a+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return a+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function sr(){var r=rn;return rn<<=1,(rn&4194048)===0&&(rn=256),r}function vi(){var r=uA;return uA<<=1,(uA&62914560)===0&&(uA=4194304),r}function Gn(r){for(var a=[],l=0;31>l;l++)a.push(r);return a}function sn(r,a){r.pendingLanes|=a,a!==268435456&&(r.suspendedLanes=0,r.pingedLanes=0,r.warmLanes=0)}function ns(r,a,l,f,g,m){var y=r.pendingLanes;r.pendingLanes=l,r.suspendedLanes=0,r.pingedLanes=0,r.warmLanes=0,r.expiredLanes&=l,r.entangledLanes&=l,r.errorRecoveryDisabledLanes&=l,r.shellSuspendCounter=0;var U=r.entanglements,H=r.expirationTimes,K=r.hiddenUpdates;for(l=y&~l;0)":-1g||H[f]!==K[g]){var X=` +`+H[f].replace(" at new "," at ");return r.displayName&&X.includes("")&&(X=X.replace("",r.displayName)),X}while(1<=f&&0<=g);break}}}finally{xd=!1,Error.prepareStackTrace=l}return(l=r?r.displayName||r.name:"")?ra(l):""}function OS(r){switch(r.tag){case 26:case 27:case 5:return ra(r.type);case 16:return ra("Lazy");case 13:return ra("Suspense");case 19:return ra("SuspenseList");case 0:case 15:return Qd(r.type,!1);case 11:return Qd(r.type.render,!1);case 1:return Qd(r.type,!0);case 31:return ra("Activity");default:return""}}function R0(r){try{var a="";do a+=OS(r),r=r.return;while(r);return a}catch(l){return` +Error generating stack: `+l.message+` +`+l.stack}}function ln(r){switch(typeof r){case"bigint":case"boolean":case"number":case"string":case"undefined":return r;case"object":return r;default:return""}}function I0(r){var a=r.type;return(r=r.nodeName)&&r.toLowerCase()==="input"&&(a==="checkbox"||a==="radio")}function HS(r){var a=I0(r)?"checked":"value",l=Object.getOwnPropertyDescriptor(r.constructor.prototype,a),f=""+r[a];if(!r.hasOwnProperty(a)&&typeof l<"u"&&typeof l.get=="function"&&typeof l.set=="function"){var g=l.get,m=l.set;return Object.defineProperty(r,a,{configurable:!0,get:function(){return g.call(this)},set:function(y){f=""+y,m.call(this,y)}}),Object.defineProperty(r,a,{enumerable:l.enumerable}),{getValue:function(){return f},setValue:function(y){f=""+y},stopTracking:function(){r._valueTracker=null,delete r[a]}}}}function Ic(r){r._valueTracker||(r._valueTracker=HS(r))}function N0(r){if(!r)return!1;var a=r._valueTracker;if(!a)return!0;var l=a.getValue(),f="";return r&&(f=I0(r)?r.checked?"true":"false":r.value),r=f,r!==l?(a.setValue(r),!0):!1}function Nc(r){if(r=r||(typeof document<"u"?document:void 0),typeof r>"u")return null;try{return r.activeElement||r.body}catch{return r.body}}var TS=/[\n"\\]/g;function cn(r){return r.replace(TS,function(a){return"\\"+a.charCodeAt(0).toString(16)+" "})}function Ud(r,a,l,f,g,m,y,U){r.name="",y!=null&&typeof y!="function"&&typeof y!="symbol"&&typeof y!="boolean"?r.type=y:r.removeAttribute("type"),a!=null?y==="number"?(a===0&&r.value===""||r.value!=a)&&(r.value=""+ln(a)):r.value!==""+ln(a)&&(r.value=""+ln(a)):y!=="submit"&&y!=="reset"||r.removeAttribute("value"),a!=null?Ed(r,y,ln(a)):l!=null?Ed(r,y,ln(l)):f!=null&&r.removeAttribute("value"),g==null&&m!=null&&(r.defaultChecked=!!m),g!=null&&(r.checked=g&&typeof g!="function"&&typeof g!="symbol"),U!=null&&typeof U!="function"&&typeof U!="symbol"&&typeof U!="boolean"?r.name=""+ln(U):r.removeAttribute("name")}function k0(r,a,l,f,g,m,y,U){if(m!=null&&typeof m!="function"&&typeof m!="symbol"&&typeof m!="boolean"&&(r.type=m),a!=null||l!=null){if(!(m!=="submit"&&m!=="reset"||a!=null))return;l=l!=null?""+ln(l):"",a=a!=null?""+ln(a):l,U||a===r.value||(r.value=a),r.defaultValue=a}f=f??g,f=typeof f!="function"&&typeof f!="symbol"&&!!f,r.checked=U?r.checked:!!f,r.defaultChecked=!!f,y!=null&&typeof y!="function"&&typeof y!="symbol"&&typeof y!="boolean"&&(r.name=y)}function Ed(r,a,l){a==="number"&&Nc(r.ownerDocument)===r||r.defaultValue===""+l||(r.defaultValue=""+l)}function sa(r,a,l,f){if(r=r.options,a){a={};for(var g=0;g"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Td=!1;if(yi)try{var Qo={};Object.defineProperty(Qo,"passive",{get:function(){Td=!0}}),window.addEventListener("test",Qo,Qo),window.removeEventListener("test",Qo,Qo)}catch{Td=!1}var lr=null,Dd=null,Kc=null;function X0(){if(Kc)return Kc;var r,a=Dd,l=a.length,f,g="value"in lr?lr.value:lr.textContent,m=g.length;for(r=0;r=Fo),q0=" ",ev=!1;function tv(r,a){switch(r){case"keyup":return a1.indexOf(a.keyCode)!==-1;case"keydown":return a.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Av(r){return r=r.detail,typeof r=="object"&&"data"in r?r.data:null}var ca=!1;function l1(r,a){switch(r){case"compositionend":return Av(a);case"keypress":return a.which!==32?null:(ev=!0,q0);case"textInput":return r=a.data,r===q0&&ev?null:r;default:return null}}function c1(r,a){if(ca)return r==="compositionend"||!Nd&&tv(r,a)?(r=X0(),Kc=Dd=lr=null,ca=!1,r):null;switch(r){case"paste":return null;case"keypress":if(!(a.ctrlKey||a.altKey||a.metaKey)||a.ctrlKey&&a.altKey){if(a.char&&1=a)return{node:l,offset:a-r};r=f}e:{for(;l;){if(l.nextSibling){l=l.nextSibling;break e}l=l.parentNode}l=void 0}l=cv(l)}}function fv(r,a){return r&&a?r===a?!0:r&&r.nodeType===3?!1:a&&a.nodeType===3?fv(r,a.parentNode):"contains"in r?r.contains(a):r.compareDocumentPosition?!!(r.compareDocumentPosition(a)&16):!1:!1}function hv(r){r=r!=null&&r.ownerDocument!=null&&r.ownerDocument.defaultView!=null?r.ownerDocument.defaultView:window;for(var a=Nc(r.document);a instanceof r.HTMLIFrameElement;){try{var l=typeof a.contentWindow.location.href=="string"}catch{l=!1}if(l)r=a.contentWindow;else break;a=Nc(r.document)}return a}function zd(r){var a=r&&r.nodeName&&r.nodeName.toLowerCase();return a&&(a==="input"&&(r.type==="text"||r.type==="search"||r.type==="tel"||r.type==="url"||r.type==="password")||a==="textarea"||r.contentEditable==="true")}var B1=yi&&"documentMode"in document&&11>=document.documentMode,ua=null,Vd=null,To=null,Pd=!1;function dv(r,a,l){var f=l.window===l?l.document:l.nodeType===9?l:l.ownerDocument;Pd||ua==null||ua!==Nc(f)||(f=ua,"selectionStart"in f&&zd(f)?f={start:f.selectionStart,end:f.selectionEnd}:(f=(f.ownerDocument&&f.ownerDocument.defaultView||window).getSelection(),f={anchorNode:f.anchorNode,anchorOffset:f.anchorOffset,focusNode:f.focusNode,focusOffset:f.focusOffset}),To&&Ho(To,f)||(To=f,f=Ou(Vd,"onSelect"),0>=y,g-=y,_i=1<<32-Ot(a)+g|l<m?m:8;var y=L.T,U={};L.T=U,Fg(r,!1,a,l);try{var H=g(),K=L.S;if(K!==null&&K(U,H),H!==null&&typeof H=="object"&&typeof H.then=="function"){var X=U1(H,f);Zo(r,a,X,XA(r))}else Zo(r,a,f,XA(r))}catch(W){Zo(r,a,{then:function(){},status:"rejected",reason:W},XA())}finally{G.p=m,L.T=y}}function H1(){}function Ug(r,a,l,f){if(r.tag!==5)throw Error(n(476));var g=gw(r).queue;dw(r,g,a,q,l===null?H1:function(){return pw(r),l(f)})}function gw(r){var a=r.memoizedState;if(a!==null)return a;a={memoizedState:q,baseState:q,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Ei,lastRenderedState:q},next:null};var l={};return a.next={memoizedState:l,baseState:l,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Ei,lastRenderedState:l},next:null},r.memoizedState=a,r=r.alternate,r!==null&&(r.memoizedState=a),a}function pw(r){var a=gw(r).next.queue;Zo(r,a,{},XA())}function Eg(){return gA(fl)}function mw(){return Kt().memoizedState}function Bw(){return Kt().memoizedState}function T1(r){for(var a=r.return;a!==null;){switch(a.tag){case 24:case 3:var l=XA();r=fr(l);var f=hr(a,r,l);f!==null&&(ZA(f,a,l),zo(f,a,l)),a={cache:ig()},r.payload=a;return}a=a.return}}function D1(r,a,l){var f=XA();l={lane:f,revertLane:0,action:l,hasEagerState:!1,eagerState:null,next:null},uu(r)?ww(a,l):(l=Zd(r,a,l,f),l!==null&&(ZA(l,r,f),bw(l,a,f)))}function vw(r,a,l){var f=XA();Zo(r,a,l,f)}function Zo(r,a,l,f){var g={lane:f,revertLane:0,action:l,hasEagerState:!1,eagerState:null,next:null};if(uu(r))ww(a,g);else{var m=r.alternate;if(r.lanes===0&&(m===null||m.lanes===0)&&(m=a.lastRenderedReducer,m!==null))try{var y=a.lastRenderedState,U=m(y,l);if(g.hasEagerState=!0,g.eagerState=U,zA(U,y))return Zc(r,a,g,0),ot===null&&Xc(),!1}catch{}finally{}if(l=Zd(r,a,g,f),l!==null)return ZA(l,r,f),bw(l,a,f),!0}return!1}function Fg(r,a,l,f){if(f={lane:2,revertLane:ap(),action:f,hasEagerState:!1,eagerState:null,next:null},uu(r)){if(a)throw Error(n(479))}else a=Zd(r,l,f,2),a!==null&&ZA(a,r,2)}function uu(r){var a=r.alternate;return r===Ee||a!==null&&a===Ee}function ww(r,a){ba=ru=!0;var l=r.pending;l===null?a.next=a:(a.next=l.next,l.next=a),r.pending=a}function bw(r,a,l){if((l&4194048)!==0){var f=a.lanes;f&=r.pendingLanes,l|=f,a.lanes=l,Ht(r,l)}}var fu={readContext:gA,use:au,useCallback:Mt,useContext:Mt,useEffect:Mt,useImperativeHandle:Mt,useLayoutEffect:Mt,useInsertionEffect:Mt,useMemo:Mt,useReducer:Mt,useRef:Mt,useState:Mt,useDebugValue:Mt,useDeferredValue:Mt,useTransition:Mt,useSyncExternalStore:Mt,useId:Mt,useHostTransitionStatus:Mt,useFormState:Mt,useActionState:Mt,useOptimistic:Mt,useMemoCache:Mt,useCacheRefresh:Mt},yw={readContext:gA,use:au,useCallback:function(r,a){return TA().memoizedState=[r,a===void 0?null:a],r},useContext:gA,useEffect:rw,useImperativeHandle:function(r,a,l){l=l!=null?l.concat([r]):null,cu(4194308,4,lw.bind(null,a,r),l)},useLayoutEffect:function(r,a){return cu(4194308,4,r,a)},useInsertionEffect:function(r,a){cu(4,2,r,a)},useMemo:function(r,a){var l=TA();a=a===void 0?null:a;var f=r();if(Bs){OA(!0);try{r()}finally{OA(!1)}}return l.memoizedState=[f,a],f},useReducer:function(r,a,l){var f=TA();if(l!==void 0){var g=l(a);if(Bs){OA(!0);try{l(a)}finally{OA(!1)}}}else g=a;return f.memoizedState=f.baseState=g,r={pending:null,lanes:0,dispatch:null,lastRenderedReducer:r,lastRenderedState:g},f.queue=r,r=r.dispatch=D1.bind(null,Ee,r),[f.memoizedState,r]},useRef:function(r){var a=TA();return r={current:r},a.memoizedState=r},useState:function(r){r=Cg(r);var a=r.queue,l=vw.bind(null,Ee,a);return a.dispatch=l,[r.memoizedState,l]},useDebugValue:xg,useDeferredValue:function(r,a){var l=TA();return Qg(l,r,a)},useTransition:function(){var r=Cg(!1);return r=dw.bind(null,Ee,r.queue,!0,!1),TA().memoizedState=r,[!1,r]},useSyncExternalStore:function(r,a,l){var f=Ee,g=TA();if(Pe){if(l===void 0)throw Error(n(407));l=l()}else{if(l=a(),ot===null)throw Error(n(349));(Le&124)!==0||Vv(f,a,l)}g.memoizedState=l;var m={value:l,getSnapshot:a};return g.queue=m,rw(jv.bind(null,f,m,r),[r]),f.flags|=2048,Ca(9,lu(),Pv.bind(null,f,m,l,a),null),l},useId:function(){var r=TA(),a=ot.identifierPrefix;if(Pe){var l=xi,f=_i;l=(f&~(1<<32-Ot(f)-1)).toString(32)+l,a="«"+a+"R"+l,l=su++,0Ce?(Wt=ve,ve=null):Wt=ve.sibling;var Ie=V(I,ve,k[Ce],$);if(Ie===null){ve===null&&(ve=Wt);break}r&&ve&&Ie.alternate===null&&a(I,ve),M=m(Ie,M,Ce),Fe===null?pe=Ie:Fe.sibling=Ie,Fe=Ie,ve=Wt}if(Ce===k.length)return l(I,ve),Pe&&fs(I,Ce),pe;if(ve===null){for(;CeCe?(Wt=ve,ve=null):Wt=ve.sibling;var Sr=V(I,ve,Ie.value,$);if(Sr===null){ve===null&&(ve=Wt);break}r&&ve&&Sr.alternate===null&&a(I,ve),M=m(Sr,M,Ce),Fe===null?pe=Sr:Fe.sibling=Sr,Fe=Sr,ve=Wt}if(Ie.done)return l(I,ve),Pe&&fs(I,Ce),pe;if(ve===null){for(;!Ie.done;Ce++,Ie=k.next())Ie=W(I,Ie.value,$),Ie!==null&&(M=m(Ie,M,Ce),Fe===null?pe=Ie:Fe.sibling=Ie,Fe=Ie);return Pe&&fs(I,Ce),pe}for(ve=f(ve);!Ie.done;Ce++,Ie=k.next())Ie=P(ve,I,Ce,Ie.value,$),Ie!==null&&(r&&Ie.alternate!==null&&ve.delete(Ie.key===null?Ce:Ie.key),M=m(Ie,M,Ce),Fe===null?pe=Ie:Fe.sibling=Ie,Fe=Ie);return r&&ve.forEach(function(LO){return a(I,LO)}),Pe&&fs(I,Ce),pe}function et(I,M,k,$){if(typeof k=="object"&&k!==null&&k.type===w&&k.key===null&&(k=k.props.children),typeof k=="object"&&k!==null){switch(k.$$typeof){case B:e:{for(var pe=k.key;M!==null;){if(M.key===pe){if(pe=k.type,pe===w){if(M.tag===7){l(I,M.sibling),$=g(M,k.props.children),$.return=I,I=$;break e}}else if(M.elementType===pe||typeof pe=="object"&&pe!==null&&pe.$$typeof===z&&_w(pe)===M.type){l(I,M.sibling),$=g(M,k.props),$o($,k),$.return=I,I=$;break e}l(I,M);break}else a(I,M);M=M.sibling}k.type===w?($=cs(k.props.children,I.mode,$,k.key),$.return=I,I=$):($=$c(k.type,k.key,k.props,null,I.mode,$),$o($,k),$.return=I,I=$)}return y(I);case v:e:{for(pe=k.key;M!==null;){if(M.key===pe)if(M.tag===4&&M.stateNode.containerInfo===k.containerInfo&&M.stateNode.implementation===k.implementation){l(I,M.sibling),$=g(M,k.children||[]),$.return=I,I=$;break e}else{l(I,M);break}else a(I,M);M=M.sibling}$=Wd(k,I.mode,$),$.return=I,I=$}return y(I);case z:return pe=k._init,k=pe(k._payload),et(I,M,k,$)}if(se(k))return _e(I,M,k,$);if(ne(k)){if(pe=ne(k),typeof pe!="function")throw Error(n(150));return k=pe.call(k),be(I,M,k,$)}if(typeof k.then=="function")return et(I,M,hu(k),$);if(k.$$typeof===E)return et(I,M,eu(I,k),$);du(I,k)}return typeof k=="string"&&k!==""||typeof k=="number"||typeof k=="bigint"?(k=""+k,M!==null&&M.tag===6?(l(I,M.sibling),$=g(M,k),$.return=I,I=$):(l(I,M),$=$d(k,I.mode,$),$.return=I,I=$),y(I)):l(I,M)}return function(I,M,k,$){try{Yo=0;var pe=et(I,M,k,$);return _a=null,pe}catch(ve){if(ve===ko||ve===Au)throw ve;var Fe=VA(29,ve,null,I.mode);return Fe.lanes=$,Fe.return=I,Fe}finally{}}}var xa=xw(!0),Qw=xw(!1),gn=j(null),Yn=null;function gr(r){var a=r.alternate;ee(Vt,Vt.current&1),ee(gn,r),Yn===null&&(a===null||wa.current!==null||a.memoizedState!==null)&&(Yn=r)}function Uw(r){if(r.tag===22){if(ee(Vt,Vt.current),ee(gn,r),Yn===null){var a=r.alternate;a!==null&&a.memoizedState!==null&&(Yn=r)}}else pr()}function pr(){ee(Vt,Vt.current),ee(gn,gn.current)}function Fi(r){Ae(gn),Yn===r&&(Yn=null),Ae(Vt)}var Vt=j(0);function gu(r){for(var a=r;a!==null;){if(a.tag===13){var l=a.memoizedState;if(l!==null&&(l=l.dehydrated,l===null||l.data==="$?"||vp(l)))return a}else if(a.tag===19&&a.memoizedProps.revealOrder!==void 0){if((a.flags&128)!==0)return a}else if(a.child!==null){a.child.return=a,a=a.child;continue}if(a===r)break;for(;a.sibling===null;){if(a.return===null||a.return===r)return null;a=a.return}a.sibling.return=a.return,a=a.sibling}return null}function Sg(r,a,l,f){a=r.memoizedState,l=l(f,a),l=l==null?a:d({},a,l),r.memoizedState=l,r.lanes===0&&(r.updateQueue.baseState=l)}var Og={enqueueSetState:function(r,a,l){r=r._reactInternals;var f=XA(),g=fr(f);g.payload=a,l!=null&&(g.callback=l),a=hr(r,g,f),a!==null&&(ZA(a,r,f),zo(a,r,f))},enqueueReplaceState:function(r,a,l){r=r._reactInternals;var f=XA(),g=fr(f);g.tag=1,g.payload=a,l!=null&&(g.callback=l),a=hr(r,g,f),a!==null&&(ZA(a,r,f),zo(a,r,f))},enqueueForceUpdate:function(r,a){r=r._reactInternals;var l=XA(),f=fr(l);f.tag=2,a!=null&&(f.callback=a),a=hr(r,f,l),a!==null&&(ZA(a,r,l),zo(a,r,l))}};function Ew(r,a,l,f,g,m,y){return r=r.stateNode,typeof r.shouldComponentUpdate=="function"?r.shouldComponentUpdate(f,m,y):a.prototype&&a.prototype.isPureReactComponent?!Ho(l,f)||!Ho(g,m):!0}function Fw(r,a,l,f){r=a.state,typeof a.componentWillReceiveProps=="function"&&a.componentWillReceiveProps(l,f),typeof a.UNSAFE_componentWillReceiveProps=="function"&&a.UNSAFE_componentWillReceiveProps(l,f),a.state!==r&&Og.enqueueReplaceState(a,a.state,null)}function vs(r,a){var l=a;if("ref"in a){l={};for(var f in a)f!=="ref"&&(l[f]=a[f])}if(r=r.defaultProps){l===a&&(l=d({},l));for(var g in r)l[g]===void 0&&(l[g]=r[g])}return l}var pu=typeof reportError=="function"?reportError:function(r){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var a=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof r=="object"&&r!==null&&typeof r.message=="string"?String(r.message):String(r),error:r});if(!window.dispatchEvent(a))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",r);return}console.error(r)};function Sw(r){pu(r)}function Ow(r){console.error(r)}function Hw(r){pu(r)}function mu(r,a){try{var l=r.onUncaughtError;l(a.value,{componentStack:a.stack})}catch(f){setTimeout(function(){throw f})}}function Tw(r,a,l){try{var f=r.onCaughtError;f(l.value,{componentStack:l.stack,errorBoundary:a.tag===1?a.stateNode:null})}catch(g){setTimeout(function(){throw g})}}function Hg(r,a,l){return l=fr(l),l.tag=3,l.payload={element:null},l.callback=function(){mu(r,a)},l}function Dw(r){return r=fr(r),r.tag=3,r}function Mw(r,a,l,f){var g=l.type.getDerivedStateFromError;if(typeof g=="function"){var m=f.value;r.payload=function(){return g(m)},r.callback=function(){Tw(a,l,f)}}var y=l.stateNode;y!==null&&typeof y.componentDidCatch=="function"&&(r.callback=function(){Tw(a,l,f),typeof g!="function"&&(yr===null?yr=new Set([this]):yr.add(this));var U=f.stack;this.componentDidCatch(f.value,{componentStack:U!==null?U:""})})}function L1(r,a,l,f,g){if(l.flags|=32768,f!==null&&typeof f=="object"&&typeof f.then=="function"){if(a=l.alternate,a!==null&&Ro(a,l,g,!0),l=gn.current,l!==null){switch(l.tag){case 13:return Yn===null?Ap():l.alternate===null&&Ut===0&&(Ut=3),l.flags&=-257,l.flags|=65536,l.lanes=g,f===ag?l.flags|=16384:(a=l.updateQueue,a===null?l.updateQueue=new Set([f]):a.add(f),ip(r,f,g)),!1;case 22:return l.flags|=65536,f===ag?l.flags|=16384:(a=l.updateQueue,a===null?(a={transitions:null,markerInstances:null,retryQueue:new Set([f])},l.updateQueue=a):(l=a.retryQueue,l===null?a.retryQueue=new Set([f]):l.add(f)),ip(r,f,g)),!1}throw Error(n(435,l.tag))}return ip(r,f,g),Ap(),!1}if(Pe)return a=gn.current,a!==null?((a.flags&65536)===0&&(a.flags|=256),a.flags|=65536,a.lanes=g,f!==eg&&(r=Error(n(422),{cause:f}),Lo(un(r,l)))):(f!==eg&&(a=Error(n(423),{cause:f}),Lo(un(a,l))),r=r.current.alternate,r.flags|=65536,g&=-g,r.lanes|=g,f=un(f,l),g=Hg(r.stateNode,f,g),cg(r,g),Ut!==4&&(Ut=2)),!1;var m=Error(n(520),{cause:f});if(m=un(m,l),nl===null?nl=[m]:nl.push(m),Ut!==4&&(Ut=2),a===null)return!0;f=un(f,l),l=a;do{switch(l.tag){case 3:return l.flags|=65536,r=g&-g,l.lanes|=r,r=Hg(l.stateNode,f,r),cg(l,r),!1;case 1:if(a=l.type,m=l.stateNode,(l.flags&128)===0&&(typeof a.getDerivedStateFromError=="function"||m!==null&&typeof m.componentDidCatch=="function"&&(yr===null||!yr.has(m))))return l.flags|=65536,g&=-g,l.lanes|=g,g=Dw(g),Mw(g,r,l,f),cg(l,g),!1}l=l.return}while(l!==null);return!1}var Lw=Error(n(461)),Yt=!1;function rA(r,a,l,f){a.child=r===null?Qw(a,null,l,f):xa(a,r.child,l,f)}function Rw(r,a,l,f,g){l=l.render;var m=a.ref;if("ref"in f){var y={};for(var U in f)U!=="ref"&&(y[U]=f[U])}else y=f;return ps(a),f=gg(r,a,l,y,m,g),U=pg(),r!==null&&!Yt?(mg(r,a,g),Si(r,a,g)):(Pe&&U&&Jd(a),a.flags|=1,rA(r,a,f,g),a.child)}function Iw(r,a,l,f,g){if(r===null){var m=l.type;return typeof m=="function"&&!Yd(m)&&m.defaultProps===void 0&&l.compare===null?(a.tag=15,a.type=m,Nw(r,a,m,f,g)):(r=$c(l.type,null,f,a,a.mode,g),r.ref=a.ref,r.return=a,a.child=r)}if(m=r.child,!kg(r,g)){var y=m.memoizedProps;if(l=l.compare,l=l!==null?l:Ho,l(y,f)&&r.ref===a.ref)return Si(r,a,g)}return a.flags|=1,r=Ci(m,f),r.ref=a.ref,r.return=a,a.child=r}function Nw(r,a,l,f,g){if(r!==null){var m=r.memoizedProps;if(Ho(m,f)&&r.ref===a.ref)if(Yt=!1,a.pendingProps=f=m,kg(r,g))(r.flags&131072)!==0&&(Yt=!0);else return a.lanes=r.lanes,Si(r,a,g)}return Tg(r,a,l,f,g)}function kw(r,a,l){var f=a.pendingProps,g=f.children,m=r!==null?r.memoizedState:null;if(f.mode==="hidden"){if((a.flags&128)!==0){if(f=m!==null?m.baseLanes|l:l,r!==null){for(g=a.child=r.child,m=0;g!==null;)m=m|g.lanes|g.childLanes,g=g.sibling;a.childLanes=m&~f}else a.childLanes=0,a.child=null;return Kw(r,a,f,l)}if((l&536870912)!==0)a.memoizedState={baseLanes:0,cachePool:null},r!==null&&tu(a,m!==null?m.cachePool:null),m!==null?Nv(a,m):fg(),Uw(a);else return a.lanes=a.childLanes=536870912,Kw(r,a,m!==null?m.baseLanes|l:l,l)}else m!==null?(tu(a,m.cachePool),Nv(a,m),pr(),a.memoizedState=null):(r!==null&&tu(a,null),fg(),pr());return rA(r,a,g,l),a.child}function Kw(r,a,l,f){var g=sg();return g=g===null?null:{parent:zt._currentValue,pool:g},a.memoizedState={baseLanes:l,cachePool:g},r!==null&&tu(a,null),fg(),Uw(a),r!==null&&Ro(r,a,f,!0),null}function Bu(r,a){var l=a.ref;if(l===null)r!==null&&r.ref!==null&&(a.flags|=4194816);else{if(typeof l!="function"&&typeof l!="object")throw Error(n(284));(r===null||r.ref!==l)&&(a.flags|=4194816)}}function Tg(r,a,l,f,g){return ps(a),l=gg(r,a,l,f,void 0,g),f=pg(),r!==null&&!Yt?(mg(r,a,g),Si(r,a,g)):(Pe&&f&&Jd(a),a.flags|=1,rA(r,a,l,g),a.child)}function zw(r,a,l,f,g,m){return ps(a),a.updateQueue=null,l=Kv(a,f,l,g),kv(r),f=pg(),r!==null&&!Yt?(mg(r,a,m),Si(r,a,m)):(Pe&&f&&Jd(a),a.flags|=1,rA(r,a,l,m),a.child)}function Vw(r,a,l,f,g){if(ps(a),a.stateNode===null){var m=ga,y=l.contextType;typeof y=="object"&&y!==null&&(m=gA(y)),m=new l(f,m),a.memoizedState=m.state!==null&&m.state!==void 0?m.state:null,m.updater=Og,a.stateNode=m,m._reactInternals=a,m=a.stateNode,m.props=f,m.state=a.memoizedState,m.refs={},og(a),y=l.contextType,m.context=typeof y=="object"&&y!==null?gA(y):ga,m.state=a.memoizedState,y=l.getDerivedStateFromProps,typeof y=="function"&&(Sg(a,l,y,f),m.state=a.memoizedState),typeof l.getDerivedStateFromProps=="function"||typeof m.getSnapshotBeforeUpdate=="function"||typeof m.UNSAFE_componentWillMount!="function"&&typeof m.componentWillMount!="function"||(y=m.state,typeof m.componentWillMount=="function"&&m.componentWillMount(),typeof m.UNSAFE_componentWillMount=="function"&&m.UNSAFE_componentWillMount(),y!==m.state&&Og.enqueueReplaceState(m,m.state,null),Po(a,f,m,g),Vo(),m.state=a.memoizedState),typeof m.componentDidMount=="function"&&(a.flags|=4194308),f=!0}else if(r===null){m=a.stateNode;var U=a.memoizedProps,H=vs(l,U);m.props=H;var K=m.context,X=l.contextType;y=ga,typeof X=="object"&&X!==null&&(y=gA(X));var W=l.getDerivedStateFromProps;X=typeof W=="function"||typeof m.getSnapshotBeforeUpdate=="function",U=a.pendingProps!==U,X||typeof m.UNSAFE_componentWillReceiveProps!="function"&&typeof m.componentWillReceiveProps!="function"||(U||K!==y)&&Fw(a,m,f,y),ur=!1;var V=a.memoizedState;m.state=V,Po(a,f,m,g),Vo(),K=a.memoizedState,U||V!==K||ur?(typeof W=="function"&&(Sg(a,l,W,f),K=a.memoizedState),(H=ur||Ew(a,l,H,f,V,K,y))?(X||typeof m.UNSAFE_componentWillMount!="function"&&typeof m.componentWillMount!="function"||(typeof m.componentWillMount=="function"&&m.componentWillMount(),typeof m.UNSAFE_componentWillMount=="function"&&m.UNSAFE_componentWillMount()),typeof m.componentDidMount=="function"&&(a.flags|=4194308)):(typeof m.componentDidMount=="function"&&(a.flags|=4194308),a.memoizedProps=f,a.memoizedState=K),m.props=f,m.state=K,m.context=y,f=H):(typeof m.componentDidMount=="function"&&(a.flags|=4194308),f=!1)}else{m=a.stateNode,lg(r,a),y=a.memoizedProps,X=vs(l,y),m.props=X,W=a.pendingProps,V=m.context,K=l.contextType,H=ga,typeof K=="object"&&K!==null&&(H=gA(K)),U=l.getDerivedStateFromProps,(K=typeof U=="function"||typeof m.getSnapshotBeforeUpdate=="function")||typeof m.UNSAFE_componentWillReceiveProps!="function"&&typeof m.componentWillReceiveProps!="function"||(y!==W||V!==H)&&Fw(a,m,f,H),ur=!1,V=a.memoizedState,m.state=V,Po(a,f,m,g),Vo();var P=a.memoizedState;y!==W||V!==P||ur||r!==null&&r.dependencies!==null&&qc(r.dependencies)?(typeof U=="function"&&(Sg(a,l,U,f),P=a.memoizedState),(X=ur||Ew(a,l,X,f,V,P,H)||r!==null&&r.dependencies!==null&&qc(r.dependencies))?(K||typeof m.UNSAFE_componentWillUpdate!="function"&&typeof m.componentWillUpdate!="function"||(typeof m.componentWillUpdate=="function"&&m.componentWillUpdate(f,P,H),typeof m.UNSAFE_componentWillUpdate=="function"&&m.UNSAFE_componentWillUpdate(f,P,H)),typeof m.componentDidUpdate=="function"&&(a.flags|=4),typeof m.getSnapshotBeforeUpdate=="function"&&(a.flags|=1024)):(typeof m.componentDidUpdate!="function"||y===r.memoizedProps&&V===r.memoizedState||(a.flags|=4),typeof m.getSnapshotBeforeUpdate!="function"||y===r.memoizedProps&&V===r.memoizedState||(a.flags|=1024),a.memoizedProps=f,a.memoizedState=P),m.props=f,m.state=P,m.context=H,f=X):(typeof m.componentDidUpdate!="function"||y===r.memoizedProps&&V===r.memoizedState||(a.flags|=4),typeof m.getSnapshotBeforeUpdate!="function"||y===r.memoizedProps&&V===r.memoizedState||(a.flags|=1024),f=!1)}return m=f,Bu(r,a),f=(a.flags&128)!==0,m||f?(m=a.stateNode,l=f&&typeof l.getDerivedStateFromError!="function"?null:m.render(),a.flags|=1,r!==null&&f?(a.child=xa(a,r.child,null,g),a.child=xa(a,null,l,g)):rA(r,a,l,g),a.memoizedState=m.state,r=a.child):r=Si(r,a,g),r}function Pw(r,a,l,f){return Mo(),a.flags|=256,rA(r,a,l,f),a.child}var Dg={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function Mg(r){return{baseLanes:r,cachePool:Ov()}}function Lg(r,a,l){return r=r!==null?r.childLanes&~l:0,a&&(r|=pn),r}function jw(r,a,l){var f=a.pendingProps,g=!1,m=(a.flags&128)!==0,y;if((y=m)||(y=r!==null&&r.memoizedState===null?!1:(Vt.current&2)!==0),y&&(g=!0,a.flags&=-129),y=(a.flags&32)!==0,a.flags&=-33,r===null){if(Pe){if(g?gr(a):pr(),Pe){var U=Qt,H;if(H=U){e:{for(H=U,U=Zn;H.nodeType!==8;){if(!U){U=null;break e}if(H=On(H.nextSibling),H===null){U=null;break e}}U=H}U!==null?(a.memoizedState={dehydrated:U,treeContext:us!==null?{id:_i,overflow:xi}:null,retryLane:536870912,hydrationErrors:null},H=VA(18,null,null,0),H.stateNode=U,H.return=a,a.child=H,UA=a,Qt=null,H=!0):H=!1}H||ds(a)}if(U=a.memoizedState,U!==null&&(U=U.dehydrated,U!==null))return vp(U)?a.lanes=32:a.lanes=536870912,null;Fi(a)}return U=f.children,f=f.fallback,g?(pr(),g=a.mode,U=vu({mode:"hidden",children:U},g),f=cs(f,g,l,null),U.return=a,f.return=a,U.sibling=f,a.child=U,g=a.child,g.memoizedState=Mg(l),g.childLanes=Lg(r,y,l),a.memoizedState=Dg,f):(gr(a),Rg(a,U))}if(H=r.memoizedState,H!==null&&(U=H.dehydrated,U!==null)){if(m)a.flags&256?(gr(a),a.flags&=-257,a=Ig(r,a,l)):a.memoizedState!==null?(pr(),a.child=r.child,a.flags|=128,a=null):(pr(),g=f.fallback,U=a.mode,f=vu({mode:"visible",children:f.children},U),g=cs(g,U,l,null),g.flags|=2,f.return=a,g.return=a,f.sibling=g,a.child=f,xa(a,r.child,null,l),f=a.child,f.memoizedState=Mg(l),f.childLanes=Lg(r,y,l),a.memoizedState=Dg,a=g);else if(gr(a),vp(U)){if(y=U.nextSibling&&U.nextSibling.dataset,y)var K=y.dgst;y=K,f=Error(n(419)),f.stack="",f.digest=y,Lo({value:f,source:null,stack:null}),a=Ig(r,a,l)}else if(Yt||Ro(r,a,l,!1),y=(l&r.childLanes)!==0,Yt||y){if(y=ot,y!==null&&(f=l&-l,f=(f&42)!==0?1:fA(f),f=(f&(y.suspendedLanes|l))!==0?0:f,f!==0&&f!==H.retryLane))throw H.retryLane=f,da(r,f),ZA(y,r,f),Lw;U.data==="$?"||Ap(),a=Ig(r,a,l)}else U.data==="$?"?(a.flags|=192,a.child=r.child,a=null):(r=H.treeContext,Qt=On(U.nextSibling),UA=a,Pe=!0,hs=null,Zn=!1,r!==null&&(hn[dn++]=_i,hn[dn++]=xi,hn[dn++]=us,_i=r.id,xi=r.overflow,us=a),a=Rg(a,f.children),a.flags|=4096);return a}return g?(pr(),g=f.fallback,U=a.mode,H=r.child,K=H.sibling,f=Ci(H,{mode:"hidden",children:f.children}),f.subtreeFlags=H.subtreeFlags&65011712,K!==null?g=Ci(K,g):(g=cs(g,U,l,null),g.flags|=2),g.return=a,f.return=a,f.sibling=g,a.child=f,f=g,g=a.child,U=r.child.memoizedState,U===null?U=Mg(l):(H=U.cachePool,H!==null?(K=zt._currentValue,H=H.parent!==K?{parent:K,pool:K}:H):H=Ov(),U={baseLanes:U.baseLanes|l,cachePool:H}),g.memoizedState=U,g.childLanes=Lg(r,y,l),a.memoizedState=Dg,f):(gr(a),l=r.child,r=l.sibling,l=Ci(l,{mode:"visible",children:f.children}),l.return=a,l.sibling=null,r!==null&&(y=a.deletions,y===null?(a.deletions=[r],a.flags|=16):y.push(r)),a.child=l,a.memoizedState=null,l)}function Rg(r,a){return a=vu({mode:"visible",children:a},r.mode),a.return=r,r.child=a}function vu(r,a){return r=VA(22,r,null,a),r.lanes=0,r.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null},r}function Ig(r,a,l){return xa(a,r.child,null,l),r=Rg(a,a.pendingProps.children),r.flags|=2,a.memoizedState=null,r}function Gw(r,a,l){r.lanes|=a;var f=r.alternate;f!==null&&(f.lanes|=a),Ag(r.return,a,l)}function Ng(r,a,l,f,g){var m=r.memoizedState;m===null?r.memoizedState={isBackwards:a,rendering:null,renderingStartTime:0,last:f,tail:l,tailMode:g}:(m.isBackwards=a,m.rendering=null,m.renderingStartTime=0,m.last=f,m.tail=l,m.tailMode=g)}function Xw(r,a,l){var f=a.pendingProps,g=f.revealOrder,m=f.tail;if(rA(r,a,f.children,l),f=Vt.current,(f&2)!==0)f=f&1|2,a.flags|=128;else{if(r!==null&&(r.flags&128)!==0)e:for(r=a.child;r!==null;){if(r.tag===13)r.memoizedState!==null&&Gw(r,l,a);else if(r.tag===19)Gw(r,l,a);else if(r.child!==null){r.child.return=r,r=r.child;continue}if(r===a)break e;for(;r.sibling===null;){if(r.return===null||r.return===a)break e;r=r.return}r.sibling.return=r.return,r=r.sibling}f&=1}switch(ee(Vt,f),g){case"forwards":for(l=a.child,g=null;l!==null;)r=l.alternate,r!==null&&gu(r)===null&&(g=l),l=l.sibling;l=g,l===null?(g=a.child,a.child=null):(g=l.sibling,l.sibling=null),Ng(a,!1,g,l,m);break;case"backwards":for(l=null,g=a.child,a.child=null;g!==null;){if(r=g.alternate,r!==null&&gu(r)===null){a.child=g;break}r=g.sibling,g.sibling=l,l=g,g=r}Ng(a,!0,l,null,m);break;case"together":Ng(a,!1,null,null,void 0);break;default:a.memoizedState=null}return a.child}function Si(r,a,l){if(r!==null&&(a.dependencies=r.dependencies),br|=a.lanes,(l&a.childLanes)===0)if(r!==null){if(Ro(r,a,l,!1),(l&a.childLanes)===0)return null}else return null;if(r!==null&&a.child!==r.child)throw Error(n(153));if(a.child!==null){for(r=a.child,l=Ci(r,r.pendingProps),a.child=l,l.return=a;r.sibling!==null;)r=r.sibling,l=l.sibling=Ci(r,r.pendingProps),l.return=a;l.sibling=null}return a.child}function kg(r,a){return(r.lanes&a)!==0?!0:(r=r.dependencies,!!(r!==null&&qc(r)))}function R1(r,a,l){switch(a.tag){case 3:Ke(a,a.stateNode.containerInfo),cr(a,zt,r.memoizedState.cache),Mo();break;case 27:case 5:An(a);break;case 4:Ke(a,a.stateNode.containerInfo);break;case 10:cr(a,a.type,a.memoizedProps.value);break;case 13:var f=a.memoizedState;if(f!==null)return f.dehydrated!==null?(gr(a),a.flags|=128,null):(l&a.child.childLanes)!==0?jw(r,a,l):(gr(a),r=Si(r,a,l),r!==null?r.sibling:null);gr(a);break;case 19:var g=(r.flags&128)!==0;if(f=(l&a.childLanes)!==0,f||(Ro(r,a,l,!1),f=(l&a.childLanes)!==0),g){if(f)return Xw(r,a,l);a.flags|=128}if(g=a.memoizedState,g!==null&&(g.rendering=null,g.tail=null,g.lastEffect=null),ee(Vt,Vt.current),f)break;return null;case 22:case 23:return a.lanes=0,kw(r,a,l);case 24:cr(a,zt,r.memoizedState.cache)}return Si(r,a,l)}function Zw(r,a,l){if(r!==null)if(r.memoizedProps!==a.pendingProps)Yt=!0;else{if(!kg(r,l)&&(a.flags&128)===0)return Yt=!1,R1(r,a,l);Yt=(r.flags&131072)!==0}else Yt=!1,Pe&&(a.flags&1048576)!==0&&_v(a,Jc,a.index);switch(a.lanes=0,a.tag){case 16:e:{r=a.pendingProps;var f=a.elementType,g=f._init;if(f=g(f._payload),a.type=f,typeof f=="function")Yd(f)?(r=vs(f,r),a.tag=1,a=Vw(null,a,f,r,l)):(a.tag=0,a=Tg(null,a,f,r,l));else{if(f!=null){if(g=f.$$typeof,g===O){a.tag=11,a=Rw(null,a,f,r,l);break e}else if(g===R){a.tag=14,a=Iw(null,a,f,r,l);break e}}throw a=he(f)||f,Error(n(306,a,""))}}return a;case 0:return Tg(r,a,a.type,a.pendingProps,l);case 1:return f=a.type,g=vs(f,a.pendingProps),Vw(r,a,f,g,l);case 3:e:{if(Ke(a,a.stateNode.containerInfo),r===null)throw Error(n(387));f=a.pendingProps;var m=a.memoizedState;g=m.element,lg(r,a),Po(a,f,null,l);var y=a.memoizedState;if(f=y.cache,cr(a,zt,f),f!==m.cache&&ng(a,[zt],l,!0),Vo(),f=y.element,m.isDehydrated)if(m={element:f,isDehydrated:!1,cache:y.cache},a.updateQueue.baseState=m,a.memoizedState=m,a.flags&256){a=Pw(r,a,f,l);break e}else if(f!==g){g=un(Error(n(424)),a),Lo(g),a=Pw(r,a,f,l);break e}else{switch(r=a.stateNode.containerInfo,r.nodeType){case 9:r=r.body;break;default:r=r.nodeName==="HTML"?r.ownerDocument.body:r}for(Qt=On(r.firstChild),UA=a,Pe=!0,hs=null,Zn=!0,l=Qw(a,null,f,l),a.child=l;l;)l.flags=l.flags&-3|4096,l=l.sibling}else{if(Mo(),f===g){a=Si(r,a,l);break e}rA(r,a,f,l)}a=a.child}return a;case 26:return Bu(r,a),r===null?(l=Jb(a.type,null,a.pendingProps,null))?a.memoizedState=l:Pe||(l=a.type,r=a.pendingProps,f=Tu(le.current).createElement(l),f[ie]=a,f[me]=r,aA(f,l,r),Dt(f),a.stateNode=f):a.memoizedState=Jb(a.type,r.memoizedProps,a.pendingProps,r.memoizedState),null;case 27:return An(a),r===null&&Pe&&(f=a.stateNode=Yb(a.type,a.pendingProps,le.current),UA=a,Zn=!0,g=Qt,xr(a.type)?(wp=g,Qt=On(f.firstChild)):Qt=g),rA(r,a,a.pendingProps.children,l),Bu(r,a),r===null&&(a.flags|=4194304),a.child;case 5:return r===null&&Pe&&((g=f=Qt)&&(f=uO(f,a.type,a.pendingProps,Zn),f!==null?(a.stateNode=f,UA=a,Qt=On(f.firstChild),Zn=!1,g=!0):g=!1),g||ds(a)),An(a),g=a.type,m=a.pendingProps,y=r!==null?r.memoizedProps:null,f=m.children,pp(g,m)?f=null:y!==null&&pp(g,y)&&(a.flags|=32),a.memoizedState!==null&&(g=gg(r,a,F1,null,null,l),fl._currentValue=g),Bu(r,a),rA(r,a,f,l),a.child;case 6:return r===null&&Pe&&((r=l=Qt)&&(l=fO(l,a.pendingProps,Zn),l!==null?(a.stateNode=l,UA=a,Qt=null,r=!0):r=!1),r||ds(a)),null;case 13:return jw(r,a,l);case 4:return Ke(a,a.stateNode.containerInfo),f=a.pendingProps,r===null?a.child=xa(a,null,f,l):rA(r,a,f,l),a.child;case 11:return Rw(r,a,a.type,a.pendingProps,l);case 7:return rA(r,a,a.pendingProps,l),a.child;case 8:return rA(r,a,a.pendingProps.children,l),a.child;case 12:return rA(r,a,a.pendingProps.children,l),a.child;case 10:return f=a.pendingProps,cr(a,a.type,f.value),rA(r,a,f.children,l),a.child;case 9:return g=a.type._context,f=a.pendingProps.children,ps(a),g=gA(g),f=f(g),a.flags|=1,rA(r,a,f,l),a.child;case 14:return Iw(r,a,a.type,a.pendingProps,l);case 15:return Nw(r,a,a.type,a.pendingProps,l);case 19:return Xw(r,a,l);case 31:return f=a.pendingProps,l=a.mode,f={mode:f.mode,children:f.children},r===null?(l=vu(f,l),l.ref=a.ref,a.child=l,l.return=a,a=l):(l=Ci(r.child,f),l.ref=a.ref,a.child=l,l.return=a,a=l),a;case 22:return kw(r,a,l);case 24:return ps(a),f=gA(zt),r===null?(g=sg(),g===null&&(g=ot,m=ig(),g.pooledCache=m,m.refCount++,m!==null&&(g.pooledCacheLanes|=l),g=m),a.memoizedState={parent:f,cache:g},og(a),cr(a,zt,g)):((r.lanes&l)!==0&&(lg(r,a),Po(a,null,null,l),Vo()),g=r.memoizedState,m=a.memoizedState,g.parent!==f?(g={parent:f,cache:f},a.memoizedState=g,a.lanes===0&&(a.memoizedState=a.updateQueue.baseState=g),cr(a,zt,f)):(f=m.cache,cr(a,zt,f),f!==g.cache&&ng(a,[zt],l,!0))),rA(r,a,a.pendingProps.children,l),a.child;case 29:throw a.pendingProps}throw Error(n(156,a.tag))}function Oi(r){r.flags|=4}function Yw(r,a){if(a.type!=="stylesheet"||(a.state.loading&4)!==0)r.flags&=-16777217;else if(r.flags|=16777216,!ny(a)){if(a=gn.current,a!==null&&((Le&4194048)===Le?Yn!==null:(Le&62914560)!==Le&&(Le&536870912)===0||a!==Yn))throw Ko=ag,Hv;r.flags|=8192}}function wu(r,a){a!==null&&(r.flags|=4),r.flags&16384&&(a=r.tag!==22?vi():536870912,r.lanes|=a,Fa|=a)}function Wo(r,a){if(!Pe)switch(r.tailMode){case"hidden":a=r.tail;for(var l=null;a!==null;)a.alternate!==null&&(l=a),a=a.sibling;l===null?r.tail=null:l.sibling=null;break;case"collapsed":l=r.tail;for(var f=null;l!==null;)l.alternate!==null&&(f=l),l=l.sibling;f===null?a||r.tail===null?r.tail=null:r.tail.sibling=null:f.sibling=null}}function Ct(r){var a=r.alternate!==null&&r.alternate.child===r.child,l=0,f=0;if(a)for(var g=r.child;g!==null;)l|=g.lanes|g.childLanes,f|=g.subtreeFlags&65011712,f|=g.flags&65011712,g.return=r,g=g.sibling;else for(g=r.child;g!==null;)l|=g.lanes|g.childLanes,f|=g.subtreeFlags,f|=g.flags,g.return=r,g=g.sibling;return r.subtreeFlags|=f,r.childLanes=l,a}function I1(r,a,l){var f=a.pendingProps;switch(qd(a),a.tag){case 31:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Ct(a),null;case 1:return Ct(a),null;case 3:return l=a.stateNode,f=null,r!==null&&(f=r.memoizedState.cache),a.memoizedState.cache!==f&&(a.flags|=2048),Ui(zt),$e(),l.pendingContext&&(l.context=l.pendingContext,l.pendingContext=null),(r===null||r.child===null)&&(Do(a)?Oi(a):r===null||r.memoizedState.isDehydrated&&(a.flags&256)===0||(a.flags|=1024,Uv())),Ct(a),null;case 26:return l=a.memoizedState,r===null?(Oi(a),l!==null?(Ct(a),Yw(a,l)):(Ct(a),a.flags&=-16777217)):l?l!==r.memoizedState?(Oi(a),Ct(a),Yw(a,l)):(Ct(a),a.flags&=-16777217):(r.memoizedProps!==f&&Oi(a),Ct(a),a.flags&=-16777217),null;case 27:Xt(a),l=le.current;var g=a.type;if(r!==null&&a.stateNode!=null)r.memoizedProps!==f&&Oi(a);else{if(!f){if(a.stateNode===null)throw Error(n(166));return Ct(a),null}r=Y.current,Do(a)?xv(a):(r=Yb(g,f,l),a.stateNode=r,Oi(a))}return Ct(a),null;case 5:if(Xt(a),l=a.type,r!==null&&a.stateNode!=null)r.memoizedProps!==f&&Oi(a);else{if(!f){if(a.stateNode===null)throw Error(n(166));return Ct(a),null}if(r=Y.current,Do(a))xv(a);else{switch(g=Tu(le.current),r){case 1:r=g.createElementNS("http://www.w3.org/2000/svg",l);break;case 2:r=g.createElementNS("http://www.w3.org/1998/Math/MathML",l);break;default:switch(l){case"svg":r=g.createElementNS("http://www.w3.org/2000/svg",l);break;case"math":r=g.createElementNS("http://www.w3.org/1998/Math/MathML",l);break;case"script":r=g.createElement("div"),r.innerHTML=" - + +
diff --git a/vite-app/src/components/EvaluationRow.tsx b/vite-app/src/components/EvaluationRow.tsx index d537279a..87e89f86 100644 --- a/vite-app/src/components/EvaluationRow.tsx +++ b/vite-app/src/components/EvaluationRow.tsx @@ -372,7 +372,7 @@ const ExpandedContent = observer( {/* Middle Column - Logs */} - + {/* Right Column - Metadata */}
diff --git a/vite-app/src/components/LogsSection.tsx b/vite-app/src/components/LogsSection.tsx index ae6881e1..68d07a78 100644 --- a/vite-app/src/components/LogsSection.tsx +++ b/vite-app/src/components/LogsSection.tsx @@ -4,6 +4,7 @@ import { LogsResponseSchema, type LogEntry, type LogsResponse, + type InputMetadata, } from "../types/eval-protocol"; import { getApiUrl } from "../config"; import Select from "./Select"; @@ -15,9 +16,10 @@ const haveLogsChanged = (prevLogs: LogEntry[], nextLogs: LogEntry[]) => { interface LogsSectionProps { rolloutId?: string; + inputMetadata?: InputMetadata; } -export const LogsSection = observer(({ rolloutId }: LogsSectionProps) => { +export const LogsSection = observer(({ rolloutId, inputMetadata }: LogsSectionProps) => { const [logs, setLogs] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); @@ -214,7 +216,24 @@ export const LogsSection = observer(({ rolloutId }: LogsSectionProps) => { )} {logs.length === 0 && !loading && !error && ( -
No logs found
+
+ {(() => { + const githubUrl = inputMetadata?.session_data?.github_actions_run_url; + if (githubUrl) { + return ( + + View GitHub Actions run + + ); + } + return "No logs found"; + })()} +
)} {logs.length > 0 && (