diff --git a/eval_protocol/__init__.py b/eval_protocol/__init__.py index ebd4ab41..33c48e95 100644 --- a/eval_protocol/__init__.py +++ b/eval_protocol/__init__.py @@ -32,6 +32,8 @@ from .quickstart import aha_judge, multi_turn_assistant_to_ground_truth, assistant_to_ground_truth from .pytest import evaluation_test, SingleTurnRolloutProcessor, RemoteRolloutProcessor from .pytest.parameterize import DefaultParameterIdGenerator +from .log_utils.elasticsearch_direct_http_handler import ElasticsearchDirectHttpHandler +from .log_utils.rollout_id_filter import RolloutIdFilter from .types.remote_rollout_processor import ( InitRequest, @@ -63,6 +65,8 @@ warnings.filterwarnings("default", category=DeprecationWarning, module="eval_protocol") __all__ = [ + "ElasticsearchDirectHttpHandler", + "RolloutIdFilter", "Status", "RemoteRolloutProcessor", "InputMetadata", diff --git a/eval_protocol/log_utils/__init__.py b/eval_protocol/log_utils/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/eval_protocol/logging/elasticsearch_client.py b/eval_protocol/log_utils/elasticsearch_client.py similarity index 84% rename from eval_protocol/logging/elasticsearch_client.py rename to eval_protocol/log_utils/elasticsearch_client.py index b7ca7f0e..a59269ea 100644 --- a/eval_protocol/logging/elasticsearch_client.py +++ b/eval_protocol/log_utils/elasticsearch_client.py @@ -6,10 +6,9 @@ and search functionality. """ -import json import requests from typing import Any, Dict, List, Optional, Union -from urllib.parse import urlparse +from eval_protocol.models import Status from eval_protocol.types.remote_rollout_processor import ElasticsearchConfig @@ -203,33 +202,39 @@ def search( except Exception: return None - def search_by_term(self, field: str, value: Any, size: int = 10) -> Optional[Dict[str, Any]]: + def search_by_term( + self, field: str, value: Any, size: int = 10, sort: Optional[List[Dict[str, Any]]] = None + ) -> Optional[Dict[str, Any]]: """Search documents by exact term match. Args: field: Field name to search value: Value to match size: Number of results to return + sort: Sort specification Returns: Dict containing search results, or None if failed """ query = {"term": {field: value}} - return self.search(query, size=size) + return self.search(query, size=size, sort=sort) - def search_by_match(self, field: str, value: str, size: int = 10) -> Optional[Dict[str, Any]]: + def search_by_match( + self, field: str, value: str, size: int = 10, sort: Optional[List[Dict[str, Any]]] = None + ) -> Optional[Dict[str, Any]]: """Search documents by text match. Args: field: Field name to search value: Text to match size: Number of results to return + sort: Sort specification (e.g., [{"@timestamp": {"order": "desc"}}]) Returns: Dict containing search results, or None if failed """ query = {"match": {field: value}} - return self.search(query, size=size) + return self.search(query, size=size, sort=sort) def search_by_match_phrase_prefix(self, field: str, value: str, size: int = 10) -> Optional[Dict[str, Any]]: """Search documents by phrase prefix match. @@ -257,6 +262,34 @@ def search_all(self, size: int = 10) -> Optional[Dict[str, Any]]: query = {"match_all": {}} return self.search(query, size=size) + def search_by_status_code_not_in( + self, + rollout_id: str, + excluded_codes: list[Status.Code], + size: int = 10, + ) -> Optional[Dict[str, Any]]: + """ + Search documents where status_code does NOT match any of the provided status codes. + + Args: + excluded_codes: List of status codes to exclude (i.e., find logs NOT having these codes) + size: Number of results to return + rollout_id: Optional rollout ID to filter by + + Returns: + Dict containing search results, or None if failed + """ + # Build the query with must_not for status code exclusion + bool_query: dict[str, list[dict[str, Any]]] = { + "must_not": [{"terms": {"status_code": [code.value for code in excluded_codes]}}] + } + + # Add rollout_id filter and ensure status_code exists + bool_query["must"] = [{"term": {"rollout_id": rollout_id}}, {"exists": {"field": "status_code"}}] + + query = {"bool": bool_query} + return self.search(query, size=size) + # Health and Status Operations def health_check(self) -> bool: diff --git a/eval_protocol/logging/elasticsearch_direct_http_handler.py b/eval_protocol/log_utils/elasticsearch_direct_http_handler.py similarity index 80% rename from eval_protocol/logging/elasticsearch_direct_http_handler.py rename to eval_protocol/log_utils/elasticsearch_direct_http_handler.py index 8b729dfa..cd1a3765 100644 --- a/eval_protocol/logging/elasticsearch_direct_http_handler.py +++ b/eval_protocol/log_utils/elasticsearch_direct_http_handler.py @@ -1,28 +1,38 @@ -import json import logging -import asyncio import os -import threading from concurrent.futures import ThreadPoolExecutor -from typing import Optional, Tuple, Any, Dict +from typing import Optional, Any, Dict from datetime import datetime from eval_protocol.types.remote_rollout_processor import ElasticsearchConfig from .elasticsearch_client import ElasticsearchClient +import logging + +logger = logging.getLogger(__name__) + +# do not inherit root logger since we are a handler ourselves +logger.propagate = False + +logger.addHandler(logging.StreamHandler()) + +if os.environ.get("EP_DEBUG") == "true": + logger.setLevel(logging.DEBUG) + logger.debug("EP_DEBUG=true detected, set log level to DEBUG") + class ElasticsearchDirectHttpHandler(logging.Handler): - def __init__(self, elasticsearch_config: ElasticsearchConfig) -> None: + def __init__(self, elasticsearch_config: ElasticsearchConfig | None = None) -> None: super().__init__() - self.config = ElasticsearchConfig( - url=elasticsearch_config.url, - api_key=elasticsearch_config.api_key, - index_name=elasticsearch_config.index_name, - ) - self.client = ElasticsearchClient(self.config) + self.config = elasticsearch_config + self.client = ElasticsearchClient(self.config) if self.config else None self.formatter: logging.Formatter = logging.Formatter() self._executor = None + def configure(self, elasticsearch_config: ElasticsearchConfig) -> None: + self.config = elasticsearch_config + self.client = ElasticsearchClient(self.config) + def emit(self, record: logging.LogRecord) -> None: """Emit a log record by scheduling it for async transmission.""" try: @@ -30,6 +40,12 @@ def emit(self, record: logging.LogRecord) -> None: timestamp = datetime.fromtimestamp(record.created).strftime("%Y-%m-%dT%H:%M:%S.%fZ") rollout_id = self._get_rollout_id(record) + logger.debug(f"Emitting log record: {record.getMessage()} with rollout_id: {rollout_id}") + if not rollout_id: + logger.debug( + "No rollout_id provided in extra data for ElasticsearchDirectHttpHandler through EP_ROLLOUT_ID environment variable or rollout_id extra data. Skipping log record." + ) + return status_info = self._get_status_info(record) data: Dict[str, Any] = { @@ -50,7 +66,7 @@ def emit(self, record: logging.LogRecord) -> None: self.handleError(record) print(f"Error preparing log for Elasticsearch: {e}") - def _get_rollout_id(self, record: logging.LogRecord) -> str: + def _get_rollout_id(self, record: logging.LogRecord) -> str | None: """Get the rollout ID from record extra data or environment variables.""" # Check if rollout_id is provided in the extra data first if hasattr(record, "rollout_id") and record.rollout_id is not None: # type: ignore @@ -58,10 +74,6 @@ def _get_rollout_id(self, record: logging.LogRecord) -> str: # Fall back to environment variable rollout_id = os.getenv("EP_ROLLOUT_ID") - if rollout_id is None: - raise ValueError( - "EP_ROLLOUT_ID environment variable is not set and no rollout_id provided in extra data for ElasticsearchDirectHttpHandler" - ) return rollout_id def _get_status_info(self, record: logging.LogRecord) -> Optional[Dict[str, Any]]: @@ -105,6 +117,9 @@ def _schedule_async_send(self, data: Dict[str, Any], record: logging.LogRecord) def _send_to_elasticsearch(self, data: Dict[str, Any], record: logging.LogRecord) -> None: """Send data to Elasticsearch (runs in thread pool).""" + if not self.client: + logger.warning("No Elasticsearch client configured, skipping log record") + return try: success = self.client.index_document(data) if not success: diff --git a/eval_protocol/logging/elasticsearch_index_manager.py b/eval_protocol/log_utils/elasticsearch_index_manager.py similarity index 100% rename from eval_protocol/logging/elasticsearch_index_manager.py rename to eval_protocol/log_utils/elasticsearch_index_manager.py diff --git a/eval_protocol/log_utils/rollout_id_filter.py b/eval_protocol/log_utils/rollout_id_filter.py new file mode 100644 index 00000000..eea49a18 --- /dev/null +++ b/eval_protocol/log_utils/rollout_id_filter.py @@ -0,0 +1,28 @@ +import logging +import os + +logger = logging.getLogger(__name__) + +# do not inherit root logger since we are a handler ourselves +logger.propagate = False + +logger.addHandler(logging.StreamHandler()) + +if os.environ.get("EP_DEBUG") == "true": + logger.setLevel(logging.DEBUG) + logger.debug("EP_DEBUG=true detected, set log level to DEBUG") + + +class RolloutIdFilter(logging.Filter): + """ + A filter that simply adds the rollout_id to the record so that you don't + have to pass it as extra data every time you log. + """ + + def __init__(self, rollout_id: str): + self.rollout_id = rollout_id + + def filter(self, record): + logger.debug(f"Filtering record with rollout_id: {self.rollout_id}") + record.rollout_id = self.rollout_id + return True diff --git a/eval_protocol/pytest/elasticsearch_setup.py b/eval_protocol/pytest/elasticsearch_setup.py index 56ac1ded..18574473 100644 --- a/eval_protocol/pytest/elasticsearch_setup.py +++ b/eval_protocol/pytest/elasticsearch_setup.py @@ -7,7 +7,7 @@ from dotenv import load_dotenv from eval_protocol.directory_utils import find_eval_protocol_dir from eval_protocol.types.remote_rollout_processor import ElasticsearchConfig -from eval_protocol.logging.elasticsearch_index_manager import ElasticsearchIndexManager +from eval_protocol.log_utils.elasticsearch_index_manager import ElasticsearchIndexManager logger = logging.getLogger(__name__) diff --git a/eval_protocol/pytest/remote_rollout_processor.py b/eval_protocol/pytest/remote_rollout_processor.py index 09110a90..1c96affa 100644 --- a/eval_protocol/pytest/remote_rollout_processor.py +++ b/eval_protocol/pytest/remote_rollout_processor.py @@ -4,7 +4,7 @@ import requests -from eval_protocol.logging.elasticsearch_client import ElasticsearchClient +from eval_protocol.log_utils.elasticsearch_client import ElasticsearchClient 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 ElasticsearchConfig, InitRequest, RolloutMetadata @@ -188,27 +188,50 @@ def _get_status() -> Dict[str, Any]: ElasticsearchClient(self._elastic_search_config) if self._elastic_search_config else None ) + continue_polling_status = True while time.time() < deadline: try: - status = await asyncio.to_thread(_get_status) - terminated = bool(status.get("terminated", False)) - if terminated: - break + if continue_polling_status: + status = await asyncio.to_thread(_get_status) + terminated = bool(status.get("terminated", False)) + if terminated: + break except requests.exceptions.HTTPError as e: if e.response is not None and e.response.status_code == 404: # 404 means server doesn't implement /status endpoint, stop polling logger.info( f"Server doesn't implement /status endpoint (404), stopping status polling for rollout {row.execution_metadata.rollout_id}" ) - break + continue_polling_status = False else: raise except Exception: # For all other exceptions, raise them raise + if not elasticsearch_client: + continue + + search_results = elasticsearch_client.search_by_status_code_not_in( + row.execution_metadata.rollout_id, [Status.Code.RUNNING] + ) + hits = search_results["hits"]["hits"] if search_results else [] + + if hits: + # log all statuses found + for hit in hits: + document = hit["_source"] + logger.info( + f"Found log for rollout {row.execution_metadata.rollout_id} with status code {document['status_code']}" + ) + logger.info("Stopping status polling for rollout %s", row.execution_metadata.rollout_id) + break + await asyncio.sleep(poll_interval) else: + logger.info( + f"Loop completed without breaking for {row.execution_metadata.rollout_id}, which means we timed out" + ) # Loop completed without breaking, which means we timed out row.rollout_status = Status.rollout_error( f"Rollout {row.execution_metadata.rollout_id} timed out after {timeout_seconds} seconds" @@ -234,23 +257,20 @@ def _load_data(): return row elif len(output_rows) == 1: # Return the Langfuse row langfuse_row = output_rows[0] - langfuse_row.input_metadata.completion_params = row.input_metadata.completion_params - # merge dataset_info dicts on input_metadata - if langfuse_row.input_metadata.dataset_info and row.input_metadata.dataset_info: - langfuse_row.input_metadata.dataset_info = { - **row.input_metadata.dataset_info, - **langfuse_row.input_metadata.dataset_info, - } - elif row.input_metadata.dataset_info: - langfuse_row.input_metadata.dataset_info = row.input_metadata.dataset_info - langfuse_row.eval_metadata = row.eval_metadata - langfuse_row.ground_truth = row.ground_truth - # this is useful to detect stopped evaluations so we can update - # the status in the logs server - langfuse_row.pid = row.pid + # if the langfuse_row has the same number of messages as the original row, + # something went wrong + if len(langfuse_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 - return langfuse_row + row.messages = langfuse_row.messages + row.tools = langfuse_row.tools + row.input_metadata.session_data = langfuse_row.input_metadata.session_data + row.execution_metadata = langfuse_row.execution_metadata + return row else: raise ValueError("RemoteRolloutProcessor's output_data_loader should return exactly one row.") diff --git a/eval_protocol/utils/logs_server.py b/eval_protocol/utils/logs_server.py index f5358fbe..078a26ad 100644 --- a/eval_protocol/utils/logs_server.py +++ b/eval_protocol/utils/logs_server.py @@ -4,6 +4,7 @@ import os import threading import time +from datetime import datetime from contextlib import asynccontextmanager from queue import Queue from typing import TYPE_CHECKING, Any, Dict, List, Optional @@ -17,8 +18,9 @@ from eval_protocol.dataset_logger.dataset_logger import LOG_EVENT_TYPE from eval_protocol.event_bus import event_bus from eval_protocol.models import Status +from eval_protocol.pytest.elasticsearch_setup import ElasticsearchSetup from eval_protocol.utils.vite_server import ViteServer -from eval_protocol.logging.elasticsearch_client import ElasticsearchClient +from eval_protocol.log_utils.elasticsearch_client import ElasticsearchClient from eval_protocol.types.remote_rollout_processor import ElasticsearchConfig from eval_protocol.utils.logs_models import LogEntry, LogsResponse @@ -351,8 +353,19 @@ async def get_logs( raise HTTPException(status_code=503, detail="Elasticsearch is not configured for this logs server") try: - # Search for logs by rollout_id - search_results = self.elasticsearch_client.search_by_match("rollout_id", rollout_id, size=limit) + # Search for logs by rollout_id using a term filter (exact match), + # sorted by timestamp desc with a secondary deterministic tie-breaker on _id desc + sort_spec = [ + {"@timestamp": {"order": "asc"}}, + ] + query = { + "bool": { + "must": [ + {"term": {"rollout_id": rollout_id}}, + ] + } + } + search_results = self.elasticsearch_client.search(query, size=limit, sort=sort_spec) if not search_results or "hits" not in search_results: # Return empty response using Pydantic model @@ -382,9 +395,6 @@ async def get_logs( logger.warning(f"Failed to parse log entry: {e}, data: {log_data}") continue - # Sort by timestamp (most recent first) - log_entries.sort(key=lambda x: x.timestamp, reverse=True) - # Get total count total_hits = search_results["hits"]["total"] if isinstance(total_hits, dict): @@ -512,10 +522,14 @@ def serve_logs(port: Optional[int] = None, elasticsearch_config: Optional[Elasti args = parser.parse_args() + elasticsearch_config = ElasticsearchSetup().setup_elasticsearch() + # Create server with command line arguments if args.build_dir: - server = LogsServer(host=args.host, port=args.port, build_dir=args.build_dir) + server = LogsServer( + host=args.host, port=args.port, build_dir=args.build_dir, elasticsearch_config=elasticsearch_config + ) else: - server = LogsServer(host=args.host, port=args.port) + server = LogsServer(host=args.host, port=args.port, elasticsearch_config=elasticsearch_config) server.run() diff --git a/tests/logging/test_elasticsearch_direct_http_handler.py b/tests/logging/test_elasticsearch_direct_http_handler.py index 906d5486..428f2dda 100644 --- a/tests/logging/test_elasticsearch_direct_http_handler.py +++ b/tests/logging/test_elasticsearch_direct_http_handler.py @@ -3,8 +3,8 @@ import time import pytest -from eval_protocol.logging.elasticsearch_direct_http_handler import ElasticsearchDirectHttpHandler -from eval_protocol.logging.elasticsearch_client import ElasticsearchClient +from eval_protocol.log_utils.elasticsearch_direct_http_handler import ElasticsearchDirectHttpHandler +from eval_protocol.log_utils.elasticsearch_client import ElasticsearchClient from eval_protocol.pytest.elasticsearch_setup import ElasticsearchSetup from eval_protocol.types.remote_rollout_processor import ElasticsearchConfig diff --git a/tests/remote_server/remote_server.py b/tests/remote_server/remote_server.py index cbe4d04a..8f07a474 100644 --- a/tests/remote_server/remote_server.py +++ b/tests/remote_server/remote_server.py @@ -1,27 +1,30 @@ import os +import random import threading -from typing import Any, Dict import uvicorn -from fastapi import FastAPI, HTTPException +from fastapi import FastAPI from openai import OpenAI +import logging -from eval_protocol.types.remote_rollout_processor import ( - InitRequest, - StatusResponse, -) +from eval_protocol import Status, InitRequest, ElasticsearchDirectHttpHandler, RolloutIdFilter app = FastAPI() - -_STATE: Dict[str, Dict[str, Any]] = {} +# attach handler to root logger +handler = ElasticsearchDirectHttpHandler() +logging.getLogger().addHandler(handler) @app.post("/init") def init(req: InitRequest): - # Persist state - _STATE[req.metadata.rollout_id] = {"terminated": False} + if req.elastic_search_config: + handler.configure(req.elastic_search_config) + + # attach rollout_id filter to logger + logger = logging.getLogger(f"{__name__}.{req.metadata.rollout_id}") + logger.addFilter(RolloutIdFilter(req.metadata.rollout_id)) # Kick off worker thread that does a single-turn chat via Langfuse OpenAI integration def _worker(): @@ -39,27 +42,24 @@ def _worker(): client = OpenAI(base_url=req.model_base_url, api_key=os.environ.get("FIREWORKS_API_KEY")) + logger.info(f"Sending completion request to model {req.model}") completion = client.chat.completions.create(**completion_kwargs) + logger.info(f"Completed response: {completion}") except Exception as e: # Best-effort; mark as done even on error to unblock polling print(f"❌ Error in rollout {req.metadata.rollout_id}: {e}") pass finally: - _STATE[req.metadata.rollout_id]["terminated"] = True + logger.info( + f"Rollout {req.metadata.rollout_id} completed", + extra={"status": Status.rollout_finished()}, + ) t = threading.Thread(target=_worker, daemon=True) t.start() -@app.get("/status", response_model=StatusResponse) -def status(rollout_id: str) -> StatusResponse: - st = _STATE.get(rollout_id) - if not st: - raise HTTPException(status_code=404, detail="unknown rollout_id") - return StatusResponse(terminated=bool(st.get("terminated", False))) - - def main(): host = os.getenv("REMOTE_SERVER_HOST", "127.0.0.1") port = int(os.getenv("REMOTE_SERVER_PORT", "3000")) diff --git a/vite-app/dist/assets/index-C8woq7EO.js b/vite-app/dist/assets/index-C8woq7EO.js deleted file mode 100644 index 568408b3..00000000 --- a/vite-app/dist/assets/index-C8woq7EO.js +++ /dev/null @@ -1,136 +0,0 @@ -(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.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 NB(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Fp={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 e=Symbol.for("react.transitional.element"),t=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:e,type:n,key:o,ref:i!==void 0?i:null,props:s}}return ml.Fragment=t,ml.jsx=A,ml.jsxs=A,ml}var py;function IO(){return py||(py=1,Fp.exports=RO()),Fp.exports}var x=IO(),Sp={exports:{}},Ut={};/** - * @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 Ut;my=1;var e=Symbol.for("react.transitional.element"),t=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,At){this.props=T,this.context=j,this.refs=b,this.updater=At||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 U(T,j,At){this.props=T,this.context=j,this.refs=b,this.updater=At||v}var E=U.prototype=new C;E.constructor=U,w(E,_.prototype),E.isPureReactComponent=!0;var O=Array.isArray,F={H:null,A:null,T:null,S:null,V:null},D=Object.prototype.hasOwnProperty;function R(T,j,At,tt,Y,ut){return At=ut.ref,{$$typeof:e,type:T,key:j,ref:At!==void 0?At:null,props:ut}}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===e}function J(T){var j={"=":"=0",":":"=2"};return"$"+T.replace(/[=:]/g,function(At){return j[At]})}var et=/\/+/g;function nt(T,j){return typeof T=="object"&&T!==null&&T.key!=null?J(""+T.key):j.toString(36)}function ot(){}function ft(T){switch(T.status){case"fulfilled":return T.value;case"rejected":throw T.reason;default:switch(typeof T.status=="string"?T.then(ot,ot):(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 st(T,j,At,tt,Y){var ut=typeof T;(ut==="undefined"||ut==="boolean")&&(T=null);var lt=!1;if(T===null)lt=!0;else switch(ut){case"bigint":case"string":case"number":lt=!0;break;case"object":switch(T.$$typeof){case e:case t:lt=!0;break;case d:return lt=T._init,st(lt(T._payload),j,At,tt,Y)}}if(lt)return Y=Y(T),lt=tt===""?"."+nt(T,0):tt,O(Y)?(At="",lt!=null&&(At=lt.replace(et,"$&/")+"/"),st(Y,j,At,"",function(Yt){return Yt})):Y!=null&&(N(Y)&&(Y=z(Y,At+(Y.key==null||T&&T.key===Y.key?"":(""+Y.key).replace(et,"$&/")+"/")+lt)),j.push(Y)),1;lt=0;var he=tt===""?".":tt+":";if(O(T))for(var Kt=0;Kt>>1,T=L[ct];if(0>>1;cti(tt,q))Yi(ut,tt)?(L[ct]=ut,L[Y]=q,ct=Y):(L[ct]=tt,L[At]=q,ct=At);else if(Yi(ut,q))L[ct]=ut,L[Y]=q,ct=Y;else break t}}return G}function i(L,G){var q=L.sortIndex-G.sortIndex;return q!==0?q:L.id-G.id}if(e.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var s=performance;e.unstable_now=function(){return s.now()}}else{var o=Date,c=o.now();e.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,U=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,t(u,G);else break;G=A(h)}}function F(L){if(b=!1,O(L),!w)if(A(u)!==null)w=!0,D||(D=!0,nt());else{var G=A(h);G!==null&&st(F,G.startTime-L)}}var D=!1,R=-1,z=5,N=-1;function J(){return _?!0:!(e.unstable_now()-NL&&J());){var ct=p.callback;if(typeof ct=="function"){p.callback=null,B=p.priorityLevel;var T=ct(p.expirationTime<=L);if(L=e.unstable_now(),typeof T=="function"){p.callback=T,O(L),G=!0;break e}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&&st(F,j.startTime-L),G=!1}}break t}finally{p=null,B=q,v=!1}G=void 0}}finally{G?nt():D=!1}}}var nt;if(typeof E=="function")nt=function(){E(et)};else if(typeof MessageChannel<"u"){var ot=new MessageChannel,ft=ot.port2;ot.port1.onmessage=et,nt=function(){ft.postMessage(null)}}else nt=function(){C(et,0)};function st(L,G){R=C(function(){L(e.unstable_now())},G)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(L){L.callback=null},e.unstable_forceFrameRate=function(L){0>L||125ct?(L.sortIndex=q,t(h,L),A(u)===null&&L===A(h)&&(b?(U(R),R=-1):b=!0,st(F,q-ct))):(L.sortIndex=T,t(u,L),w||v||(w=!0,D||(D=!0,nt()))),L},e.unstable_shouldYield=J,e.unstable_wrapCallback=function(L){var G=B;return function(){var q=B;B=G;try{return L.apply(this,arguments)}finally{B=q}}}}(Tp)),Tp}var wy;function KO(){return wy||(wy=1,Hp.exports=kO()),Hp.exports}var Dp={exports:{}},dA={};/** - * @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 dA;by=1;var e=Nh();function t(u){var h="https://react.dev/errors/"+u;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}return e(),Dp.exports=zO(),Dp.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 e=KO(),t=Nh(),A=yQ();function n(r){var a="https://react.dev/errors/"+r;if(1T||(r.current=ct[T],ct[T]=null,T--)}function tt(r,a){T++,ct[T]=r.current,r.current=a}var Y=j(null),ut=j(null),lt=j(null),he=j(null);function Kt(r,a){switch(tt(lt,a),tt(ut,r),tt(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}}At(Y),tt(Y,r)}function Yt(){At(Y),At(ut),At(lt)}function An(r){r.memoizedState!==null&&tt(he,r);var a=Y.current,l=Pb(a,r.type);a!==l&&(tt(ut,r),tt(Y,l))}function Ge(r){ut.current===r&&(At(Y),At(ut)),he.current===r&&(At(he),fl._currentValue=q)}var nA=Object.prototype.hasOwnProperty,FA=e.unstable_scheduleCallback,SA=e.unstable_cancelCallback,ea=e.unstable_shouldYield,yA=e.unstable_requestPaint,CA=e.unstable_now,mi=e.unstable_getCurrentPriorityLevel,Pn=e.unstable_ImmediatePriority,se=e.unstable_UserBlockingPriority,jn=e.unstable_NormalPriority,es=e.unstable_LowPriority,Ar=e.unstable_IdlePriority,As=e.log,Aa=e.unstable_setDisableYieldValue,nn=null,xe=null;function OA(r){if(typeof As=="function"&&Aa(r),xe&&typeof xe.setStrictMode=="function")try{xe.setStrictMode(nn,r)}catch{}}var Se=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,lA=4194304;function $t(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 Q=f&134217727;return Q!==0?(f=Q&~m,f!==0?g=$t(f):(y&=Q,y!==0?g=$t(y):l||(l=Q&~r,l!==0&&(g=$t(l))))):(Q=f&~m,Q!==0?g=$t(Q):y!==0?g=$t(y):l||(l=f&~r,l!==0&&(g=$t(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=lA;return lA<<=1,(lA&62914560)===0&&(lA=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 Q=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{_d=!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 xd(r.type,!1);case 11:return xd(r.type.render,!1);case 1:return xd(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 Rc(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 Ic(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 Qd(r,a,l,f,g,m,y,Q){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?Ud(r,y,ln(a)):l!=null?Ud(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"),Q!=null&&typeof Q!="function"&&typeof Q!="symbol"&&typeof Q!="boolean"?r.name=""+ln(Q):r.removeAttribute("name")}function k0(r,a,l,f,g,m,y,Q){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,Q||a===r.value||(r.value=a),r.defaultValue=a}f=f??g,f=typeof f!="function"&&typeof f!="symbol"&&!!f,r.checked=Q?r.checked:!!f,r.defaultChecked=!!f,y!=null&&typeof y!="function"&&typeof y!="symbol"&&typeof y!="boolean"&&(r.name=y)}function Ud(r,a,l){a==="number"&&Ic(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"),Hd=!1;if(yi)try{var Qo={};Object.defineProperty(Qo,"passive",{get:function(){Hd=!0}}),window.addEventListener("test",Qo,Qo),window.removeEventListener("test",Qo,Qo)}catch{Hd=!1}var lr=null,Td=null,kc=null;function X0(){if(kc)return kc;var r,a=Td,l=a.length,f,g="value"in lr?lr.value:lr.textContent,m=g.length;for(r=0;r=Fo),q0=" ",tv=!1;function ev(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:(tv=!0,q0);case"textInput":return r=a.data,r===q0&&tv?null:r;default:return null}}function c1(r,a){if(ca)return r==="compositionend"||!Id&&ev(r,a)?(r=X0(),kc=Td=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}t:{for(;l;){if(l.nextSibling){l=l.nextSibling;break t}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=Ic(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=Ic(r.document)}return a}function Kd(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,zd=null,To=null,Vd=!1;function dv(r,a,l){var f=l.window===l?l.document:l.nodeType===9?l:l.ownerDocument;Vd||ua==null||ua!==Ic(f)||(f=ua,"selectionStart"in f&&Kd(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=Su(zd,"onSelect"),0>=y,g-=y,_i=1<<32-Se(a)+g|l<m?m:8;var y=L.T,Q={};L.T=Q,Eg(r,!1,a,l);try{var H=g(),K=L.S;if(K!==null&&K(Q,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 Qg(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 Ug(){return hA(fl)}function mw(){return ke().memoizedState}function Bw(){return ke().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:ng()},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},cu(r)?ww(a,l):(l=Xd(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(cu(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,Q=m(y,l);if(g.hasEagerState=!0,g.eagerState=Q,zA(Q,y))return Xc(r,a,g,0),ae===null&&Gc(),!1}catch{}finally{}if(l=Xd(r,a,g,f),l!==null)return ZA(l,r,f),bw(l,a,f),!0}return!1}function Eg(r,a,l,f){if(f={lane:2,revertLane:sp(),action:f,hasEagerState:!1,eagerState:null,next:null},cu(r)){if(a)throw Error(n(479))}else a=Xd(r,l,f,2),a!==null&&ZA(a,r,2)}function cu(r){var a=r.alternate;return r===Et||a!==null&&a===Et}function ww(r,a){ba=iu=!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,Oe(r,l)}}var uu={readContext:hA,use:su,useCallback:De,useContext:De,useEffect:De,useImperativeHandle:De,useLayoutEffect:De,useInsertionEffect:De,useMemo:De,useReducer:De,useRef:De,useState:De,useDebugValue:De,useDeferredValue:De,useTransition:De,useSyncExternalStore:De,useId:De,useHostTransitionStatus:De,useFormState:De,useActionState:De,useOptimistic:De,useMemoCache:De,useCacheRefresh:De},yw={readContext:hA,use:su,useCallback:function(r,a){return TA().memoizedState=[r,a===void 0?null:a],r},useContext:hA,useEffect:rw,useImperativeHandle:function(r,a,l){l=l!=null?l.concat([r]):null,lu(4194308,4,lw.bind(null,a,r),l)},useLayoutEffect:function(r,a){return lu(4194308,4,r,a)},useInsertionEffect:function(r,a){lu(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,Et,r),[f.memoizedState,r]},useRef:function(r){var a=TA();return r={current:r},a.memoizedState=r},useState:function(r){r=yg(r);var a=r.queue,l=vw.bind(null,Et,a);return a.dispatch=l,[r.memoizedState,l]},useDebugValue:_g,useDeferredValue:function(r,a){var l=TA();return xg(l,r,a)},useTransition:function(){var r=yg(!1);return r=dw.bind(null,Et,r.queue,!0,!1),TA().memoizedState=r,[!1,r]},useSyncExternalStore:function(r,a,l){var f=Et,g=TA();if(Pt){if(l===void 0)throw Error(n(407));l=l()}else{if(l=a(),ae===null)throw Error(n(349));(Lt&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,ou(),Pv.bind(null,f,m,l,a),null),l},useId:function(){var r=TA(),a=ae.identifierPrefix;if(Pt){var l=xi,f=_i;l=(f&~(1<<32-Se(f)-1)).toString(32)+l,a="«"+a+"R"+l,l=ru++,0Ct?($e=vt,vt=null):$e=vt.sibling;var It=V(I,vt,k[Ct],$);if(It===null){vt===null&&(vt=$e);break}r&&vt&&It.alternate===null&&a(I,vt),M=m(It,M,Ct),Ft===null?pt=It:Ft.sibling=It,Ft=It,vt=$e}if(Ct===k.length)return l(I,vt),Pt&&fs(I,Ct),pt;if(vt===null){for(;CtCt?($e=vt,vt=null):$e=vt.sibling;var Sr=V(I,vt,It.value,$);if(Sr===null){vt===null&&(vt=$e);break}r&&vt&&Sr.alternate===null&&a(I,vt),M=m(Sr,M,Ct),Ft===null?pt=Sr:Ft.sibling=Sr,Ft=Sr,vt=$e}if(It.done)return l(I,vt),Pt&&fs(I,Ct),pt;if(vt===null){for(;!It.done;Ct++,It=k.next())It=W(I,It.value,$),It!==null&&(M=m(It,M,Ct),Ft===null?pt=It:Ft.sibling=It,Ft=It);return Pt&&fs(I,Ct),pt}for(vt=f(vt);!It.done;Ct++,It=k.next())It=P(vt,I,Ct,It.value,$),It!==null&&(r&&It.alternate!==null&&vt.delete(It.key===null?Ct:It.key),M=m(It,M,Ct),Ft===null?pt=It:Ft.sibling=It,Ft=It);return r&&vt.forEach(function(LO){return a(I,LO)}),Pt&&fs(I,Ct),pt}function qt(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:t:{for(var pt=k.key;M!==null;){if(M.key===pt){if(pt=k.type,pt===w){if(M.tag===7){l(I,M.sibling),$=g(M,k.props.children),$.return=I,I=$;break t}}else if(M.elementType===pt||typeof pt=="object"&&pt!==null&&pt.$$typeof===z&&_w(pt)===M.type){l(I,M.sibling),$=g(M,k.props),$o($,k),$.return=I,I=$;break t}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=$):($=Yc(k.type,k.key,k.props,null,I.mode,$),$o($,k),$.return=I,I=$)}return y(I);case v:t:{for(pt=k.key;M!==null;){if(M.key===pt)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 t}else{l(I,M);break}else a(I,M);M=M.sibling}$=$d(k,I.mode,$),$.return=I,I=$}return y(I);case z:return pt=k._init,k=pt(k._payload),qt(I,M,k,$)}if(st(k))return _t(I,M,k,$);if(nt(k)){if(pt=nt(k),typeof pt!="function")throw Error(n(150));return k=pt.call(k),bt(I,M,k,$)}if(typeof k.then=="function")return qt(I,M,fu(k),$);if(k.$$typeof===E)return qt(I,M,qc(I,k),$);hu(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),$=Yd(k,I.mode,$),$.return=I,I=$),y(I)):l(I,M)}return function(I,M,k,$){try{Yo=0;var pt=qt(I,M,k,$);return _a=null,pt}catch(vt){if(vt===ko||vt===eu)throw vt;var Ft=VA(29,vt,null,I.mode);return Ft.lanes=$,Ft.return=I,Ft}finally{}}}var xa=xw(!0),Qw=xw(!1),gn=j(null),Yn=null;function gr(r){var a=r.alternate;tt(Ve,Ve.current&1),tt(gn,r),Yn===null&&(a===null||wa.current!==null||a.memoizedState!==null)&&(Yn=r)}function Uw(r){if(r.tag===22){if(tt(Ve,Ve.current),tt(gn,r),Yn===null){var a=r.alternate;a!==null&&a.memoizedState!==null&&(Yn=r)}}else pr()}function pr(){tt(Ve,Ve.current),tt(gn,gn.current)}function Fi(r){At(gn),Yn===r&&(Yn=null),At(Ve)}var Ve=j(0);function du(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==="$?"||Bp(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 Fg(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 Sg={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&&Sg.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 gu=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){gu(r)}function Ow(r){console.error(r)}function Hw(r){gu(r)}function pu(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 Og(r,a,l){return l=fr(l),l.tag=3,l.payload={element:null},l.callback=function(){pu(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 Q=f.stack;this.componentDidCatch(f.value,{componentStack:Q!==null?Q:""})})}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?ep():l.alternate===null&&Ue===0&&(Ue=3),l.flags&=-257,l.flags|=65536,l.lanes=g,f===sg?l.flags|=16384:(a=l.updateQueue,a===null?l.updateQueue=new Set([f]):a.add(f),np(r,f,g)),!1;case 22:return l.flags|=65536,f===sg?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)),np(r,f,g)),!1}throw Error(n(435,l.tag))}return np(r,f,g),ep(),!1}if(Pt)return a=gn.current,a!==null?((a.flags&65536)===0&&(a.flags|=256),a.flags|=65536,a.lanes=g,f!==qd&&(r=Error(n(422),{cause:f}),Lo(un(r,l)))):(f!==qd&&(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=Og(r.stateNode,f,g),lg(r,g),Ue!==4&&(Ue=2)),!1;var m=Error(n(520),{cause:f});if(m=un(m,l),nl===null?nl=[m]:nl.push(m),Ue!==4&&(Ue=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=Og(l.stateNode,f,r),lg(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),lg(l,g),!1}l=l.return}while(l!==null);return!1}var Lw=Error(n(461)),Ze=!1;function iA(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 Q in f)Q!=="ref"&&(y[Q]=f[Q])}else y=f;return ps(a),f=dg(r,a,l,y,m,g),Q=gg(),r!==null&&!Ze?(pg(r,a,g),Si(r,a,g)):(Pt&&Q&&Wd(a),a.flags|=1,iA(r,a,f,g),a.child)}function Iw(r,a,l,f,g){if(r===null){var m=l.type;return typeof m=="function"&&!Zd(m)&&m.defaultProps===void 0&&l.compare===null?(a.tag=15,a.type=m,Nw(r,a,m,f,g)):(r=Yc(l.type,null,f,a,a.mode,g),r.ref=a.ref,r.return=a,a.child=r)}if(m=r.child,!Ng(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(Ze=!1,a.pendingProps=f=m,Ng(r,g))(r.flags&131072)!==0&&(Ze=!0);else return a.lanes=r.lanes,Si(r,a,g)}return Hg(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):ug(),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),ug(),pr());return iA(r,a,g,l),a.child}function Kw(r,a,l,f){var g=rg();return g=g===null?null:{parent:ze._currentValue,pool:g},a.memoizedState={baseLanes:l,cachePool:g},r!==null&&tu(a,null),ug(),Uw(a),r!==null&&Ro(r,a,f,!0),null}function mu(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 Hg(r,a,l,f,g){return ps(a),l=dg(r,a,l,f,void 0,g),f=gg(),r!==null&&!Ze?(pg(r,a,g),Si(r,a,g)):(Pt&&f&&Wd(a),a.flags|=1,iA(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=gg(),r!==null&&!Ze?(pg(r,a,m),Si(r,a,m)):(Pt&&f&&Wd(a),a.flags|=1,iA(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=hA(y)),m=new l(f,m),a.memoizedState=m.state!==null&&m.state!==void 0?m.state:null,m.updater=Sg,a.stateNode=m,m._reactInternals=a,m=a.stateNode,m.props=f,m.state=a.memoizedState,m.refs={},ag(a),y=l.contextType,m.context=typeof y=="object"&&y!==null?hA(y):ga,m.state=a.memoizedState,y=l.getDerivedStateFromProps,typeof y=="function"&&(Fg(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&&Sg.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 Q=a.memoizedProps,H=vs(l,Q);m.props=H;var K=m.context,X=l.contextType;y=ga,typeof X=="object"&&X!==null&&(y=hA(X));var W=l.getDerivedStateFromProps;X=typeof W=="function"||typeof m.getSnapshotBeforeUpdate=="function",Q=a.pendingProps!==Q,X||typeof m.UNSAFE_componentWillReceiveProps!="function"&&typeof m.componentWillReceiveProps!="function"||(Q||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,Q||V!==K||ur?(typeof W=="function"&&(Fg(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,og(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=hA(K)),Q=l.getDerivedStateFromProps,(K=typeof Q=="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&&Jc(r.dependencies)?(typeof Q=="function"&&(Fg(a,l,Q,f),P=a.memoizedState),(X=ur||Ew(a,l,X,f,V,P,H)||r!==null&&r.dependencies!==null&&Jc(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,mu(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)):iA(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,iA(r,a,l,f),a.child}var Tg={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function Dg(r){return{baseLanes:r,cachePool:Ov()}}function Mg(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:(Ve.current&2)!==0),y&&(g=!0,a.flags&=-129),y=(a.flags&32)!==0,a.flags&=-33,r===null){if(Pt){if(g?gr(a):pr(),Pt){var Q=Qe,H;if(H=Q){t:{for(H=Q,Q=Zn;H.nodeType!==8;){if(!Q){Q=null;break t}if(H=On(H.nextSibling),H===null){Q=null;break t}}Q=H}Q!==null?(a.memoizedState={dehydrated:Q,treeContext:us!==null?{id:_i,overflow:xi}:null,retryLane:536870912,hydrationErrors:null},H=VA(18,null,null,0),H.stateNode=Q,H.return=a,a.child=H,xA=a,Qe=null,H=!0):H=!1}H||ds(a)}if(Q=a.memoizedState,Q!==null&&(Q=Q.dehydrated,Q!==null))return Bp(Q)?a.lanes=32:a.lanes=536870912,null;Fi(a)}return Q=f.children,f=f.fallback,g?(pr(),g=a.mode,Q=Bu({mode:"hidden",children:Q},g),f=cs(f,g,l,null),Q.return=a,f.return=a,Q.sibling=f,a.child=Q,g=a.child,g.memoizedState=Dg(l),g.childLanes=Mg(r,y,l),a.memoizedState=Tg,f):(gr(a),Lg(a,Q))}if(H=r.memoizedState,H!==null&&(Q=H.dehydrated,Q!==null)){if(m)a.flags&256?(gr(a),a.flags&=-257,a=Rg(r,a,l)):a.memoizedState!==null?(pr(),a.child=r.child,a.flags|=128,a=null):(pr(),g=f.fallback,Q=a.mode,f=Bu({mode:"visible",children:f.children},Q),g=cs(g,Q,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=Dg(l),f.childLanes=Mg(r,y,l),a.memoizedState=Tg,a=g);else if(gr(a),Bp(Q)){if(y=Q.nextSibling&&Q.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=Rg(r,a,l)}else if(Ze||Ro(r,a,l,!1),y=(l&r.childLanes)!==0,Ze||y){if(y=ae,y!==null&&(f=l&-l,f=(f&42)!==0?1:cA(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;Q.data==="$?"||ep(),a=Rg(r,a,l)}else Q.data==="$?"?(a.flags|=192,a.child=r.child,a=null):(r=H.treeContext,Qe=On(Q.nextSibling),xA=a,Pt=!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=Lg(a,f.children),a.flags|=4096);return a}return g?(pr(),g=f.fallback,Q=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,Q,l,null),g.flags|=2),g.return=a,f.return=a,f.sibling=g,a.child=f,f=g,g=a.child,Q=r.child.memoizedState,Q===null?Q=Dg(l):(H=Q.cachePool,H!==null?(K=ze._currentValue,H=H.parent!==K?{parent:K,pool:K}:H):H=Ov(),Q={baseLanes:Q.baseLanes|l,cachePool:H}),g.memoizedState=Q,g.childLanes=Mg(r,y,l),a.memoizedState=Tg,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 Lg(r,a){return a=Bu({mode:"visible",children:a},r.mode),a.return=r,r.child=a}function Bu(r,a){return r=VA(22,r,null,a),r.lanes=0,r.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null},r}function Rg(r,a,l){return xa(a,r.child,null,l),r=Lg(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),eg(r.return,a,l)}function Ig(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(iA(r,a,f.children,l),f=Ve.current,(f&2)!==0)f=f&1|2,a.flags|=128;else{if(r!==null&&(r.flags&128)!==0)t: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 t;for(;r.sibling===null;){if(r.return===null||r.return===a)break t;r=r.return}r.sibling.return=r.return,r=r.sibling}f&=1}switch(tt(Ve,f),g){case"forwards":for(l=a.child,g=null;l!==null;)r=l.alternate,r!==null&&du(r)===null&&(g=l),l=l.sibling;l=g,l===null?(g=a.child,a.child=null):(g=l.sibling,l.sibling=null),Ig(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&&du(r)===null){a.child=g;break}r=g.sibling,g.sibling=l,l=g,g=r}Ig(a,!0,l,null,m);break;case"together":Ig(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 Ng(r,a){return(r.lanes&a)!==0?!0:(r=r.dependencies,!!(r!==null&&Jc(r)))}function R1(r,a,l){switch(a.tag){case 3:Kt(a,a.stateNode.containerInfo),cr(a,ze,r.memoizedState.cache),Mo();break;case 27:case 5:An(a);break;case 4:Kt(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),tt(Ve,Ve.current),f)break;return null;case 22:case 23:return a.lanes=0,kw(r,a,l);case 24:cr(a,ze,r.memoizedState.cache)}return Si(r,a,l)}function Zw(r,a,l){if(r!==null)if(r.memoizedProps!==a.pendingProps)Ze=!0;else{if(!Ng(r,l)&&(a.flags&128)===0)return Ze=!1,R1(r,a,l);Ze=(r.flags&131072)!==0}else Ze=!1,Pt&&(a.flags&1048576)!==0&&_v(a,Wc,a.index);switch(a.lanes=0,a.tag){case 16:t:{r=a.pendingProps;var f=a.elementType,g=f._init;if(f=g(f._payload),a.type=f,typeof f=="function")Zd(f)?(r=vs(f,r),a.tag=1,a=Vw(null,a,f,r,l)):(a.tag=0,a=Hg(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 t}else if(g===R){a.tag=14,a=Iw(null,a,f,r,l);break t}}throw a=ft(f)||f,Error(n(306,a,""))}}return a;case 0:return Hg(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:t:{if(Kt(a,a.stateNode.containerInfo),r===null)throw Error(n(387));f=a.pendingProps;var m=a.memoizedState;g=m.element,og(r,a),Po(a,f,null,l);var y=a.memoizedState;if(f=y.cache,cr(a,ze,f),f!==m.cache&&Ag(a,[ze],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 t}else if(f!==g){g=un(Error(n(424)),a),Lo(g),a=Pw(r,a,f,l);break t}else{switch(r=a.stateNode.containerInfo,r.nodeType){case 9:r=r.body;break;default:r=r.nodeName==="HTML"?r.ownerDocument.body:r}for(Qe=On(r.firstChild),xA=a,Pt=!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 t}iA(r,a,f,l)}a=a.child}return a;case 26:return mu(r,a),r===null?(l=Jb(a.type,null,a.pendingProps,null))?a.memoizedState=l:Pt||(l=a.type,r=a.pendingProps,f=Hu(lt.current).createElement(l),f[it]=a,f[mt]=r,sA(f,l,r),Te(f),a.stateNode=f):a.memoizedState=Jb(a.type,r.memoizedProps,a.pendingProps,r.memoizedState),null;case 27:return An(a),r===null&&Pt&&(f=a.stateNode=Yb(a.type,a.pendingProps,lt.current),xA=a,Zn=!0,g=Qe,xr(a.type)?(vp=g,Qe=On(f.firstChild)):Qe=g),iA(r,a,a.pendingProps.children,l),mu(r,a),r===null&&(a.flags|=4194304),a.child;case 5:return r===null&&Pt&&((g=f=Qe)&&(f=uO(f,a.type,a.pendingProps,Zn),f!==null?(a.stateNode=f,xA=a,Qe=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,gp(g,m)?f=null:y!==null&&gp(g,y)&&(a.flags|=32),a.memoizedState!==null&&(g=dg(r,a,F1,null,null,l),fl._currentValue=g),mu(r,a),iA(r,a,f,l),a.child;case 6:return r===null&&Pt&&((r=l=Qe)&&(l=fO(l,a.pendingProps,Zn),l!==null?(a.stateNode=l,xA=a,Qe=null,r=!0):r=!1),r||ds(a)),null;case 13:return jw(r,a,l);case 4:return Kt(a,a.stateNode.containerInfo),f=a.pendingProps,r===null?a.child=xa(a,null,f,l):iA(r,a,f,l),a.child;case 11:return Rw(r,a,a.type,a.pendingProps,l);case 7:return iA(r,a,a.pendingProps,l),a.child;case 8:return iA(r,a,a.pendingProps.children,l),a.child;case 12:return iA(r,a,a.pendingProps.children,l),a.child;case 10:return f=a.pendingProps,cr(a,a.type,f.value),iA(r,a,f.children,l),a.child;case 9:return g=a.type._context,f=a.pendingProps.children,ps(a),g=hA(g),f=f(g),a.flags|=1,iA(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=Bu(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=hA(ze),r===null?(g=rg(),g===null&&(g=ae,m=ng(),g.pooledCache=m,m.refCount++,m!==null&&(g.pooledCacheLanes|=l),g=m),a.memoizedState={parent:f,cache:g},ag(a),cr(a,ze,g)):((r.lanes&l)!==0&&(og(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,ze,f)):(f=m.cache,cr(a,ze,f),f!==g.cache&&Ag(a,[ze],l,!0))),iA(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&&((Lt&4194048)===Lt?Yn!==null:(Lt&62914560)!==Lt&&(Lt&536870912)===0||a!==Yn))throw Ko=sg,Hv;r.flags|=8192}}function vu(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(!Pt)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 Ce(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(Jd(a),a.tag){case 31:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Ce(a),null;case 1:return Ce(a),null;case 3:return l=a.stateNode,f=null,r!==null&&(f=r.memoizedState.cache),a.memoizedState.cache!==f&&(a.flags|=2048),Ui(ze),Yt(),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())),Ce(a),null;case 26:return l=a.memoizedState,r===null?(Oi(a),l!==null?(Ce(a),Yw(a,l)):(Ce(a),a.flags&=-16777217)):l?l!==r.memoizedState?(Oi(a),Ce(a),Yw(a,l)):(Ce(a),a.flags&=-16777217):(r.memoizedProps!==f&&Oi(a),Ce(a),a.flags&=-16777217),null;case 27:Ge(a),l=lt.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 Ce(a),null}r=Y.current,Do(a)?xv(a):(r=Yb(g,f,l),a.stateNode=r,Oi(a))}return Ce(a),null;case 5:if(Ge(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 Ce(a),null}if(r=Y.current,Do(a))xv(a);else{switch(g=Hu(lt.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 65a3bbb8..753f796e 100644 --- a/vite-app/src/components/EvaluationRow.tsx +++ b/vite-app/src/components/EvaluationRow.tsx @@ -371,9 +371,11 @@ 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 3c5bd80c..480fb6a2 100644 --- a/vite-app/src/components/LogsSection.tsx +++ b/vite-app/src/components/LogsSection.tsx @@ -17,9 +17,7 @@ export const LogsSection = observer(({ rolloutId }: LogsSectionProps) => { const [logs, setLogs] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); - const [isExpanded, setIsExpanded] = useState(false); const [selectedLevel, setSelectedLevel] = useState(""); - const [hasLoadedOnce, setHasLoadedOnce] = useState(false); const fetchLogs = async (isInitialLoad = false) => { if (!rolloutId) return; @@ -74,7 +72,6 @@ export const LogsSection = observer(({ rolloutId }: LogsSectionProps) => { } else { // 404 with JSON content-type means "no logs found" - this is valid setLogs([]); - setHasLoadedOnce(true); return; } } @@ -94,7 +91,6 @@ export const LogsSection = observer(({ rolloutId }: LogsSectionProps) => { await response.json() ); setLogs(data.logs); - setHasLoadedOnce(true); } catch (err) { if (err instanceof Error && err.message.includes("Unexpected token")) { setError( @@ -109,103 +105,71 @@ export const LogsSection = observer(({ rolloutId }: LogsSectionProps) => { }; useEffect(() => { - if (isExpanded && rolloutId) { - setHasLoadedOnce(false); // Reset when filters change + if (rolloutId) { fetchLogs(true); // Initial load const interval = setInterval(() => fetchLogs(false), 5000); // Poll every 5 seconds without loading state return () => clearInterval(interval); } - }, [isExpanded, rolloutId, selectedLevel]); + }, [rolloutId, selectedLevel]); if (!rolloutId) { return null; } return ( -
- {/* Header - matching MetadataSection styling */} -
setIsExpanded(!isExpanded)} - > -

- Logs {hasLoadedOnce ? `(${logs.length})` : ""} -

- - - -
- +
{/* Content - matching MetadataSection container styling */} - {isExpanded && ( -
- {/* Log level filter */} -
- - -
+
+ {/* Log level filter */} +
+ + +
- {error && ( -
- {error} -
- )} + {error && ( +
+ {error} +
+ )} - {loading && logs.length === 0 && ( -
Loading logs...
- )} + {loading && logs.length === 0 && ( +
Loading logs...
+ )} - {logs.length === 0 && !loading && !error && ( -
No logs found
- )} + {logs.length === 0 && !loading && !error && ( +
No logs found
+ )} - {logs.length > 0 && ( -
+ {logs.length > 0 && ( +
+
{logs.map((log, index) => (
-
+
{ > {log.level} - + {new Date(log["@timestamp"]).toLocaleTimeString()} - + {log.logger_name} + + {log.status_message && ( + + Status: {log.status_message}{" "} + + )} + {log.message} +
-
- {log.message} -
- {log.status_message && ( -
- Status: {log.status_message} -
- )}
))}
- )} -
- )} +
+ )} +
); });