diff --git a/.gitignore b/.gitignore
index 47256d70..76fb66c7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,7 +8,9 @@ backend/data/**
# Electron build artifacts
electron/dist/
electron/python-env/
+electron/build-staging/
electron/node_modules/
+electron/package-lock.json
# Frontend build output
frontend/dist/
\ No newline at end of file
diff --git a/backend/apps/agents/agent_manager.py b/backend/apps/agents/agent_manager.py
index c92b6b10..a8307969 100644
--- a/backend/apps/agents/agent_manager.py
+++ b/backend/apps/agents/agent_manager.py
@@ -66,6 +66,8 @@ FULL_TOOLS = [
"TaskOutput", "TaskStop",
"CronCreate", "CronList", "CronDelete",
"RenderOutput",
+ "InvokeAgent",
+ "Agent",
]
def _get_denied_tool_names(tool) -> set[str]:
@@ -232,8 +234,12 @@ class AgentManager:
+ "\n"
)
- def _build_browser_context(self, dashboard_id: str | None) -> str | None:
- """Build a context block listing browser cards and delegation instructions."""
+ def _build_browser_context(self, dashboard_id: str | None, selected_browser_ids: list[str] | None = None) -> str | None:
+ """Build a context block listing browser cards and delegation instructions.
+
+ Only browser cards explicitly selected by the user are included.
+ If none are selected, no browser card details are exposed.
+ """
if not dashboard_id:
return None
try:
@@ -246,34 +252,39 @@ class AgentManager:
lines = [
"",
- "You have access to browser automation through the BrowserAgent and BrowserAgents tools.",
+ "You have access to browser automation through the CreateBrowserAgent, BrowserAgent, and BrowserAgents tools.",
"",
- "- **BrowserAgent(task, browser_id?, url?)**: Delegate a single browser task to a dedicated browser agent. "
+ "- **CreateBrowserAgent(task, url?)**: Create a new browser card and run a task on it. "
+ "Use this when you need a fresh browser. Optionally provide a starting URL.",
+ "- **BrowserAgent(browser_id, task)**: Delegate a task to an existing browser card. "
"The browser agent will autonomously navigate, click, type, and interact with the page, then return a summary and screenshot.",
- "- **BrowserAgents(tasks)**: Run multiple browser tasks in parallel, each on a different browser.",
+ "- **BrowserAgents(tasks)**: Run multiple browser tasks in parallel on existing browser cards. "
+ "Each task requires a browser_id.",
"",
"You do NOT have direct access to low-level browser tools (click, type, screenshot, etc.). "
"Instead, describe what you want accomplished and the browser agent will handle the details.",
- "",
- "If you omit browser_id, a new browser card will be auto-created. "
- "If you provide a url without a browser_id, the new browser navigates there first.",
]
- if browser_cards:
- lines.append("")
- lines.append("Available browser cards on the dashboard:")
- for card in browser_cards.values():
- bid = card.get("browser_id", "")
- tabs = card.get("tabs", [])
- active_tab_id = card.get("activeTabId", "")
- active_tab = next((t for t in tabs if t.get("id") == active_tab_id), None)
- url = (active_tab or {}).get("url", card.get("url", ""))
- title = (active_tab or {}).get("title", "")
- lines.append(f"- browser_id: \"{bid}\"")
- if title:
- lines.append(f" Title: {title}")
- if url:
- lines.append(f" URL: {url}")
+ if browser_cards and selected_browser_ids:
+ visible_cards = [
+ card for card in browser_cards.values()
+ if card.get("browser_id", "") in selected_browser_ids
+ ]
+ if visible_cards:
+ lines.append("")
+ lines.append("The user selected these browser cards for you to work with:")
+ for card in visible_cards:
+ bid = card.get("browser_id", "")
+ tabs = card.get("tabs", [])
+ active_tab_id = card.get("activeTabId", "")
+ active_tab = next((t for t in tabs if t.get("id") == active_tab_id), None)
+ url = (active_tab or {}).get("url", card.get("url", ""))
+ title = (active_tab or {}).get("title", "")
+ lines.append(f"- browser_id: \"{bid}\"")
+ if title:
+ lines.append(f" Title: {title}")
+ if url:
+ lines.append(f" URL: {url}")
lines.append(" ")
return "\n".join(lines)
@@ -456,7 +467,7 @@ class AgentManager:
})
return content
- async def _run_agent_loop(self, session_id: str, prompt: str, images: list | None = None, context_paths: list | None = None, forced_tools: list[str] | None = None, attached_skills: list | None = None):
+ async def _run_agent_loop(self, session_id: str, prompt: str, images: list | None = None, context_paths: list | None = None, forced_tools: list[str] | None = None, attached_skills: list | None = None, fork_session: bool = False, selected_browser_ids: list[str] | None = None):
"""Run the Claude Agent SDK query loop for a session."""
session = self.sessions.get(session_id)
if not session:
@@ -481,58 +492,53 @@ class AgentManager:
_builtin_perms = load_builtin_permissions()
- def _check_tool_permission(tool_name: str) -> str | None:
- """Check tool permissions for both builtin and MCP tools.
- Returns 'always_allow', 'deny', or None (ask)."""
+ def _get_effective_policy(tool_name: str) -> str:
+ """Return 'always_allow', 'deny', or 'ask' for any tool."""
if tool_name in _builtin_perms:
- policy = _builtin_perms[tool_name]
- if policy in ("always_allow", "deny"):
- return policy
- return None
+ return _builtin_perms[tool_name]
import re as _re
+
+ bm = _re.match(r"mcp__openswarm-browser-agent__(.+)", tool_name)
+ if bm:
+ return _builtin_perms.get(bm.group(1), "always_allow")
+
+ im = _re.match(r"mcp__openswarm-invoke-agent__(.+)", tool_name)
+ if im:
+ return _builtin_perms.get(im.group(1), "always_allow")
+
m = _re.match(r"mcp__([^_]+(?:-[^_]+)*)__(.+)", tool_name)
- if not m:
- return None
- server_slug, mcp_tool_name = m.group(1), m.group(2)
- for t in load_all_tools():
- if not t.mcp_config or not t.enabled:
- continue
- if _sanitize_server_name(t.name) == server_slug:
- policy = t.tool_permissions.get(mcp_tool_name, "ask")
- if policy in ("always_allow", "deny"):
- return policy
- return None
- return None
-
- async def can_use_tool(tool_name, input_data, context):
- if tool_name != "AskUserQuestion":
- policy = _check_tool_permission(tool_name)
- if policy == "always_allow":
- return PermissionResultAllow(updated_input=input_data)
- if policy == "deny":
- return PermissionResultDeny(message="Tool denied by permission policy")
+ if m:
+ server_slug, mcp_tool_name = m.group(1), m.group(2)
+ for t in load_all_tools():
+ if not t.mcp_config or not t.enabled:
+ continue
+ if _sanitize_server_name(t.name) == server_slug:
+ return t.tool_permissions.get(mcp_tool_name, "ask")
+ return "always_allow"
+ async def _request_user_approval(tool_name: str, tool_input) -> dict:
+ """Send an approval request via WebSocket and wait for the user's decision."""
+ safe_input = tool_input if isinstance(tool_input, dict) else {}
request_id = uuid4().hex
approval_req = ApprovalRequest(
id=request_id,
session_id=session_id,
tool_name=tool_name,
- tool_input=input_data if isinstance(input_data, dict) else {},
+ tool_input=safe_input,
)
session.pending_approvals.append(approval_req)
session.status = "waiting_approval"
-
+
await ws_manager.send_to_session(session_id, "agent:status", {
"session_id": session_id,
"status": "waiting_approval",
})
-
+
decision = await ws_manager.send_approval_request(
- session_id, request_id, tool_name,
- input_data if isinstance(input_data, dict) else {}
+ session_id, request_id, tool_name, safe_input
)
-
+
session.pending_approvals = [
a for a in session.pending_approvals if a.id != request_id
]
@@ -541,22 +547,67 @@ class AgentManager:
"session_id": session_id,
"status": "running",
})
-
+ return decision
+
+ async def can_use_tool(tool_name, input_data, context):
+ if tool_name != "AskUserQuestion":
+ policy = _get_effective_policy(tool_name)
+ if policy == "always_allow":
+ return PermissionResultAllow(updated_input=input_data)
+ if policy == "deny":
+ return PermissionResultDeny(message="Tool denied by permission policy")
+
+ decision = await _request_user_approval(tool_name, input_data)
if decision.get("behavior") == "allow":
return PermissionResultAllow(
updated_input=decision.get("updated_input", input_data)
)
- else:
- return PermissionResultDeny(
- message=decision.get("message", "User denied this action")
- )
+ return PermissionResultDeny(
+ message=decision.get("message", "User denied this action")
+ )
tool_start_times: dict[str, float] = {}
async def pre_tool_hook(input_data, tool_use_id, context):
+ tool_name = input_data.get("tool_name", "")
+ hook_event = input_data.get("hook_event_name", "PreToolUse")
+
+ if tool_name and tool_name != "AskUserQuestion":
+ policy = _get_effective_policy(tool_name)
+
+ if policy == "deny":
+ return {
+ "hookSpecificOutput": {
+ "hookEventName": hook_event,
+ "permissionDecision": "deny",
+ "permissionDecisionReason": "Tool denied by permission policy",
+ }
+ }
+
+ if policy == "ask":
+ tool_input = input_data.get("tool_input", {})
+ decision = await _request_user_approval(tool_name, tool_input)
+
+ if decision.get("behavior") == "allow":
+ if tool_use_id:
+ tool_start_times[tool_use_id] = time.time()
+ return {
+ "hookSpecificOutput": {
+ "hookEventName": hook_event,
+ "permissionDecision": "allow",
+ }
+ }
+ return {
+ "hookSpecificOutput": {
+ "hookEventName": hook_event,
+ "permissionDecision": "deny",
+ "permissionDecisionReason": decision.get("message", "User denied this action"),
+ }
+ }
+
if tool_use_id:
tool_start_times[tool_use_id] = time.time()
- return {"continue_": True}
+ return {}
async def post_tool_hook(input_data, tool_use_id, context):
elapsed_ms = None
@@ -590,7 +641,61 @@ class AgentManager:
if elapsed_ms is not None:
result_payload["elapsed_ms"] = elapsed_ms
- result_msg = Message(role="tool_result", content=result_payload)
+ if hook_tool_name == "Agent":
+ tool_input = input_data.get("tool_input", {})
+ agent_prompt = tool_input.get("prompt", tool_input.get("task", ""))
+
+ sub_text = content
+ sub_cost = 0.0
+ sub_tokens = {"input": 0, "output": 0}
+ sub_model = session.model
+ if isinstance(raw_response, dict):
+ blocks = raw_response.get("content")
+ if isinstance(blocks, list):
+ parts = [
+ b.get("text", "")
+ for b in blocks
+ if isinstance(b, dict) and b.get("type") == "text"
+ ]
+ if parts:
+ sub_text = "\n".join(parts) if len(parts) > 1 else parts[0]
+ elif isinstance(raw_response.get("text"), str):
+ sub_text = raw_response["text"]
+ usage = raw_response.get("usage", {})
+ if isinstance(usage, dict):
+ sub_tokens["input"] = usage.get("input_tokens", 0) + usage.get("cache_creation_input_tokens", 0) + usage.get("cache_read_input_tokens", 0)
+ sub_tokens["output"] = usage.get("output_tokens", 0)
+ if raw_response.get("model"):
+ sub_model = raw_response["model"]
+
+ sub_session_id = uuid4().hex
+ sub_name = agent_prompt[:50] if agent_prompt else "Sub-agent"
+ sub_session = AgentSession(
+ id=sub_session_id,
+ name=sub_name,
+ status="completed",
+ model=sub_model,
+ mode="sub-agent",
+ cwd=session.cwd,
+ created_at=datetime.now(),
+ cost_usd=sub_cost,
+ tokens=sub_tokens,
+ messages=[
+ Message(role="user", content=agent_prompt, branch_id="main"),
+ Message(role="assistant", content=sub_text, branch_id="main"),
+ ],
+ dashboard_id=session.dashboard_id,
+ parent_session_id=session_id,
+ )
+ self.sessions[sub_session_id] = sub_session
+ await ws_manager.broadcast_global("agent:status", {
+ "session_id": sub_session_id,
+ "status": sub_session.status,
+ "session": sub_session.model_dump(mode="json"),
+ })
+ result_payload["sub_session_id"] = sub_session_id
+
+ result_msg = Message(role="tool_result", content=result_payload, branch_id=session.active_branch_id)
session.messages.append(result_msg)
await ws_manager.send_to_session(session_id, "agent:message", {
"session_id": session_id,
@@ -602,36 +707,95 @@ class AgentManager:
_, mode_sys_prompt, _ = self._resolve_mode(session.mode)
connected_tools_ctx = self._build_connected_tools_context(session.allowed_tools)
outputs_ctx = self._build_outputs_context()
- browser_ctx = self._build_browser_context(session.dashboard_id)
+ browser_ctx = self._build_browser_context(session.dashboard_id, selected_browser_ids=selected_browser_ids)
global_settings = load_settings()
composed_prompt = self._compose_system_prompt(global_settings.default_system_prompt, mode_sys_prompt, session.system_prompt, connected_tools_ctx, outputs_ctx, browser_ctx)
+ if session.mode == "view-builder":
+ from backend.apps.outputs.view_builder_templates import VIEW_BUILDER_SKILL
+ skill_block = f"\n{VIEW_BUILDER_SKILL}\n "
+ composed_prompt = f"{composed_prompt}\n\n{skill_block}" if composed_prompt else skill_block
+
mcp_servers = await self._build_mcp_servers(session.allowed_tools)
- browser_agent_server_path = os.path.join(
- os.path.dirname(__file__), "browser_agent_mcp_server.py"
+ _browser_delegation_tools = ["CreateBrowserAgent", "BrowserAgent", "BrowserAgents"]
+ _browser_all_denied = all(
+ _builtin_perms.get(t, "always_allow") == "deny"
+ for t in _browser_delegation_tools
)
- backend_port = os.environ.get("OPENSWARM_PORT", "8324")
- pre_selected_bids = self._get_pre_selected_browser_ids(session.dashboard_id)
- mcp_servers["openswarm-browser-agent"] = {
- "command": sys.executable,
- "args": [browser_agent_server_path],
- "env": {
- "OPENSWARM_PORT": backend_port,
- "OPENSWARM_AGENT_MODEL": session.model,
- "OPENSWARM_DASHBOARD_ID": session.dashboard_id or "",
- "OPENSWARM_PRE_SELECTED_BROWSER_IDS": ",".join(pre_selected_bids),
- },
- "type": "stdio",
- }
+
+ if not _browser_all_denied:
+ browser_agent_server_path = os.path.join(
+ os.path.dirname(__file__), "browser_agent_mcp_server.py"
+ )
+ backend_port = os.environ.get("OPENSWARM_PORT", "8324")
+ pre_selected_bids = self._get_pre_selected_browser_ids(session.dashboard_id)
+ mcp_servers["openswarm-browser-agent"] = {
+ "command": sys.executable,
+ "args": [browser_agent_server_path],
+ "env": {
+ "OPENSWARM_PORT": backend_port,
+ "OPENSWARM_AGENT_MODEL": session.model,
+ "OPENSWARM_DASHBOARD_ID": session.dashboard_id or "",
+ "OPENSWARM_PRE_SELECTED_BROWSER_IDS": ",".join(pre_selected_bids),
+ "OPENSWARM_PARENT_SESSION_ID": session.id,
+ },
+ "type": "stdio",
+ }
+
+ _invoke_agent_tools = ["InvokeAgent"]
+ _invoke_all_denied = all(
+ _builtin_perms.get(t, "always_allow") == "deny"
+ for t in _invoke_agent_tools
+ )
+
+ if not _invoke_all_denied:
+ invoke_agent_server_path = os.path.join(
+ os.path.dirname(__file__), "invoke_agent_mcp_server.py"
+ )
+ backend_port = os.environ.get("OPENSWARM_PORT", "8324")
+ mcp_servers["openswarm-invoke-agent"] = {
+ "command": sys.executable,
+ "args": [invoke_agent_server_path],
+ "env": {
+ "OPENSWARM_PORT": backend_port,
+ "OPENSWARM_PARENT_SESSION_ID": session.id,
+ "OPENSWARM_DASHBOARD_ID": session.dashboard_id or "",
+ },
+ "type": "stdio",
+ }
effective_allowed = [
t for t in session.allowed_tools
- if _builtin_perms.get(t, "always_allow") == "always_allow"
+ if t in FULL_TOOLS and _builtin_perms.get(t, "always_allow") == "always_allow"
]
+
+ effective_disallowed = [
+ t for t in FULL_TOOLS
+ if _builtin_perms.get(t, "always_allow") == "deny"
+ ]
+
if mcp_servers:
all_tools_list = load_all_tools()
for name in mcp_servers:
+ if name == "openswarm-browser-agent":
+ for bt in _browser_delegation_tools:
+ policy = _builtin_perms.get(bt, "always_allow")
+ if policy == "always_allow":
+ effective_allowed.append(f"mcp__openswarm-browser-agent__{bt}")
+ elif policy == "deny":
+ effective_disallowed.append(f"mcp__openswarm-browser-agent__{bt}")
+ continue
+
+ if name == "openswarm-invoke-agent":
+ for it in _invoke_agent_tools:
+ policy = _builtin_perms.get(it, "always_allow")
+ if policy == "always_allow":
+ effective_allowed.append(f"mcp__openswarm-invoke-agent__{it}")
+ elif policy == "deny":
+ effective_disallowed.append(f"mcp__openswarm-invoke-agent__{it}")
+ continue
+
tool_def = next(
(t for t in all_tools_list
if t.mcp_config and t.enabled and _sanitize_server_name(t.name) == name),
@@ -644,20 +808,22 @@ class AgentManager:
policy = tool_def.tool_permissions.get(tn, "ask")
if policy == "always_allow":
effective_allowed.append(f"mcp__{name}__{tn}")
+ for tn in denied:
+ effective_disallowed.append(f"mcp__{name}__{tn}")
else:
effective_allowed.append(f"mcp__{name}__*")
- effective_allowed.append("mcp__openswarm-browser-agent__*")
-
options_kwargs = {
"model": session.model,
"max_buffer_size": 5 * 1024 * 1024,
+ "permission_mode": "default",
"can_use_tool": can_use_tool,
"hooks": {
"PreToolUse": [HookMatcher(matcher=None, hooks=[pre_tool_hook])],
"PostToolUse": [HookMatcher(matcher=None, hooks=[post_tool_hook])],
},
"allowed_tools": effective_allowed,
+ "disallowed_tools": effective_disallowed,
"include_partial_messages": True,
}
if not global_settings.anthropic_api_key:
@@ -675,6 +841,8 @@ class AgentManager:
if session.sdk_session_id:
options_kwargs["resume"] = session.sdk_session_id
+ if fork_session:
+ options_kwargs["fork_session"] = True
options = ClaudeAgentOptions(**options_kwargs)
@@ -775,6 +943,7 @@ class AgentManager:
id=stream_text_msg_id or uuid4().hex,
role="assistant",
content="\n".join(content_parts),
+ branch_id=session.active_branch_id,
)
session.messages.append(asst_msg)
await ws_manager.send_to_session(session_id, "agent:message", {
@@ -784,7 +953,7 @@ class AgentManager:
for i, tu in enumerate(tool_uses):
msg_id = stream_tool_msg_ids_ordered[i] if i < len(stream_tool_msg_ids_ordered) else uuid4().hex
- tool_msg = Message(id=msg_id, role="tool_call", content=tu)
+ tool_msg = Message(id=msg_id, role="tool_call", content=tu, branch_id=session.active_branch_id)
session.messages.append(tool_msg)
await ws_manager.send_to_session(session_id, "agent:message", {
"session_id": session_id,
@@ -811,7 +980,7 @@ class AgentManager:
except Exception as e:
logger.exception(f"Agent {session_id} error: {e}")
session.status = "error"
- error_msg = Message(role="system", content=f"Error: {str(e)}")
+ error_msg = Message(role="system", content=f"Error: {str(e)}", branch_id=session.active_branch_id)
session.messages.append(error_msg)
await ws_manager.send_to_session(session_id, "agent:message", {
"session_id": session_id,
@@ -912,7 +1081,7 @@ class AgentManager:
session_id, tool_msg_id, "Bash",
_json.dumps(tool_input_content["input"], indent=2),
)
- tool_msg = Message(id=tool_msg_id, role="tool_call", content=tool_input_content)
+ tool_msg = Message(id=tool_msg_id, role="tool_call", content=tool_input_content, branch_id=session.active_branch_id)
session.messages.append(tool_msg)
await ws_manager.send_to_session(session_id, "agent:message", {
"session_id": session_id,
@@ -922,7 +1091,7 @@ class AgentManager:
await asyncio.sleep(1)
if decision.get("behavior") == "allow":
- tool_result = Message(role="tool_result", content=f"Processing: {prompt}")
+ tool_result = Message(role="tool_result", content=f"Processing: {prompt}", branch_id=session.active_branch_id)
session.messages.append(tool_result)
await ws_manager.send_to_session(session_id, "agent:message", {
"session_id": session_id,
@@ -940,7 +1109,7 @@ class AgentManager:
asst_msg_id = uuid4().hex
await self._stream_text(session_id, asst_msg_id, asst_text)
- asst_msg = Message(id=asst_msg_id, role="assistant", content=asst_text)
+ asst_msg = Message(id=asst_msg_id, role="assistant", content=asst_text, branch_id=session.active_branch_id)
session.messages.append(asst_msg)
await ws_manager.send_to_session(session_id, "agent:message", {
"session_id": session_id,
@@ -969,6 +1138,8 @@ class AgentManager:
context_paths: list | None = None,
forced_tools: list[str] | None = None,
attached_skills: list | None = None,
+ hidden: bool = False,
+ selected_browser_ids: list[str] | None = None,
):
"""Send a follow-up message to an existing session."""
session = self.sessions.get(session_id)
@@ -1000,10 +1171,12 @@ class AgentManager:
user_msg = Message(
role="user",
content=prompt,
+ branch_id=session.active_branch_id,
context_paths=context_paths if context_paths else None,
attached_skills=skill_meta,
forced_tools=forced_tools if forced_tools else None,
images=image_meta,
+ hidden=hidden,
)
session.messages.append(user_msg)
await ws_manager.send_to_session(session_id, "agent:message", {
@@ -1011,7 +1184,14 @@ class AgentManager:
"message": user_msg.model_dump(mode="json"),
})
- task = asyncio.create_task(self._run_agent_loop(session_id, prompt, images=images, context_paths=context_paths, forced_tools=forced_tools, attached_skills=attached_skills))
+ session.status = "running"
+ await ws_manager.send_to_session(session_id, "agent:status", {
+ "session_id": session_id,
+ "status": "running",
+ "session": session.model_dump(mode="json"),
+ })
+
+ task = asyncio.create_task(self._run_agent_loop(session_id, prompt, images=images, context_paths=context_paths, forced_tools=forced_tools, attached_skills=attached_skills, selected_browser_ids=selected_browser_ids))
self.tasks[session_id] = task
async def stop_agent(self, session_id: str):
@@ -1043,6 +1223,14 @@ class AgentManager:
if not session:
raise ValueError(f"Session {session_id} not found")
+ existing = self.tasks.get(session_id)
+ if existing and not existing.done():
+ existing.cancel()
+ try:
+ await existing
+ except asyncio.CancelledError:
+ pass
+
target_msg = None
for i, msg in enumerate(session.messages):
if msg.id == message_id:
@@ -1052,11 +1240,24 @@ class AgentManager:
if not target_msg or target_msg.role != "user":
raise ValueError("Can only edit user messages")
- new_branch_id = uuid4().hex[:8]
+ fork_point_id = message_id
+ fork_parent_branch = target_msg.branch_id
+
+ msg_branch = session.branches.get(target_msg.branch_id)
+ if msg_branch and msg_branch.fork_point_message_id:
+ branch_user_msgs = [
+ m for m in session.messages
+ if m.branch_id == target_msg.branch_id and m.role == "user"
+ ]
+ if branch_user_msgs and branch_user_msgs[0].id == message_id:
+ fork_point_id = msg_branch.fork_point_message_id
+ fork_parent_branch = msg_branch.parent_branch_id or "main"
+
+ new_branch_id = uuid4().hex
new_branch = MessageBranch(
id=new_branch_id,
- parent_branch_id=target_msg.branch_id,
- fork_point_message_id=message_id,
+ parent_branch_id=fork_parent_branch,
+ fork_point_message_id=fork_point_id,
)
session.branches[new_branch_id] = new_branch
session.active_branch_id = new_branch_id
@@ -1066,6 +1267,10 @@ class AgentManager:
content=new_content,
branch_id=new_branch_id,
parent_id=target_msg.parent_id,
+ images=target_msg.images,
+ context_paths=target_msg.context_paths,
+ forced_tools=target_msg.forced_tools,
+ attached_skills=target_msg.attached_skills,
)
session.messages.append(edited_msg)
@@ -1079,7 +1284,14 @@ class AgentManager:
"active_branch_id": new_branch_id,
})
- task = asyncio.create_task(self._run_agent_loop(session_id, new_content))
+ session.sdk_session_id = None
+ task = asyncio.create_task(self._run_agent_loop(
+ session_id, new_content,
+ images=target_msg.images,
+ context_paths=target_msg.context_paths,
+ forced_tools=target_msg.forced_tools,
+ attached_skills=target_msg.attached_skills,
+ ))
self.tasks[session_id] = task
async def switch_branch(self, session_id: str, branch_id: str):
@@ -1369,7 +1581,6 @@ class AgentManager:
if session.status in ("running", "waiting_approval"):
session.status = "stopped"
session.pending_approvals = []
- session.closed_at = session.closed_at or datetime.now()
doc_data = session.model_dump(mode="json")
doc_data["search_text"] = self._build_search_text(session)
_save_session(session_id, doc_data)
@@ -1378,21 +1589,208 @@ class AgentManager:
self.tasks.clear()
async def restore_all_sessions(self) -> None:
- """On startup, reload all persisted sessions from JSON files back into memory."""
+ """On startup, reload all persisted sessions from JSON files back into memory.
+
+ Only sessions without closed_at are restored (they were active at
+ shutdown). Sessions with closed_at were explicitly closed by the user
+ and stay on disk so the history endpoint can still serve them.
+ """
for sid, data in _load_all_session_data():
try:
session = AgentSession(**data)
except Exception as e:
logger.warning(f"Skipping corrupt session file {sid}: {e}")
continue
+ if session.closed_at is not None:
+ continue
if session.status in ("running", "waiting_approval"):
session.status = "stopped"
- session.closed_at = None
session.pending_approvals = []
self.sessions[session.id] = session
_delete_session_file(sid)
logger.info(f"Restored session {session.id}")
+ async def duplicate_session(self, session_id: str, dashboard_id: str | None = None, up_to_message_id: str | None = None) -> AgentSession:
+ """Create an independent copy of a session with the same chat history."""
+ source = self.sessions.get(session_id)
+ if not source:
+ data = _load_session_data(session_id)
+ if data is None:
+ raise ValueError(f"Session {session_id} not found")
+ source = AgentSession(**data)
+
+ source_messages = list(source.messages)
+ if up_to_message_id:
+ cut_idx = next(
+ (i for i, m in enumerate(source_messages) if m.id == up_to_message_id),
+ None,
+ )
+ if cut_idx is not None:
+ source_messages = source_messages[: cut_idx + 1]
+
+ old_to_new_msg: dict[str, str] = {}
+ new_messages: list[Message] = []
+ for msg in source_messages:
+ new_id = uuid4().hex
+ old_to_new_msg[msg.id] = new_id
+ new_messages.append(Message(
+ id=new_id,
+ role=msg.role,
+ content=msg.content,
+ timestamp=msg.timestamp,
+ branch_id=msg.branch_id,
+ parent_id=old_to_new_msg.get(msg.parent_id) if msg.parent_id else None,
+ context_paths=msg.context_paths,
+ attached_skills=msg.attached_skills,
+ forced_tools=msg.forced_tools,
+ images=msg.images,
+ ))
+
+ new_branches: dict[str, MessageBranch] = {}
+ for bid, branch in source.branches.items():
+ new_branches[bid] = MessageBranch(
+ id=bid,
+ parent_branch_id=branch.parent_branch_id,
+ fork_point_message_id=old_to_new_msg.get(branch.fork_point_message_id) if branch.fork_point_message_id else None,
+ created_at=branch.created_at,
+ )
+
+ new_session = AgentSession(
+ id=uuid4().hex,
+ name=f"{source.name} (copy)",
+ status="stopped",
+ model=source.model,
+ mode=source.mode,
+ system_prompt=source.system_prompt,
+ allowed_tools=list(source.allowed_tools),
+ max_turns=source.max_turns,
+ cwd=source.cwd,
+ created_at=datetime.now(),
+ messages=new_messages,
+ branches=new_branches,
+ active_branch_id=source.active_branch_id,
+ tool_group_meta=dict(source.tool_group_meta),
+ dashboard_id=dashboard_id or source.dashboard_id,
+ )
+
+ self.sessions[new_session.id] = new_session
+
+ await ws_manager.send_to_session(new_session.id, "agent:status", {
+ "session_id": new_session.id,
+ "status": new_session.status,
+ "session": new_session.model_dump(mode="json"),
+ })
+
+ return new_session
+
+ async def invoke_agent(
+ self,
+ source_session_id: str,
+ message: str,
+ parent_session_id: str | None = None,
+ dashboard_id: str | None = None,
+ ) -> dict:
+ """Fork an existing session and send it a new message, returning the result."""
+ source = self.sessions.get(source_session_id)
+ if not source:
+ data = _load_session_data(source_session_id)
+ if data is None:
+ raise ValueError(f"Session {source_session_id} not found")
+ source = AgentSession(**data)
+
+ source_name = source.name
+
+ old_to_new_msg: dict[str, str] = {}
+ new_messages: list[Message] = []
+ for msg in source.messages:
+ new_id = uuid4().hex
+ old_to_new_msg[msg.id] = new_id
+ new_messages.append(Message(
+ id=new_id,
+ role=msg.role,
+ content=msg.content,
+ timestamp=msg.timestamp,
+ branch_id=msg.branch_id,
+ parent_id=old_to_new_msg.get(msg.parent_id) if msg.parent_id else None,
+ context_paths=msg.context_paths,
+ attached_skills=msg.attached_skills,
+ forced_tools=msg.forced_tools,
+ images=msg.images,
+ ))
+
+ new_branches: dict[str, MessageBranch] = {}
+ for bid, branch in source.branches.items():
+ new_branches[bid] = MessageBranch(
+ id=bid,
+ parent_branch_id=branch.parent_branch_id,
+ fork_point_message_id=(
+ old_to_new_msg.get(branch.fork_point_message_id)
+ if branch.fork_point_message_id else None
+ ),
+ created_at=branch.created_at,
+ )
+
+ fork = AgentSession(
+ id=uuid4().hex,
+ name=f"{source_name} (invoked)",
+ status="running",
+ model=source.model,
+ mode="invoked-agent",
+ sdk_session_id=source.sdk_session_id,
+ system_prompt=source.system_prompt,
+ allowed_tools=list(source.allowed_tools),
+ max_turns=source.max_turns or 25,
+ cwd=source.cwd,
+ created_at=datetime.now(),
+ messages=new_messages,
+ branches=new_branches,
+ active_branch_id=source.active_branch_id,
+ tool_group_meta=dict(source.tool_group_meta),
+ dashboard_id=dashboard_id or source.dashboard_id,
+ parent_session_id=parent_session_id,
+ )
+
+ self.sessions[fork.id] = fork
+
+ await ws_manager.broadcast_global("agent:status", {
+ "session_id": fork.id,
+ "status": fork.status,
+ "session": fork.model_dump(mode="json"),
+ })
+
+ user_msg = Message(
+ role="user",
+ content=message,
+ branch_id=fork.active_branch_id,
+ )
+ fork.messages.append(user_msg)
+ await ws_manager.send_to_session(fork.id, "agent:message", {
+ "session_id": fork.id,
+ "message": user_msg.model_dump(mode="json"),
+ })
+
+ await self._run_agent_loop(fork.id, message, fork_session=True)
+
+ last_assistant = None
+ for msg in reversed(fork.messages):
+ if msg.role == "assistant":
+ content = msg.content
+ if isinstance(content, str):
+ last_assistant = content
+ elif isinstance(content, list):
+ texts = [b.get("text", "") for b in content if isinstance(b, dict) and b.get("type") == "text"]
+ last_assistant = "\n".join(texts)
+ else:
+ last_assistant = str(content)
+ break
+
+ return {
+ "forked_session_id": fork.id,
+ "source_name": source_name,
+ "response": last_assistant or "No response from invoked agent.",
+ "cost_usd": fork.cost_usd,
+ }
+
def get_all_sessions(self, dashboard_id: str | None = None) -> list[AgentSession]:
if dashboard_id:
return [s for s in self.sessions.values() if s.dashboard_id == dashboard_id]
@@ -1401,4 +1799,22 @@ class AgentManager:
def get_session(self, session_id: str) -> Optional[AgentSession]:
return self.sessions.get(session_id)
+ def get_browser_agent_children(self, parent_session_id: str) -> list[dict]:
+ """Return browser-agent sessions for a parent, from memory or disk."""
+ results: list[dict] = []
+ seen: set[str] = set()
+
+ for s in self.sessions.values():
+ if s.mode == "browser-agent" and s.parent_session_id == parent_session_id:
+ results.append(s.model_dump(mode="json"))
+ seen.add(s.id)
+
+ for sid, data in _load_all_session_data():
+ if sid in seen:
+ continue
+ if data.get("mode") == "browser-agent" and data.get("parent_session_id") == parent_session_id:
+ results.append(data)
+
+ return results
+
agent_manager = AgentManager()
diff --git a/backend/apps/agents/agents.py b/backend/apps/agents/agents.py
index 462b8fde..070e29c5 100644
--- a/backend/apps/agents/agents.py
+++ b/backend/apps/agents/agents.py
@@ -56,6 +56,8 @@ async def send_message(session_id: str, body: dict):
context_paths=body.get("context_paths"),
forced_tools=body.get("forced_tools"),
attached_skills=body.get("attached_skills"),
+ hidden=body.get("hidden", False),
+ selected_browser_ids=body.get("selected_browser_ids"),
)
return {"ok": True}
@@ -131,6 +133,18 @@ async def get_branches(session_id: str):
"active_branch_id": session.active_branch_id,
}
+@agents.router.post("/sessions/{session_id}/duplicate")
+async def duplicate_session(session_id: str, body: dict = {}):
+ try:
+ session = await agent_manager.duplicate_session(
+ session_id,
+ dashboard_id=body.get("dashboard_id"),
+ up_to_message_id=body.get("up_to_message_id"),
+ )
+ except ValueError as e:
+ raise HTTPException(status_code=404, detail=str(e))
+ return {"session": session.model_dump(mode="json")}
+
@agents.router.post("/sessions/{session_id}/close")
async def close_session(session_id: str):
try:
@@ -151,6 +165,11 @@ async def get_history(q: str = "", limit: int = 20, offset: int = 0, dashboard_i
dashboard_id=dashboard_id or None,
)
+@agents.router.get("/sessions/{session_id}/browser-agents")
+async def get_browser_agent_children(session_id: str):
+ children = agent_manager.get_browser_agent_children(session_id)
+ return {"sessions": children}
+
@agents.router.post("/sessions/{session_id}/resume")
async def resume_session(session_id: str):
try:
diff --git a/backend/apps/agents/browser_agent.py b/backend/apps/agents/browser_agent.py
index 11244acf..1508797a 100644
--- a/backend/apps/agents/browser_agent.py
+++ b/backend/apps/agents/browser_agent.py
@@ -15,8 +15,9 @@ from uuid import uuid4
import anthropic
-from backend.apps.agents.models import AgentSession, Message
+from backend.apps.agents.models import AgentSession, ApprovalRequest, Message
from backend.apps.agents.ws_manager import ws_manager
+from backend.apps.tools_lib.tools_lib import load_builtin_permissions
logger = logging.getLogger(__name__)
@@ -112,6 +113,48 @@ BROWSER_TOOLS_SCHEMA = [
"required": [],
},
},
+ {
+ "name": "BrowserScroll",
+ "description": (
+ "Scroll the page up or down. Automatically finds the correct scrollable "
+ "container (works on SPAs like Notion, Gmail, etc. that use nested scroll "
+ "containers instead of window-level scrolling). Returns scroll position info "
+ "including whether top/bottom has been reached."
+ ),
+ "input_schema": {
+ "type": "object",
+ "properties": {
+ "direction": {
+ "type": "string",
+ "enum": ["up", "down"],
+ "description": "Scroll direction. Defaults to 'down'.",
+ },
+ "amount": {
+ "type": "number",
+ "description": "Pixels to scroll. Defaults to 500.",
+ },
+ },
+ "required": [],
+ },
+ },
+ {
+ "name": "BrowserWait",
+ "description": (
+ "Wait for a specified duration. Useful after navigation or actions that "
+ "trigger page loads, animations, or async content rendering. "
+ "Min 100ms, max 10000ms."
+ ),
+ "input_schema": {
+ "type": "object",
+ "properties": {
+ "milliseconds": {
+ "type": "number",
+ "description": "Duration to wait in milliseconds. Defaults to 1000.",
+ },
+ },
+ "required": [],
+ },
+ },
]
ACTION_MAP = {
@@ -122,17 +165,29 @@ ACTION_MAP = {
"BrowserType": "type",
"BrowserEvaluate": "evaluate",
"BrowserGetElements": "get_elements",
+ "BrowserScroll": "scroll",
+ "BrowserWait": "wait",
}
SYSTEM_PROMPT = (
"You are a browser automation agent. You control a single browser tab and "
"execute the task you are given.\n\n"
"Strategy:\n"
- "1. Start by taking a screenshot or calling BrowserGetElements to understand the page.\n"
- "2. Use BrowserGetElements BEFORE clicking or typing to discover valid CSS selectors.\n"
- "3. After performing actions, take a screenshot to verify the result.\n"
- "4. If an action fails, try alternative selectors or approaches.\n"
- "5. When the task is complete, provide a clear summary of what you accomplished.\n\n"
+ "1. Start by taking a screenshot to understand the page.\n"
+ "2. After navigation, use BrowserWait (1-3 seconds) to let the page finish loading.\n"
+ "3. Use BrowserScroll to scroll through pages — do NOT use BrowserEvaluate with "
+ "window.scrollBy() as many sites use nested scroll containers that BrowserScroll "
+ "handles automatically.\n"
+ "4. Use BrowserGetElements BEFORE clicking or typing to discover valid CSS selectors.\n"
+ "5. After performing actions, take a screenshot to verify the result.\n"
+ "6. If an action fails, try alternative selectors or approaches.\n"
+ "7. When the task is complete, provide a clear summary of what you accomplished.\n\n"
+ "Important notes:\n"
+ "- BrowserGetText returns up to 15000 chars of visible text — use it to read page content.\n"
+ "- BrowserScroll returns position info including atTop/atBottom — use this to know when "
+ "you've reached the end of the page.\n"
+ "- For complex SPAs (Notion, Gmail, etc.), prefer BrowserScroll over BrowserEvaluate for scrolling.\n"
+ "- Avoid looping: if scrolling shows no new content (scrolled 0px), you're at the boundary.\n\n"
"You have access ONLY to browser tools. Do not ask the user questions — "
"complete the task autonomously to the best of your ability."
)
@@ -179,6 +234,40 @@ def _format_tool_result(result: dict, tool_name: str) -> list[dict]:
return [{"type": "text", "text": str(text)}]
+async def _request_browser_approval(
+ session: AgentSession, tool_name: str, tool_input: dict,
+) -> dict:
+ """Send an approval request for a browser sub-agent tool and wait for the decision."""
+ request_id = uuid4().hex
+ approval_req = ApprovalRequest(
+ id=request_id,
+ session_id=session.id,
+ tool_name=tool_name,
+ tool_input=tool_input,
+ )
+ session.pending_approvals.append(approval_req)
+ session.status = "waiting_approval"
+
+ await ws_manager.send_to_session(session.id, "agent:status", {
+ "session_id": session.id,
+ "status": "waiting_approval",
+ })
+
+ decision = await ws_manager.send_approval_request(
+ session.id, request_id, tool_name, tool_input,
+ )
+
+ session.pending_approvals = [
+ a for a in session.pending_approvals if a.id != request_id
+ ]
+ session.status = "running"
+ await ws_manager.send_to_session(session.id, "agent:status", {
+ "session_id": session.id,
+ "status": "running",
+ })
+ return decision
+
+
async def run_browser_agent(
task: str,
browser_id: str,
@@ -188,6 +277,7 @@ async def run_browser_agent(
tab_id: str = "",
pre_selected: bool = False,
initial_url: str | None = None,
+ parent_session_id: str | None = None,
) -> dict:
"""Run a browser sub-agent loop for a single browser card.
@@ -196,6 +286,8 @@ async def run_browser_agent(
"""
from backend.apps.agents.agent_manager import agent_manager
+ _browser_perms = load_builtin_permissions()
+
session_id = uuid4().hex
session = AgentSession(
id=session_id,
@@ -206,6 +298,7 @@ async def run_browser_agent(
dashboard_id=dashboard_id,
browser_id=browser_id,
system_prompt=SYSTEM_PROMPT,
+ parent_session_id=parent_session_id,
)
agent_manager.sessions[session_id] = session
@@ -291,6 +384,48 @@ async def run_browser_agent(
tool_results = []
for tu in tool_uses:
+ policy = _browser_perms.get(tu.name, "always_allow")
+
+ if policy == "deny":
+ denied_text = f"Tool {tu.name} is denied by permission policy."
+ tool_results.append({
+ "type": "tool_result",
+ "tool_use_id": tu.id,
+ "content": [{"type": "text", "text": denied_text}],
+ })
+ result_msg = Message(
+ role="tool_result",
+ content={"text": denied_text, "tool_name": tu.name, "elapsed_ms": 0},
+ )
+ session.messages.append(result_msg)
+ await ws_manager.send_to_session(session_id, "agent:message", {
+ "session_id": session_id,
+ "message": result_msg.model_dump(mode="json"),
+ })
+ continue
+
+ if policy == "ask":
+ decision = await _request_browser_approval(
+ session, tu.name, tu.input,
+ )
+ if decision.get("behavior") == "deny":
+ denied_text = decision.get("message") or f"Tool {tu.name} denied by user."
+ tool_results.append({
+ "type": "tool_result",
+ "tool_use_id": tu.id,
+ "content": [{"type": "text", "text": denied_text}],
+ })
+ result_msg = Message(
+ role="tool_result",
+ content={"text": denied_text, "tool_name": tu.name, "elapsed_ms": 0},
+ )
+ session.messages.append(result_msg)
+ await ws_manager.send_to_session(session_id, "agent:message", {
+ "session_id": session_id,
+ "message": result_msg.model_dump(mode="json"),
+ })
+ continue
+
start = time.time()
result = await execute_browser_tool(
tu.name, tu.input, browser_id, tab_id,
@@ -407,6 +542,8 @@ async def _create_browser_card(dashboard_id: str, url: str) -> str:
activeTabId=tab_id,
x=40,
y=100,
+ width=1280,
+ height=800,
)
dashboard.layout.browser_cards[browser_id] = card
dashboard.updated_at = datetime.now()
@@ -425,6 +562,7 @@ async def run_browser_agents(
api_key: str,
dashboard_id: str | None = None,
pre_selected_browser_ids: list[str] | None = None,
+ parent_session_id: str | None = None,
) -> list[dict]:
"""Run multiple browser sub-agents in parallel.
@@ -451,6 +589,7 @@ async def run_browser_agents(
dashboard_id=dashboard_id,
pre_selected=is_pre_selected,
initial_url=url if url and browser_id not in pre_selected else None,
+ parent_session_id=parent_session_id,
)
results = await asyncio.gather(*[_run_one(t) for t in tasks], return_exceptions=True)
diff --git a/backend/apps/agents/browser_agent_mcp_server.py b/backend/apps/agents/browser_agent_mcp_server.py
index 2a46a139..0f7f4b6b 100644
--- a/backend/apps/agents/browser_agent_mcp_server.py
+++ b/backend/apps/agents/browser_agent_mcp_server.py
@@ -25,26 +25,20 @@ BACKEND_URL = f"http://127.0.0.1:{BACKEND_PORT}/api/browser-agent/run"
MODEL = os.environ.get("OPENSWARM_AGENT_MODEL", "sonnet")
DASHBOARD_ID = os.environ.get("OPENSWARM_DASHBOARD_ID", "")
PRE_SELECTED_BROWSER_IDS = os.environ.get("OPENSWARM_PRE_SELECTED_BROWSER_IDS", "")
+PARENT_SESSION_ID = os.environ.get("OPENSWARM_PARENT_SESSION_ID", "")
TOOLS = [
{
- "name": "BrowserAgent",
+ "name": "CreateBrowserAgent",
"description": (
- "Delegate a browser task to a dedicated browser agent. The browser agent "
+ "Create a new browser card and run a task on it. A dedicated browser agent "
"will autonomously perform the task (navigating, clicking, typing, etc.) "
"and return a summary of actions taken plus a final screenshot. "
- "Use this for any task that requires interacting with a web page."
+ "Use this when you need a fresh browser for a new task."
),
"inputSchema": {
"type": "object",
"properties": {
- "browser_id": {
- "type": "string",
- "description": (
- "The ID of the browser card to use. If omitted, a new browser "
- "card will be automatically created."
- ),
- },
"task": {
"type": "string",
"description": (
@@ -55,20 +49,47 @@ TOOLS = [
"url": {
"type": "string",
"description": (
- "Optional starting URL. If provided and no browser_id is given, "
- "the new browser will navigate here first."
+ "Optional starting URL. The new browser will navigate here "
+ "before beginning the task."
),
},
},
"required": ["task"],
},
},
+ {
+ "name": "BrowserAgent",
+ "description": (
+ "Delegate a browser task to a dedicated browser agent on an existing "
+ "browser card. The browser agent will autonomously perform the task "
+ "(navigating, clicking, typing, etc.) and return a summary of actions "
+ "taken plus a final screenshot."
+ ),
+ "inputSchema": {
+ "type": "object",
+ "properties": {
+ "browser_id": {
+ "type": "string",
+ "description": "The ID of the existing browser card to use.",
+ },
+ "task": {
+ "type": "string",
+ "description": (
+ "The task for the browser agent to perform. Be specific and "
+ "detailed about what you want accomplished."
+ ),
+ },
+ },
+ "required": ["browser_id", "task"],
+ },
+ },
{
"name": "BrowserAgents",
"description": (
- "Delegate multiple browser tasks to run in parallel, each on a different "
- "browser. All tasks execute concurrently and results are returned together. "
- "Use this when you need to perform tasks on multiple web pages simultaneously."
+ "Delegate multiple browser tasks to run in parallel, each on an existing "
+ "browser card. All tasks execute concurrently and results are returned "
+ "together. Use this when you need to perform tasks on multiple web pages "
+ "simultaneously."
),
"inputSchema": {
"type": "object",
@@ -81,18 +102,14 @@ TOOLS = [
"properties": {
"browser_id": {
"type": "string",
- "description": "Optional browser card ID. If omitted, a new browser will be created.",
+ "description": "The ID of the existing browser card to use.",
},
"task": {
"type": "string",
"description": "The task for this browser agent.",
},
- "url": {
- "type": "string",
- "description": "Optional starting URL.",
- },
},
- "required": ["task"],
+ "required": ["browser_id", "task"],
},
},
},
@@ -119,6 +136,7 @@ def call_backend(tasks: list[dict]) -> dict:
"model": MODEL,
"dashboard_id": DASHBOARD_ID,
"pre_selected_browser_ids": pre_selected,
+ "parent_session_id": PARENT_SESSION_ID,
}).encode()
req = urllib.request.Request(
BACKEND_URL,
@@ -219,10 +237,10 @@ def format_batch_results(results: list[dict]) -> dict:
def handle_tool_call(tool_name: str, arguments: dict) -> dict:
- if tool_name == "BrowserAgent":
+ if tool_name == "CreateBrowserAgent":
task_def = {
"task": arguments.get("task", ""),
- "browser_id": arguments.get("browser_id", ""),
+ "browser_id": "",
"url": arguments.get("url", ""),
}
result = call_backend([task_def])
@@ -233,10 +251,30 @@ def handle_tool_call(tool_name: str, arguments: dict) -> dict:
return format_result(results[0])
return {"content": [{"type": "text", "text": "No result returned."}], "isError": True}
+ elif tool_name == "BrowserAgent":
+ browser_id = arguments.get("browser_id", "")
+ if not browser_id:
+ return {"content": [{"type": "text", "text": "Error: browser_id is required"}], "isError": True}
+ task_def = {
+ "task": arguments.get("task", ""),
+ "browser_id": browser_id,
+ "url": "",
+ }
+ result = call_backend([task_def])
+ if "error" in result:
+ return {"content": [{"type": "text", "text": f"Error: {result['error']}"}], "isError": True}
+ results = result.get("results", [result])
+ if results:
+ return format_result(results[0])
+ return {"content": [{"type": "text", "text": "No result returned."}], "isError": True}
+
elif tool_name == "BrowserAgents":
tasks = arguments.get("tasks", [])
if not tasks:
return {"content": [{"type": "text", "text": "Error: tasks array is empty"}], "isError": True}
+ for t in tasks:
+ if not t.get("browser_id"):
+ return {"content": [{"type": "text", "text": "Error: browser_id is required for each task"}], "isError": True}
result = call_backend(tasks)
if "error" in result:
return {"content": [{"type": "text", "text": f"Error: {result['error']}"}], "isError": True}
diff --git a/backend/apps/agents/browser_mcp_server.py b/backend/apps/agents/browser_mcp_server.py
index f32054c2..86f1ad5e 100644
--- a/backend/apps/agents/browser_mcp_server.py
+++ b/backend/apps/agents/browser_mcp_server.py
@@ -181,6 +181,58 @@ TOOLS = [
"required": ["browser_id"],
},
},
+ {
+ "name": "BrowserScroll",
+ "description": (
+ "Scroll the page up or down. Automatically finds the correct scrollable "
+ "container (works on SPAs like Notion, Gmail, etc. that use nested scroll "
+ "containers instead of window-level scrolling). Returns scroll position info "
+ "including whether top/bottom has been reached."
+ ),
+ "inputSchema": {
+ "type": "object",
+ "properties": {
+ "browser_id": {
+ "type": "string",
+ "description": "The browser card ID.",
+ },
+ "tab_id": TAB_ID_PROP,
+ "direction": {
+ "type": "string",
+ "enum": ["up", "down"],
+ "description": "Scroll direction. Defaults to 'down'.",
+ },
+ "amount": {
+ "type": "number",
+ "description": "Pixels to scroll. Defaults to 500.",
+ },
+ },
+ "required": ["browser_id"],
+ },
+ },
+ {
+ "name": "BrowserWait",
+ "description": (
+ "Wait for a specified duration. Useful after navigation or actions that "
+ "trigger page loads, animations, or async content rendering. "
+ "Min 100ms, max 10000ms."
+ ),
+ "inputSchema": {
+ "type": "object",
+ "properties": {
+ "browser_id": {
+ "type": "string",
+ "description": "The browser card ID.",
+ },
+ "tab_id": TAB_ID_PROP,
+ "milliseconds": {
+ "type": "number",
+ "description": "Duration to wait in milliseconds. Defaults to 1000.",
+ },
+ },
+ "required": ["browser_id"],
+ },
+ },
]
@@ -260,6 +312,8 @@ def handle_tool_call(tool_name: str, arguments: dict) -> dict:
"BrowserType": "type",
"BrowserEvaluate": "evaluate",
"BrowserGetElements": "get_elements",
+ "BrowserScroll": "scroll",
+ "BrowserWait": "wait",
}
action = action_map.get(tool_name)
if not action:
diff --git a/backend/apps/agents/invoke_agent_mcp_server.py b/backend/apps/agents/invoke_agent_mcp_server.py
new file mode 100644
index 00000000..cf614b03
--- /dev/null
+++ b/backend/apps/agents/invoke_agent_mcp_server.py
@@ -0,0 +1,160 @@
+#!/usr/bin/env python3
+"""
+Stdio MCP server that exposes the InvokeAgent tool.
+
+Launched as a subprocess by the Claude Agent SDK. Proxies invocation
+requests to the OpenSwarm backend via HTTP, which forks the target
+agent session and runs it with the new message.
+"""
+
+import json
+import sys
+import os
+import urllib.request
+import urllib.error
+
+BACKEND_PORT = os.environ.get("OPENSWARM_PORT", "8324")
+BACKEND_URL = f"http://127.0.0.1:{BACKEND_PORT}/api/invoke-agent/run"
+PARENT_SESSION_ID = os.environ.get("OPENSWARM_PARENT_SESSION_ID", "")
+DASHBOARD_ID = os.environ.get("OPENSWARM_DASHBOARD_ID", "")
+
+TOOLS = [
+ {
+ "name": "InvokeAgent",
+ "description": (
+ "Invoke a copy of an existing agent session with a new message. "
+ "The invoked agent will have full context of its prior conversation "
+ "and will process the new message independently. Use this when you "
+ "need to query another agent about its prior work or ask it to "
+ "perform a follow-up task."
+ ),
+ "inputSchema": {
+ "type": "object",
+ "properties": {
+ "session_id": {
+ "type": "string",
+ "description": (
+ "The session ID of the agent to invoke. This is the ID "
+ "from a selected Agent Card in the context."
+ ),
+ },
+ "message": {
+ "type": "string",
+ "description": (
+ "The message to send to the invoked agent. Be specific "
+ "about what you need from it."
+ ),
+ },
+ },
+ "required": ["session_id", "message"],
+ },
+ },
+]
+
+
+def send_response(id_, result=None, error=None):
+ msg = {"jsonrpc": "2.0", "id": id_}
+ if error is not None:
+ msg["error"] = error
+ else:
+ msg["result"] = result
+ sys.stdout.write(json.dumps(msg) + "\n")
+ sys.stdout.flush()
+
+
+def call_backend(session_id: str, message: str) -> dict:
+ payload = json.dumps({
+ "session_id": session_id,
+ "message": message,
+ "parent_session_id": PARENT_SESSION_ID,
+ "dashboard_id": DASHBOARD_ID,
+ }).encode()
+ req = urllib.request.Request(
+ BACKEND_URL,
+ data=payload,
+ headers={"Content-Type": "application/json"},
+ method="POST",
+ )
+ try:
+ with urllib.request.urlopen(req, timeout=600) as resp:
+ return json.loads(resp.read().decode())
+ except urllib.error.HTTPError as e:
+ body = e.read().decode() if e.fp else str(e)
+ return {"error": f"HTTP {e.code}: {body}"}
+ except Exception as e:
+ return {"error": str(e)}
+
+
+def handle_tool_call(tool_name: str, arguments: dict) -> dict:
+ if tool_name != "InvokeAgent":
+ return {"content": [{"type": "text", "text": f"Unknown tool: {tool_name}"}], "isError": True}
+
+ session_id = arguments.get("session_id", "")
+ message = arguments.get("message", "")
+
+ if not session_id:
+ return {"content": [{"type": "text", "text": "Error: session_id is required"}], "isError": True}
+ if not message:
+ return {"content": [{"type": "text", "text": "Error: message is required"}], "isError": True}
+
+ result = call_backend(session_id, message)
+
+ if "error" in result:
+ return {"content": [{"type": "text", "text": f"Error: {result['error']}"}], "isError": True}
+
+ forked_id = result.get("forked_session_id", "")
+ response = result.get("response", "No response from invoked agent.")
+ cost = result.get("cost_usd", 0)
+ source_name = result.get("source_name", "")
+
+ lines = [f"**Invoked Agent Result** (forked session: {forked_id})"]
+ if source_name:
+ lines[0] = f"**Invoked Agent Result** — {source_name} (forked session: {forked_id})"
+ if cost > 0:
+ lines.append(f"*Cost: ${cost:.4f}*")
+ lines.append("")
+ lines.append(response)
+
+ return {"content": [{"type": "text", "text": "\n".join(lines)}]}
+
+
+def main():
+ for line in sys.stdin:
+ line = line.strip()
+ if not line:
+ continue
+ try:
+ msg = json.loads(line)
+ except json.JSONDecodeError:
+ continue
+
+ method = msg.get("method")
+ id_ = msg.get("id")
+ params = msg.get("params", {})
+
+ if method == "initialize":
+ send_response(id_, {
+ "protocolVersion": "2024-11-05",
+ "capabilities": {"tools": {}},
+ "serverInfo": {
+ "name": "openswarm-invoke-agent",
+ "version": "1.0.0",
+ },
+ })
+ elif method == "notifications/initialized":
+ pass
+ elif method == "tools/list":
+ send_response(id_, {"tools": TOOLS})
+ elif method == "tools/call":
+ tool_name = params.get("name", "")
+ arguments = params.get("arguments", {})
+ result = handle_tool_call(tool_name, arguments)
+ send_response(id_, result)
+ elif method == "ping":
+ send_response(id_, {})
+ elif id_ is not None:
+ send_response(id_, error={"code": -32601, "message": f"Method not found: {method}"})
+
+
+if __name__ == "__main__":
+ main()
diff --git a/backend/apps/agents/models.py b/backend/apps/agents/models.py
index a5f03df3..948a007c 100644
--- a/backend/apps/agents/models.py
+++ b/backend/apps/agents/models.py
@@ -37,6 +37,7 @@ class Message(BaseModel):
attached_skills: Optional[list[dict]] = None
forced_tools: Optional[list[str]] = None
images: Optional[list[dict]] = None
+ hidden: bool = False
class MessageBranch(BaseModel):
id: str = Field(default_factory=lambda: uuid4().hex)
@@ -72,3 +73,4 @@ class AgentSession(BaseModel):
tool_group_meta: dict[str, "ToolGroupMeta"] = Field(default_factory=dict)
dashboard_id: Optional[str] = None
browser_id: Optional[str] = None
+ parent_session_id: Optional[str] = None
diff --git a/backend/apps/dashboards/models.py b/backend/apps/dashboards/models.py
index b6cd6bef..74fc4ee8 100644
--- a/backend/apps/dashboards/models.py
+++ b/backend/apps/dashboards/models.py
@@ -34,8 +34,8 @@ class BrowserCardPosition(BaseModel):
activeTabId: str = ""
x: float = 0
y: float = 0
- width: float = 640
- height: float = 480
+ width: float = 1280
+ height: float = 800
class DashboardLayout(BaseModel):
diff --git a/backend/apps/modes/models.py b/backend/apps/modes/models.py
index 03c201fb..0afc742c 100644
--- a/backend/apps/modes/models.py
+++ b/backend/apps/modes/models.py
@@ -76,43 +76,28 @@ BUILTIN_MODES: list[Mode] = [
),
Mode(
id="view-builder",
- name="View Builder",
- description="Create and iterate on reusable View artifacts.",
+ name="App Builder",
+ description="Create and iterate on reusable App artifacts.",
system_prompt=(
- "You are helping the user build a reusable View — a self-contained "
- "web app rendered in an iframe.\n\n"
- "Your working directory is a dedicated workspace folder for this view. "
- "You can create any file structure you need using the Write tool.\n\n"
- "## Required files\n\n"
- "1. **index.html** — The entry point. A complete HTML document. "
- "React 18 is available via esm.sh CDN imports:\n"
- ' \n'
- " The structured input data is available at `window.OUTPUT_INPUT` (object) "
- "and any server-side result at `window.OUTPUT_BACKEND_RESULT`.\n\n"
- "2. **schema.json** — A JSON Schema object defining the structured input "
- "the view accepts. Example:\n"
- ' {"type":"object","properties":{"name":{"type":"string"}},"required":["name"]}\n\n'
- "3. **meta.json** — Metadata for this view. Always write this file with "
- "a short name and one-sentence description. Example:\n"
- ' {"name":"Sales Dashboard","description":"Interactive dashboard showing sales metrics"}\n\n'
- "## Optional files\n\n"
- "- **backend.py** — Python code that receives `input_data` as "
- "a global dict and must assign its result to a global `result` dict.\n"
- "- **Any additional files** — You can create subdirectories and split code "
- "across multiple files. For example:\n"
- " - `components/Chart.js` — Reusable components\n"
- " - `utils/helpers.js` — Utility functions\n"
- " - `styles/main.css` — Stylesheets\n\n"
- "Files are served from the workspace, so relative imports work naturally:\n"
- ' ``\n'
- ' ` `\n'
- " `import { helper } from './utils/helpers.js'` (in ES modules)\n\n"
- "## Guidelines\n\n"
- "Write files immediately when you have code ready. The user can see "
- "a live preview that auto-refreshes from these files. Always write the "
- "complete file content (do not use Edit for partial patches on first creation). "
- "For complex views, split code into separate files to keep things organized."
+ "You are an App Builder — an AI assistant that creates self-contained "
+ "web apps rendered in an iframe preview.\n\n"
+ "Your working directory is a dedicated workspace folder pre-seeded with "
+ "template files. Read the existing files before making changes.\n\n"
+ "## Critical rules\n\n"
+ "- The entry point MUST be named `index.html`. Never rename it or create "
+ "a different HTML file as the main entry point.\n"
+ "- Write files immediately when you have code ready — the user sees a "
+ "live preview that auto-refreshes from these files.\n"
+ "- Always write the complete file content on first creation (do not use "
+ "Edit for partial patches on new files).\n"
+ "- For complex apps, split code into separate files (JS, CSS, etc.) "
+ "and reference them from index.html with relative paths.\n"
+ "- Always update meta.json with a short name and one-sentence description.\n"
+ "- Build beautiful, polished UIs with modern design — dark themes, smooth "
+ "transitions, proper spacing, and responsive layouts.\n\n"
+ "Read the SKILL.md reference in your workspace for the full technical "
+ "specification of the App platform (available globals, file conventions, "
+ "schema format, backend.py usage, and examples)."
),
tools=None,
default_next_mode=None,
diff --git a/backend/apps/modes/modes.py b/backend/apps/modes/modes.py
index 6d393143..37aabd90 100644
--- a/backend/apps/modes/modes.py
+++ b/backend/apps/modes/modes.py
@@ -59,7 +59,8 @@ def load_mode(mode_id: str) -> Mode | None:
@modes.router.get("/list")
async def list_modes():
- return {"modes": [m.model_dump() for m in _load_all()]}
+ builtin_defaults = {m.id: m.model_dump() for m in BUILTIN_MODES}
+ return {"modes": [m.model_dump() for m in _load_all()], "builtin_defaults": builtin_defaults}
@modes.router.get("/{mode_id}")
@@ -93,6 +94,16 @@ async def update_mode(mode_id: str, body: ModeUpdate):
return {"ok": True, "mode": mode.model_dump()}
+@modes.router.post("/{mode_id}/reset")
+async def reset_mode(mode_id: str):
+ """Reset a built-in mode to its hardcoded defaults."""
+ builtin = next((m for m in BUILTIN_MODES if m.id == mode_id), None)
+ if not builtin:
+ raise HTTPException(status_code=400, detail="Only built-in modes can be reset")
+ _save(builtin)
+ return {"ok": True, "mode": builtin.model_dump()}
+
+
@modes.router.delete("/{mode_id}")
async def delete_mode(mode_id: str):
mode = _load(mode_id)
diff --git a/backend/apps/outputs/outputs.py b/backend/apps/outputs/outputs.py
index 206e29e8..22b3bdf7 100644
--- a/backend/apps/outputs/outputs.py
+++ b/backend/apps/outputs/outputs.py
@@ -15,6 +15,7 @@ from backend.apps.outputs.models import (
WorkspaceSeedRequest,
)
from backend.apps.outputs.executor import execute_backend_code
+from backend.apps.outputs.view_builder_templates import VIEW_BUILDER_SKILL, VIEW_TEMPLATE_FILES
from backend.apps.settings.settings import load_settings
logger = logging.getLogger(__name__)
@@ -235,6 +236,14 @@ async def seed_workspace(body: WorkspaceSeedRequest):
os.makedirs(os.path.dirname(full_path), exist_ok=True)
with open(full_path, "w") as f:
f.write(content)
+ else:
+ for rel_path, content in VIEW_TEMPLATE_FILES.items():
+ full_path = os.path.join(folder, rel_path)
+ with open(full_path, "w") as f:
+ f.write(content)
+
+ with open(os.path.join(folder, "SKILL.md"), "w") as f:
+ f.write(VIEW_BUILDER_SKILL)
if body.meta:
with open(os.path.join(folder, "meta.json"), "w") as f:
diff --git a/backend/apps/outputs/view_builder_skill.md b/backend/apps/outputs/view_builder_skill.md
new file mode 100644
index 00000000..1e78377d
--- /dev/null
+++ b/backend/apps/outputs/view_builder_skill.md
@@ -0,0 +1,223 @@
+# App Builder — Platform Reference
+
+You are building an **App**: a self-contained web app served in an iframe.
+The workspace you're working in is the source of truth — every file you write
+here is served directly to the live preview.
+
+---
+
+## File conventions
+
+| File | Required | Purpose |
+|------|----------|---------|
+| `index.html` | **Yes** | Entry point. Must be a complete HTML document. This is the ONLY file the preview iframe loads — never rename it. |
+| `meta.json` | **Yes** | `{"name":"…","description":"…"}` — displayed in the UI header. Always write this. |
+| `schema.json` | Recommended | JSON Schema defining the input form (the "Test Input" tab). |
+| `backend.py` | Optional | Server-side Python executed before rendering. |
+| Everything else | Optional | JS, CSS, images, subdirectories — referenced from `index.html` via relative paths. |
+
+### ⚠️ Do NOT
+
+- Name the main HTML file anything other than `index.html` — the platform
+ will not find it and the preview will be blank.
+- Use `document.write()` — it breaks the injected data globals.
+- Assume any external server or API is available unless the user provides one.
+
+---
+
+## Injected globals
+
+Before `index.html` loads, the platform injects two globals:
+
+```javascript
+window.OUTPUT_INPUT // Object — structured input from the schema form
+window.OUTPUT_BACKEND_RESULT // Object | null — result from backend.py execution
+```
+
+These are available immediately in any `
+```
+
+ES module imports between JS files:
+
+```javascript
+// components/Chart.js
+import { formatNumber } from '../utils/helpers.js';
+```
+
+---
+
+## Using React
+
+React 18 is available via esm.sh CDN — no build step needed:
+
+```html
+
+
+
+```
+
+Other CDN libraries work too — use `https://esm.sh/` or `https://cdn.jsdelivr.net/npm/` for any npm package.
+
+---
+
+## Design guidelines
+
+- **Dark theme by default** — use dark backgrounds (#0f1117, #1a1d27) with
+ light text (#e2e8f0) unless the user requests otherwise.
+- **Modern aesthetics** — rounded corners (8-12px), subtle borders, box shadows,
+ smooth transitions (0.15-0.3s ease).
+- **Responsive** — use flexbox/grid, test at different sizes.
+- **Typography** — system font stack for UI, monospace for code/data.
+- **Color accents** — use a single accent color with variations for hover/active states.
+- **Spacing** — consistent padding (12-20px), adequate whitespace between sections.
+- **Interactivity** — hover effects, focus states, loading indicators where appropriate.
+
+---
+
+## Complete minimal example
+
+```html
+
+
+
+
+
+ My App
+
+
+
+
+
+
+
+```
diff --git a/backend/apps/outputs/view_builder_templates.py b/backend/apps/outputs/view_builder_templates.py
new file mode 100644
index 00000000..0aada357
--- /dev/null
+++ b/backend/apps/outputs/view_builder_templates.py
@@ -0,0 +1,74 @@
+"""Default template files seeded into new App Builder workspaces."""
+
+import os
+
+_SKILL_PATH = os.path.join(os.path.dirname(__file__), "view_builder_skill.md")
+
+with open(_SKILL_PATH) as _f:
+ VIEW_BUILDER_SKILL = _f.read()
+
+VIEW_TEMPLATE_INDEX = """\
+
+
+
+
+
+ App
+
+
+
+
+
Ready
+
Describe what you want to build and the agent will update this app.
+
+
+
+
+"""
+
+VIEW_TEMPLATE_SCHEMA = """\
+{
+ "type": "object",
+ "properties": {},
+ "required": []
+}
+"""
+
+VIEW_TEMPLATE_META = """\
+{
+ "name": "",
+ "description": ""
+}
+"""
+
+VIEW_TEMPLATE_FILES = {
+ "index.html": VIEW_TEMPLATE_INDEX,
+ "schema.json": VIEW_TEMPLATE_SCHEMA,
+ "meta.json": VIEW_TEMPLATE_META,
+}
diff --git a/backend/apps/settings/models.py b/backend/apps/settings/models.py
index 6030e1ab..34a589df 100644
--- a/backend/apps/settings/models.py
+++ b/backend/apps/settings/models.py
@@ -29,3 +29,8 @@ class AppSettings(BaseModel):
deepgram_api_key: Optional[str] = None
openai_api_key: Optional[str] = None
webhook_base_url: Optional[str] = None
+ # Dashboard / UI preferences
+ auto_select_mode_on_new_agent: bool = False
+ expand_new_chats_in_dashboard: bool = False
+ auto_reveal_sub_agents: bool = True
+ dev_mode: bool = False
diff --git a/backend/apps/tools_lib/models.py b/backend/apps/tools_lib/models.py
index 3c0cc24e..857ccc3a 100644
--- a/backend/apps/tools_lib/models.py
+++ b/backend/apps/tools_lib/models.py
@@ -5,6 +5,7 @@ from uuid import uuid4
class BuiltinTool(BaseModel):
name: str
+ display_name: Optional[str] = None
description: str
category: str = "filesystem"
deferred: bool = False
@@ -33,6 +34,23 @@ BUILTIN_TOOLS: list[BuiltinTool] = [
BuiltinTool(name="CronList", description="List all scheduled tasks", category="scheduling", deferred=True),
BuiltinTool(name="CronDelete", description="Delete a scheduled task", category="scheduling", deferred=True),
BuiltinTool(name="RenderOutput", description="Render a reusable View artifact with structured input data", category="views", deferred=True),
+ # Agent tools
+ BuiltinTool(name="Agent", display_name="CreateAgent", description="Spawn a sub-agent to handle a complex subtask", category="agents"),
+ BuiltinTool(name="InvokeAgent", description="Invoke a copy of an existing agent with a new message, preserving full conversation context", category="agents"),
+ # Browser delegation tools (Layer 1 — what the main agent calls)
+ BuiltinTool(name="CreateBrowserAgent", description="Create a new browser and run a task on it", category="browser_delegation"),
+ BuiltinTool(name="BrowserAgent", description="Delegate a browser task to an existing browser agent", category="browser_delegation"),
+ BuiltinTool(name="BrowserAgents", description="Run multiple browser tasks in parallel on existing browsers", category="browser_delegation"),
+ # Browser action tools (Layer 2 — what the sub-agent executes)
+ BuiltinTool(name="BrowserScreenshot", description="Capture a screenshot of the browser page", category="browser_action"),
+ BuiltinTool(name="BrowserNavigate", description="Navigate the browser to a URL", category="browser_action"),
+ BuiltinTool(name="BrowserClick", description="Click an element by CSS selector", category="browser_action"),
+ BuiltinTool(name="BrowserType", description="Type text into an input element", category="browser_action"),
+ BuiltinTool(name="BrowserEvaluate", description="Execute JavaScript in the browser", category="browser_action"),
+ BuiltinTool(name="BrowserGetText", description="Get visible text content of the page", category="browser_action"),
+ BuiltinTool(name="BrowserGetElements", description="List interactive elements with CSS selectors", category="browser_action"),
+ BuiltinTool(name="BrowserScroll", description="Scroll the page up or down", category="browser_action"),
+ BuiltinTool(name="BrowserWait", description="Wait for page loads or animations", category="browser_action"),
]
diff --git a/backend/apps/tools_lib/tools_lib.py b/backend/apps/tools_lib/tools_lib.py
index f19add53..0abb4bf7 100644
--- a/backend/apps/tools_lib/tools_lib.py
+++ b/backend/apps/tools_lib/tools_lib.py
@@ -18,9 +18,11 @@ from backend.apps.tools_lib.models import ToolDefinition, ToolCreate, ToolUpdate
logger = logging.getLogger(__name__)
-from backend.config.paths import BACKEND_DIR, TOOLS_DIR as DATA_DIR, BUILTIN_PERMISSIONS_PATH as BUILTIN_PERMS_PATH
+from backend.config.paths import BACKEND_DIR, DATA_ROOT, TOOLS_DIR as DATA_DIR, BUILTIN_PERMISSIONS_PATH as BUILTIN_PERMS_PATH
load_dotenv(os.path.join(BACKEND_DIR, ".env"))
+if os.environ.get("OPENSWARM_PACKAGED") == "1":
+ load_dotenv(os.path.join(os.path.dirname(DATA_ROOT), ".env"), override=True)
@asynccontextmanager
@@ -380,6 +382,7 @@ def derive_mcp_config(tool: ToolDefinition) -> Optional[dict]:
config["command"] = resolved
env = config.setdefault("env", {})
env.setdefault("PATH", _augmented_path())
+ env.setdefault("PYTHONPATH", "")
return config
@@ -510,7 +513,7 @@ async def _discover_mcp_tools_http(url: str, headers: dict | None = None) -> lis
raise HTTPException(status_code=502, detail="Empty response from MCP server")
tools_list = data.get("result", {}).get("tools", [])
- return [{"name": t.get("name", ""), "description": t.get("description", "")} for t in tools_list]
+ return [{"name": t.get("name", ""), "description": t.get("description", ""), "inputSchema": t.get("inputSchema")} for t in tools_list]
async def _discover_mcp_tools_sse(url: str, headers: dict | None = None) -> list[dict]:
@@ -533,7 +536,7 @@ async def _discover_mcp_tools_sse(url: str, headers: dict | None = None) -> list
) as session:
await session.initialize()
result = await session.list_tools()
- return [{"name": t.name, "description": t.description or ""} for t in result.tools]
+ return [{"name": t.name, "description": t.description or "", "inputSchema": t.inputSchema if t.inputSchema else None} for t in result.tools]
except BaseExceptionGroup as eg:
first = eg.exceptions[0] if eg.exceptions else eg
raise HTTPException(status_code=502, detail=f"SSE discovery failed: {first}") from first
@@ -546,6 +549,7 @@ async def _discover_mcp_tools_stdio(command: str, args: list[str] | None = None,
raise HTTPException(status_code=400, detail=f"Command '{command}' not found on PATH or common install locations")
proc_env = {**os.environ, **(env or {}), "PATH": _augmented_path()}
+ proc_env.pop("PYTHONPATH", None)
proc = await asyncio.create_subprocess_exec(
cmd_path, *(args or []),
@@ -601,7 +605,7 @@ async def _discover_mcp_tools_stdio(command: str, args: list[str] | None = None,
data = await _recv()
tools_list = data.get("result", {}).get("tools", [])
- return [{"name": t.get("name", ""), "description": t.get("description", "")} for t in tools_list]
+ return [{"name": t.get("name", ""), "description": t.get("description", ""), "inputSchema": t.get("inputSchema")} for t in tools_list]
except HTTPException:
raise
@@ -616,12 +620,34 @@ async def _discover_mcp_tools_stdio(command: str, args: list[str] | None = None,
proc.terminate()
await asyncio.wait_for(proc.wait(), timeout=5.0)
except Exception:
- proc.kill()
+ try:
+ proc.kill()
+ except Exception:
+ pass
@tools_lib.router.post("/{tool_id}/discover")
async def discover_tools(tool_id: str):
tool = _load(tool_id)
+
+ if tool.auth_type == "oauth2" and tool.auth_status == "connected":
+ refreshed = await refresh_google_token(tool)
+ if not refreshed and tool.oauth_tokens.get("access_token"):
+ expiry = tool.oauth_tokens.get("token_expiry", 0)
+ if time.time() >= expiry - 60:
+ client_id = os.environ.get("GOOGLE_OAUTH_CLIENT_ID", "")
+ if not client_id:
+ raise HTTPException(
+ status_code=400,
+ detail="OAuth token expired and GOOGLE_OAUTH_CLIENT_ID is not set. "
+ "In the packaged app, create ~/.openswarm.env or "
+ "~/Library/Application Support/OpenSwarm/.env with your Google OAuth credentials.",
+ )
+ raise HTTPException(
+ status_code=502,
+ detail="OAuth token expired and refresh failed. Try reconnecting Google.",
+ )
+
config = derive_mcp_config(tool)
if not config:
raise HTTPException(status_code=400, detail="Cannot derive MCP config for tool")
@@ -655,8 +681,11 @@ async def discover_tools(tool_id: str):
except HTTPException:
raise
except Exception as e:
- logger.warning(f"MCP tool discovery failed for {tool.name}: {e}")
- raise HTTPException(status_code=502, detail=f"Discovery failed: {e}")
+ msg = str(e).strip()
+ if not msg:
+ msg = type(e).__name__
+ logger.warning(f"MCP tool discovery failed for {tool.name}: {msg}", exc_info=True)
+ raise HTTPException(status_code=502, detail=f"Discovery failed: {msg}")
services: dict[str, dict[str, list[str]]] = {}
service_groups: dict[str, list[str]] = {}
@@ -681,6 +710,7 @@ async def discover_tools(tool_id: str):
permissions["_services"] = services
permissions["_service_groups"] = service_groups
permissions["_tool_descriptions"] = {t["name"]: t["description"] for t in raw_tools}
+ permissions["_tool_schemas"] = {t["name"]: t.get("inputSchema") for t in raw_tools if t.get("inputSchema")}
tool.tool_permissions = permissions
_save(tool)
diff --git a/backend/main.py b/backend/main.py
index 4e5b45f1..1320084c 100644
--- a/backend/main.py
+++ b/backend/main.py
@@ -1,6 +1,9 @@
+import logging
import os
from uuid import uuid4
+logger = logging.getLogger(__name__)
+
from fastapi.responses import JSONResponse
from fastapi import Request
from backend.config.Apps import MainApp
@@ -133,6 +136,7 @@ async def browser_agent_run(request: Request):
model = body.get("model", "sonnet")
dashboard_id = body.get("dashboard_id", "")
pre_selected_browser_ids = body.get("pre_selected_browser_ids", [])
+ parent_session_id = body.get("parent_session_id", "")
if not tasks:
return JSONResponse({"error": "tasks array is required"}, status_code=400)
@@ -147,10 +151,42 @@ async def browser_agent_run(request: Request):
api_key=settings.anthropic_api_key,
dashboard_id=dashboard_id or None,
pre_selected_browser_ids=pre_selected_browser_ids,
+ parent_session_id=parent_session_id or None,
)
return JSONResponse({"results": results})
+@app.post("/api/invoke-agent/run")
+async def invoke_agent_run(request: Request):
+ """Fork an existing agent session and send it a new message.
+ Called by the invoke_agent_mcp_server stdio subprocess."""
+ body = await request.json()
+ session_id = body.get("session_id", "")
+ message = body.get("message", "")
+ parent_session_id = body.get("parent_session_id", "")
+ dashboard_id = body.get("dashboard_id", "")
+
+ if not session_id:
+ return JSONResponse({"error": "session_id is required"}, status_code=400)
+ if not message:
+ return JSONResponse({"error": "message is required"}, status_code=400)
+
+ try:
+ from backend.apps.agents.agent_manager import agent_manager
+ result = await agent_manager.invoke_agent(
+ source_session_id=session_id,
+ message=message,
+ parent_session_id=parent_session_id or None,
+ dashboard_id=dashboard_id or None,
+ )
+ return JSONResponse(result)
+ except ValueError as e:
+ return JSONResponse({"error": str(e)}, status_code=404)
+ except Exception as e:
+ logger.exception("invoke_agent_run failed")
+ return JSONResponse({"error": str(e)}, status_code=500)
+
+
if __name__ == "__main__":
import argparse
import uvicorn
diff --git a/electron/main.js b/electron/main.js
index d5f79a99..c209718e 100644
--- a/electron/main.js
+++ b/electron/main.js
@@ -1,5 +1,6 @@
-const { app, BrowserWindow, ipcMain, shell } = require('electron');
-const { autoUpdater } = require('electron-updater');
+const { app, components, BrowserWindow, ipcMain, shell, session } = require('electron');
+let autoUpdater;
+try { autoUpdater = require('electron-updater').autoUpdater; } catch (_) {}
const path = require('path');
const { spawn, execFileSync } = require('child_process');
const os = require('os');
@@ -7,9 +8,16 @@ const fs = require('fs');
const getPort = require('get-port');
const http = require('http');
+app.commandLine.appendSwitch('disable-features', 'HardwareMediaKeyHandling');
+app.commandLine.appendSwitch('ignore-gpu-blocklist');
+app.commandLine.appendSwitch('enable-gpu-rasterization');
+app.commandLine.appendSwitch('enable-zero-copy');
+app.commandLine.appendSwitch('autoplay-policy', 'no-user-gesture-required');
+
let mainWindow = null;
let backendProcess = null;
let backendPort = null;
+let cachedUpdateStatus = { status: 'idle', info: null, error: null };
const isPackaged = app.isPackaged;
const isDev = process.env.ELECTRON_DEV === '1';
@@ -24,9 +32,10 @@ const iconPath = path.join(__dirname, 'build', 'icon.png');
function getShellPath() {
if (process.platform !== 'darwin' || isDev) return process.env.PATH || '';
+ // Strategy 1: ask the user's login shell for its PATH
try {
- const shell = process.env.SHELL || '/bin/zsh';
- const result = execFileSync(shell, ['-ilc', 'echo $PATH'], {
+ const userShell = process.env.SHELL || '/bin/zsh';
+ const result = execFileSync(userShell, ['-ilc', 'echo $PATH'], {
encoding: 'utf8',
timeout: 5000,
env: { ...process.env, HOME: os.homedir() },
@@ -35,19 +44,40 @@ function getShellPath() {
if (resolved) return resolved;
} catch (_) { /* fall through */ }
+ // Strategy 2: read macOS system PATH config (/etc/paths + /etc/paths.d/*)
+ const systemPaths = [];
+ try {
+ const base = fs.readFileSync('/etc/paths', 'utf8');
+ for (const line of base.split('\n')) {
+ const p = line.trim();
+ if (p) systemPaths.push(p);
+ }
+ } catch (_) { /* ignore */ }
+ try {
+ const pathsD = '/etc/paths.d';
+ if (fs.existsSync(pathsD)) {
+ for (const file of fs.readdirSync(pathsD).sort()) {
+ const content = fs.readFileSync(path.join(pathsD, file), 'utf8');
+ for (const line of content.split('\n')) {
+ const p = line.trim();
+ if (p) systemPaths.push(p);
+ }
+ }
+ }
+ } catch (_) { /* ignore */ }
+
+ // Strategy 3: well-known user-local bin directories
const home = os.homedir();
const fallbackDirs = [
- path.join(home, '.nvm/versions/node'),
+ path.join(home, '.local/bin'),
path.join(home, '.volta/bin'),
path.join(home, '.fnm/aliases/default/bin'),
path.join(home, '.bun/bin'),
path.join(home, '.cargo/bin'),
- path.join(home, '.local/bin'),
'/opt/homebrew/bin',
'/usr/local/bin',
];
- // For nvm, resolve the current default version dynamically
const nvmDir = path.join(home, '.nvm/versions/node');
try {
if (fs.existsSync(nvmDir)) {
@@ -58,10 +88,14 @@ function getShellPath() {
}
} catch (_) { /* ignore */ }
- const existing = fallbackDirs.filter((d) => {
- try { return fs.statSync(d).isDirectory(); } catch { return false; }
- });
- return [...existing, process.env.PATH || ''].join(':');
+ const seen = new Set();
+ const dirs = [];
+ for (const d of [...fallbackDirs, ...systemPaths, ...(process.env.PATH || '').split(':')]) {
+ if (!d || seen.has(d)) continue;
+ seen.add(d);
+ try { if (fs.statSync(d).isDirectory()) dirs.push(d); } catch { /* skip */ }
+ }
+ return dirs.join(':');
}
function getResourcePath(...segments) {
@@ -190,6 +224,18 @@ function createWindow() {
mainWindow.loadFile(frontendPath);
}
+ mainWindow.webContents.on('will-attach-webview', (_event, webPreferences, _params) => {
+ webPreferences.plugins = true;
+ webPreferences.enableBlinkFeatures = 'EncryptedMedia';
+ });
+
+ mainWindow.webContents.on('will-navigate', (event, url) => {
+ if (isDev && url.startsWith('http://localhost:3000')) return;
+ if (url.startsWith('file://')) return;
+ event.preventDefault();
+ mainWindow.webContents.send('webview-new-window', url, mainWindow.webContents.id);
+ });
+
mainWindow.on('closed', () => {
mainWindow = null;
});
@@ -202,30 +248,36 @@ function sendToRenderer(channel, ...args) {
}
function setupAutoUpdater() {
+ if (!autoUpdater) return;
autoUpdater.autoDownload = false;
autoUpdater.autoInstallOnAppQuit = false;
autoUpdater.on('update-available', (info) => {
console.log(`Update available: ${info.version}`);
+ cachedUpdateStatus = { status: 'available', info, error: null };
sendToRenderer('update-available', info);
});
autoUpdater.on('update-not-available', (info) => {
console.log('App is up to date');
+ cachedUpdateStatus = { status: 'not-available', info, error: null };
sendToRenderer('update-not-available', info);
});
autoUpdater.on('download-progress', (progress) => {
+ cachedUpdateStatus = { status: 'downloading', info: progress, error: null };
sendToRenderer('download-progress', progress);
});
autoUpdater.on('update-downloaded', (info) => {
console.log(`Update downloaded: ${info.version}`);
+ cachedUpdateStatus = { status: 'downloaded', info, error: null };
sendToRenderer('update-downloaded', info);
});
autoUpdater.on('error', (err) => {
console.error('Auto-update error:', err);
+ cachedUpdateStatus = { status: 'error', info: null, error: err?.message || String(err) };
sendToRenderer('update-error', err?.message || String(err));
});
@@ -252,6 +304,68 @@ app.whenReady().then(async () => {
try { app.dock.setIcon(iconPath); } catch (_) {}
}
+ session.defaultSession.setPermissionRequestHandler((_wc, permission, callback) => {
+ const allowed = [
+ 'media', 'mediaKeySystem', 'protected-media-identifier',
+ 'geolocation', 'notifications', 'midi', 'midiSysex',
+ 'clipboard-read', 'clipboard-sanitized-write',
+ 'pointerLock', 'fullscreen', 'idle-detection',
+ ];
+ console.log('Permission request:', permission, '->', allowed.includes(permission) ? 'granted' : 'denied');
+ callback(allowed.includes(permission));
+ });
+ session.defaultSession.setPermissionCheckHandler((_wc, permission) => {
+ const allowed = [
+ 'media', 'mediaKeySystem', 'protected-media-identifier',
+ 'clipboard-read', 'clipboard-sanitized-write',
+ 'pointerLock', 'fullscreen', 'idle-detection',
+ ];
+ return allowed.includes(permission);
+ });
+
+ // Read-only logging for DRM license requests — no modifying interceptors
+ // so the network stack can set Content-Type and other headers normally.
+ session.defaultSession.webRequest.onSendHeaders(
+ { urls: ['*://*/*widevine*license*'] },
+ (details) => {
+ console.log(`[drm-req] ${details.method} ${details.url}`);
+ for (const [k, v] of Object.entries(details.requestHeaders || {})) {
+ if (/content-type|origin|referer|auth|accept/i.test(k)) {
+ console.log(`[drm-req] ${k}: ${v}`);
+ }
+ }
+ },
+ );
+ session.defaultSession.webRequest.onCompleted(
+ { urls: ['*://*/*widevine*', '*://*/*license*'] },
+ (details) => {
+ console.log(`[drm-net] ${details.method} ${details.url} → ${details.statusCode}`);
+ },
+ );
+ session.defaultSession.webRequest.onErrorOccurred(
+ { urls: ['*://*/*widevine*', '*://*/*license*'] },
+ (details) => {
+ console.log(`[drm-net] FAILED ${details.method} ${details.url} → ${details.error}`);
+ },
+ );
+
+ // Wait for the Widevine CDM to be downloaded/ready (CastLabs Component
+ // Updater Service). On first launch this downloads the CDM; subsequent
+ // launches use the cached version.
+ if (components && typeof components.whenReady === 'function') {
+ try {
+ await components.whenReady();
+ console.log('Widevine CDM ready');
+ if (typeof components.status === 'function') {
+ console.log('CDM component status:', JSON.stringify(components.status()));
+ }
+ } catch (err) {
+ console.warn('Widevine CDM not available:', err.message);
+ }
+ } else {
+ console.log('CastLabs components API not available — using standard Electron (no DRM)');
+ }
+
try {
if (isDev) {
backendPort = parseInt(process.env.OPENSWARM_PORT || '8324', 10);
@@ -262,6 +376,13 @@ app.whenReady().then(async () => {
createWindow();
if (!isDev) {
setupAutoUpdater();
+ mainWindow.webContents.on('did-finish-load', () => {
+ if (cachedUpdateStatus.status === 'available') {
+ sendToRenderer('update-available', cachedUpdateStatus.info);
+ } else if (cachedUpdateStatus.status === 'downloaded') {
+ sendToRenderer('update-downloaded', cachedUpdateStatus.info);
+ }
+ });
}
} catch (err) {
console.error('Failed to start:', err);
@@ -269,6 +390,79 @@ app.whenReady().then(async () => {
}
});
+app.on('web-contents-created', (_event, contents) => {
+ contents.setWindowOpenHandler(({ url, disposition }) => {
+ if (disposition === 'foreground-tab' || disposition === 'background-tab') {
+ if (mainWindow && !mainWindow.isDestroyed()) {
+ mainWindow.webContents.send('webview-new-window', url, contents.id);
+ }
+ return { action: 'deny' };
+ }
+
+ return {
+ action: 'allow',
+ overrideBrowserWindowOptions: {
+ parent: mainWindow || undefined,
+ },
+ };
+ });
+
+ contents.on('did-create-window', (childWindow) => {
+ if (mainWindow && !mainWindow.isDestroyed() && !childWindow.isDestroyed()) {
+ childWindow.setParentWindow(mainWindow);
+ }
+ });
+
+ if (contents.getType() === 'webview') {
+ contents.on('console-message', (_e, level, message, line, sourceId) => {
+ if (message.includes('widevine') || message.includes('drm') ||
+ message.includes('license') || message.includes('MediaKeySession') ||
+ message.includes('EME') || message.includes('[drm-diag]') || level >= 2) {
+ const tag = ['LOG', 'INFO', 'WARN', 'ERROR'][level] || 'LOG';
+ const src = sourceId ? sourceId.split('/').pop() : '';
+ console.log(`[webview:${tag}] ${message}${src ? ` (${src}:${line})` : ''}`);
+ }
+ });
+
+ contents.on('dom-ready', () => {
+ const url = contents.getURL();
+ if (url.includes('spotify')) {
+ contents.executeJavaScript(`
+ (function() {
+ const origFetch = window.fetch;
+ window.fetch = async function(...args) {
+ const resp = await origFetch.apply(this, args);
+ const url = typeof args[0] === 'string' ? args[0] : args[0]?.url || '';
+ if (url.includes('widevine-license') && !resp.ok) {
+ const clone = resp.clone();
+ try {
+ const text = await clone.text();
+ console.log('[drm-diag] License response ' + resp.status + ': ' + text.substring(0, 500));
+ } catch(e) {}
+ }
+ return resp;
+ };
+
+ // Check EME availability
+ if (navigator.requestMediaKeySystemAccess) {
+ navigator.requestMediaKeySystemAccess('com.widevine.alpha', [{
+ initDataTypes: ['cenc'],
+ audioCapabilities: [{contentType: 'audio/mp4; codecs="mp4a.40.2"'}],
+ }]).then(function(access) {
+ console.log('[drm-diag] Widevine EME access: ' + access.keySystem);
+ }).catch(function(err) {
+ console.log('[drm-diag] Widevine EME FAILED: ' + err.message);
+ });
+ } else {
+ console.log('[drm-diag] EME API not available');
+ }
+ })();
+ `).catch(() => {});
+ }
+ });
+ }
+});
+
app.on('window-all-closed', () => {
if (!isDev) killBackend();
app.quit();
@@ -286,9 +480,14 @@ app.on('activate', () => {
ipcMain.handle('get-backend-port', () => backendPort);
ipcMain.handle('get-app-version', () => app.getVersion());
+ipcMain.handle('get-webview-preload-path', () => {
+ return `file://${path.join(__dirname, 'webview-preload.js')}`;
+});
+
+ipcMain.handle('get-update-status', () => cachedUpdateStatus);
ipcMain.handle('check-for-updates', async () => {
- if (!isPackaged) {
+ if (!autoUpdater || !isPackaged) {
sendToRenderer('update-error', 'Update check is only available in the packaged app.');
return { success: false, error: 'Not packaged' };
}
@@ -305,6 +504,7 @@ ipcMain.handle('check-for-updates', async () => {
});
ipcMain.handle('download-update', async () => {
+ if (!autoUpdater) return { success: false, error: 'Updater not available' };
try {
await autoUpdater.downloadUpdate();
return { success: true };
@@ -314,6 +514,7 @@ ipcMain.handle('download-update', async () => {
});
ipcMain.handle('install-update', () => {
+ if (!autoUpdater) return;
autoUpdater.quitAndInstall(false, true);
});
diff --git a/electron/package-lock.json b/electron/package-lock.json
index 3358b1a3..f3ebd483 100644
--- a/electron/package-lock.json
+++ b/electron/package-lock.json
@@ -1,19 +1,20 @@
{
"name": "openswarm",
- "version": "1.0.3",
+ "version": "1.0.9",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "openswarm",
- "version": "1.0.3",
+ "version": "1.0.9",
+ "hasInstallScript": true,
"dependencies": {
"electron-updater": "^6.3.0",
"get-port": "^5.1.1"
},
"devDependencies": {
"@electron/notarize": "^3.1.1",
- "electron": "^33.0.0",
+ "electron": "castlabs/electron-releases#v33.4.11+wvcus",
"electron-builder": "^25.1.0"
}
},
@@ -2206,9 +2207,8 @@
}
},
"node_modules/electron": {
- "version": "33.4.11",
- "resolved": "https://registry.npmjs.org/electron/-/electron-33.4.11.tgz",
- "integrity": "sha512-xmdAs5QWRkInC7TpXGNvzo/7exojubk+72jn1oJL7keNeIlw7xNglf8TGtJtkR4rWC5FJq0oXiIXPS9BcK2Irg==",
+ "version": "33.4.11+wvcus",
+ "resolved": "git+ssh://git@github.com/castlabs/electron-releases.git#d1cf58c11ec0a8a04f307ed362d7efde2816778d",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
@@ -3953,9 +3953,9 @@
}
},
"node_modules/node-abi": {
- "version": "3.88.0",
- "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.88.0.tgz",
- "integrity": "sha512-At6b4UqIEVudaqPsXjmUO1r/N5BUr4yhDGs5PkBE8/oG5+TfLPhFechiskFsnT6Ql0VfUXbalUUCbfXxtj7K+w==",
+ "version": "3.89.0",
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.89.0.tgz",
+ "integrity": "sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4605,9 +4605,9 @@
}
},
"node_modules/sax": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.5.0.tgz",
- "integrity": "sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA==",
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz",
+ "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==",
"license": "BlueOak-1.0.0",
"engines": {
"node": ">=11.0.0"
diff --git a/electron/package.json b/electron/package.json
index 48ee49a7..53e18f84 100644
--- a/electron/package.json
+++ b/electron/package.json
@@ -1,11 +1,13 @@
{
"name": "openswarm",
- "version": "1.0.3",
+ "version": "1.0.10",
"description": "OpenSwarm — AI Agent Orchestrator",
"main": "main.js",
"scripts": {
"start": "electron .",
"dev": "ELECTRON_DEV=1 electron .",
+ "postinstall": "bash scripts/sign-vmp.sh",
+ "sign-vmp": "bash scripts/sign-vmp.sh",
"dist": "electron-builder --mac --publish never",
"dist:publish": "electron-builder --mac --publish always",
"dist:all": "electron-builder --mac --win --linux"
@@ -16,12 +18,15 @@
},
"devDependencies": {
"@electron/notarize": "^3.1.1",
- "electron": "^33.0.0",
+ "electron": "castlabs/electron-releases#v33.4.11+wvcus",
"electron-builder": "^25.1.0"
},
"build": {
"appId": "com.clusterlabs.openswarm",
"productName": "OpenSwarm",
+ "electronDownload": {
+ "mirror": "https://github.com/castlabs/electron-releases/releases/download/v"
+ },
"directories": {
"output": "dist"
},
@@ -38,6 +43,7 @@
"entitlementsInherit": "build/entitlements.mac.plist"
},
"dmg": {
+ "artifactName": "OpenSwarm-${arch}.${ext}",
"title": "OpenSwarm",
"contents": [
{
@@ -54,34 +60,24 @@
},
"extraResources": [
{
- "from": "../frontend/dist",
+ "from": "build-staging/frontend",
"to": "frontend",
"filter": [
"**/*"
]
},
{
- "from": "../backend",
+ "from": "build-staging/backend",
"to": "backend",
"filter": [
- "**/*",
- "!__pycache__/**",
- "!**/__pycache__/**",
- "!.venv/**",
- "!*.pyc"
+ "**/*"
]
},
{
- "from": "../debugger",
+ "from": "build-staging/debugger",
"to": "debugger",
"filter": [
- "**/*",
- "!__pycache__/**",
- "!**/__pycache__/**",
- "!*.pyc",
- "!.venv/**",
- "!**/.venv/**",
- "!**/node_modules/**"
+ "**/*"
]
},
{
diff --git a/electron/preload.js b/electron/preload.js
index 2f9037be..534c540f 100644
--- a/electron/preload.js
+++ b/electron/preload.js
@@ -2,15 +2,18 @@ const { contextBridge, ipcRenderer } = require('electron');
(async () => {
const port = await ipcRenderer.invoke('get-backend-port');
+ const webviewPreloadPath = await ipcRenderer.invoke('get-webview-preload-path');
contextBridge.exposeInMainWorld('__OPENSWARM_PORT__', port);
contextBridge.exposeInMainWorld('openswarm', {
getBackendPort: () => port,
+ getWebviewPreloadPath: () => webviewPreloadPath,
getAppVersion: () => ipcRenderer.invoke('get-app-version'),
openExternal: (url) => ipcRenderer.invoke('open-external', url),
capturePage: (rect) => ipcRenderer.invoke('capture-page', rect),
+ getUpdateStatus: () => ipcRenderer.invoke('get-update-status'),
checkForUpdates: () => ipcRenderer.invoke('check-for-updates'),
downloadUpdate: () => ipcRenderer.invoke('download-update'),
installUpdate: () => ipcRenderer.invoke('install-update'),
@@ -40,5 +43,11 @@ const { contextBridge, ipcRenderer } = require('electron');
ipcRenderer.on('update-error', listener);
return () => ipcRenderer.removeListener('update-error', listener);
},
+
+ onWebviewNewWindow: (cb) => {
+ const listener = (_event, url, webContentsId) => cb(url, webContentsId);
+ ipcRenderer.on('webview-new-window', listener);
+ return () => ipcRenderer.removeListener('webview-new-window', listener);
+ },
});
})();
diff --git a/electron/scripts/sign-vmp.sh b/electron/scripts/sign-vmp.sh
new file mode 100755
index 00000000..ba5eb833
--- /dev/null
+++ b/electron/scripts/sign-vmp.sh
@@ -0,0 +1,61 @@
+#!/bin/bash
+# Signs the CastLabs Electron binary with a production VMP certificate via EVS,
+# then repairs macOS framework symlinks that npm/signing may strip.
+#
+# First-time setup (one-time):
+# pip3 install --user castlabs-evs
+# python3 -m castlabs_evs.account signup
+#
+# After signup, this script runs automatically.
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+ELECTRON_DIR="$SCRIPT_DIR/../node_modules/electron/dist"
+FW_BASE="$ELECTRON_DIR/Electron.app/Contents/Frameworks"
+
+fix_framework_symlinks() {
+ [ -d "$FW_BASE" ] || return 0
+ for fw in "$FW_BASE"/*.framework; do
+ [ -d "$fw/Versions/A" ] || continue
+ local name
+ name=$(basename "$fw" .framework)
+ cd "$fw"
+ (cd Versions && ln -sf A Current 2>/dev/null)
+ ln -sf "Versions/Current/$name" "$name" 2>/dev/null
+ [ -d "Versions/A/Resources" ] && ln -sf Versions/Current/Resources Resources 2>/dev/null
+ [ -d "Versions/A/Libraries" ] && ln -sf Versions/Current/Libraries Libraries 2>/dev/null
+ [ -d "Versions/A/Helpers" ] && ln -sf Versions/Current/Helpers Helpers 2>/dev/null
+ done
+}
+
+if [ ! -d "$ELECTRON_DIR" ]; then
+ echo "[vmp] Electron dist not found at $ELECTRON_DIR — skipping VMP signing"
+ fix_framework_symlinks
+ exit 0
+fi
+
+# Always fix symlinks first (npm git installs strip them)
+fix_framework_symlinks
+
+if ! python3 -c "import castlabs_evs" 2>/dev/null; then
+ echo "[vmp] castlabs-evs not installed. Install with: pip3 install --user castlabs-evs"
+ echo "[vmp] Skipping VMP signing — DRM playback will be limited"
+ exit 0
+fi
+
+VERIFY_OUTPUT=$(python3 -m castlabs_evs.vmp verify-pkg "$ELECTRON_DIR" 2>&1)
+if echo "$VERIFY_OUTPUT" | grep -q "Signature is valid" && ! echo "$VERIFY_OUTPUT" | grep -q "development only"; then
+ echo "[vmp] Electron already has a valid production VMP signature"
+ exit 0
+fi
+
+echo "[vmp] Signing Electron with production VMP certificate..."
+if python3 -m castlabs_evs.vmp sign-pkg "$ELECTRON_DIR" 2>&1; then
+ echo "[vmp] VMP signing successful — full DRM playback enabled"
+ # Re-fix symlinks in case signing modified the bundle
+ fix_framework_symlinks
+else
+ echo "[vmp] VMP signing failed — you may need to run: python3 -m castlabs_evs.account signup"
+ echo "[vmp] DRM playback will be limited to previews until signed"
+fi
+
+exit 0
diff --git a/electron/webview-preload.js b/electron/webview-preload.js
new file mode 100644
index 00000000..95a93d66
--- /dev/null
+++ b/electron/webview-preload.js
@@ -0,0 +1,87 @@
+/**
+ * Webview preload script — patches browser fingerprinting so sites like
+ * Spotify/Netflix don't detect an Electron shell and disable features.
+ * Loaded via the webview's `preload` attribute before any page script runs.
+ */
+
+'use strict';
+
+// Hide webdriver flag
+Object.defineProperty(navigator, 'webdriver', {
+ get: () => false,
+ configurable: true,
+});
+
+// Spoof navigator.plugins (Chrome has a few built-in ones)
+const fakePlugins = {
+ 0: { name: 'Chrome PDF Plugin', filename: 'internal-pdf-viewer', description: 'Portable Document Format' },
+ 1: { name: 'Chrome PDF Viewer', filename: 'mhjfbmdgcfjbbpaeojofohoefgiehjai', description: '' },
+ 2: { name: 'Native Client', filename: 'internal-nacl-plugin', description: '' },
+ length: 3,
+ item: (i) => fakePlugins[i] || null,
+ namedItem: (name) => {
+ for (let i = 0; i < fakePlugins.length; i++) {
+ if (fakePlugins[i].name === name) return fakePlugins[i];
+ }
+ return null;
+ },
+ refresh: () => {},
+ [Symbol.iterator]: function* () {
+ for (let i = 0; i < this.length; i++) yield this[i];
+ },
+};
+try {
+ Object.defineProperty(navigator, 'plugins', {
+ get: () => fakePlugins,
+ configurable: true,
+ });
+} catch (_) {}
+
+// Ensure window.chrome exists (sites test for it)
+if (!window.chrome) {
+ window.chrome = {};
+}
+if (!window.chrome.runtime) {
+ window.chrome.runtime = {
+ connect: () => {},
+ sendMessage: () => {},
+ onMessage: { addListener: () => {}, removeListener: () => {} },
+ };
+}
+
+// Ensure navigator.languages has sensible values
+try {
+ Object.defineProperty(navigator, 'languages', {
+ get: () => ['en-US', 'en'],
+ configurable: true,
+ });
+} catch (_) {}
+
+// Patch permissions.query to report 'granted' for common permissions
+const originalQuery = navigator.permissions?.query?.bind(navigator.permissions);
+if (originalQuery) {
+ navigator.permissions.query = (params) => {
+ if (params.name === 'notifications') {
+ return Promise.resolve({ state: 'granted', onchange: null });
+ }
+ return originalQuery(params).catch(() =>
+ Promise.resolve({ state: 'prompt', onchange: null })
+ );
+ };
+}
+
+// Prevent iframe detection heuristics
+try {
+ Object.defineProperty(document, 'hidden', {
+ get: () => false,
+ configurable: true,
+ });
+ Object.defineProperty(document, 'visibilityState', {
+ get: () => 'visible',
+ configurable: true,
+ });
+} catch (_) {}
+
+// Fix console.debug detection (some sites use it as a breakpoint detector)
+const noop = () => {};
+if (!window.console.debug) window.console.debug = noop;
diff --git a/frontend/src/app/Main.tsx b/frontend/src/app/Main.tsx
index c7c3e68b..50e051d8 100644
--- a/frontend/src/app/Main.tsx
+++ b/frontend/src/app/Main.tsx
@@ -3,7 +3,7 @@ import { Provider } from 'react-redux';
import { HashRouter, Routes, Route } from 'react-router-dom';
import { ThemeProvider as MuiThemeProvider, createTheme, CssBaseline } from '@mui/material';
import { store } from '../shared/state/store';
-import { useAppDispatch } from '@/shared/hooks';
+import { useAppDispatch, useAppSelector } from '@/shared/hooks';
import { fetchSettings } from '@/shared/state/settingsSlice';
import {
setAppVersion,
@@ -156,9 +156,15 @@ const ShortcutsProvider: React.FC<{ children: React.ReactNode }> = ({ children }
const SettingsLoader: React.FC<{ children: React.ReactNode }> = ({ children }) => {
const dispatch = useAppDispatch();
+ const { setMode: setThemeMode } = useThemeMode();
+ const theme = useAppSelector((s) => s.settings.data.theme);
+ const loaded = useAppSelector((s) => s.settings.loaded);
useEffect(() => {
dispatch(fetchSettings());
}, [dispatch]);
+ useEffect(() => {
+ if (loaded) setThemeMode(theme as 'light' | 'dark');
+ }, [loaded, theme, setThemeMode]);
return <>{children}>;
};
@@ -171,6 +177,21 @@ const UpdateListener: React.FC<{ children: React.ReactNode }> = ({ children }) =
api.getAppVersion().then((v: string) => dispatch(setAppVersion(v)));
+ api.getUpdateStatus?.().then((cached) => {
+ if (!cached) return;
+ if (cached.status === 'available' && cached.info?.version) {
+ dispatch(setUpdateAvailable(cached.info.version));
+ } else if (cached.status === 'not-available') {
+ dispatch(setUpdateNotAvailable());
+ } else if (cached.status === 'downloading' && cached.info?.percent != null) {
+ dispatch(setDownloading(cached.info.percent));
+ } else if (cached.status === 'downloaded') {
+ dispatch(setUpdateDownloaded());
+ } else if (cached.status === 'error' && cached.error) {
+ dispatch(setUpdateError(cached.error));
+ }
+ });
+
const cleanups = [
api.onUpdateAvailable?.((info: OpenSwarmUpdateInfo) => dispatch(setUpdateAvailable(info.version))),
api.onUpdateNotAvailable?.(() => dispatch(setUpdateNotAvailable())),
diff --git a/frontend/src/app/components/ElementSelectionContext.tsx b/frontend/src/app/components/ElementSelectionContext.tsx
index d42e5d1f..5db25ba1 100644
--- a/frontend/src/app/components/ElementSelectionContext.tsx
+++ b/frontend/src/app/components/ElementSelectionContext.tsx
@@ -1,4 +1,4 @@
-import React, { createContext, useContext, useState, useRef, useCallback, RefObject } from 'react';
+import React, { createContext, useContext, useState, useRef, useCallback, useMemo, RefObject } from 'react';
export interface SelectedElement {
id: string;
@@ -20,11 +20,17 @@ interface ElementSelectionContextValue {
setSelectMode: (active: boolean) => void;
excludeSelectId: string | null;
setExcludeSelectId: (id: string | null) => void;
+ activeOwnerId: string | null;
+ setActiveOwnerId: (id: string | null) => void;
selectedElements: SelectedElement[];
addSelectedElement: (el: SelectedElement) => void;
updateSelectedElement: (id: string, patch: Partial) => void;
removeSelectedElement: (id: string) => void;
clearSelectedElements: () => void;
+ elementsByOwner: Record;
+ addElementForOwner: (ownerId: string, el: SelectedElement) => void;
+ removeOwnerElement: (ownerId: string, elementId: string) => void;
+ clearOwnerElements: (ownerId: string) => void;
iframeRef: RefObject;
}
@@ -37,9 +43,18 @@ export function useElementSelection() {
export const ElementSelectionProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
const [selectMode, setSelectMode] = useState(false);
const [excludeSelectId, setExcludeSelectId] = useState(null);
- const [selectedElements, setSelectedElements] = useState([]);
+ const [activeOwnerId, setActiveOwnerId] = useState(null);
+ const [elementsByOwner, setElementsByOwner] = useState>({});
const iframeRef = useRef(null);
+ const activeOwnerIdRef = useRef(activeOwnerId);
+ activeOwnerIdRef.current = activeOwnerId;
+
+ const selectedElements = useMemo(
+ () => (activeOwnerId ? elementsByOwner[activeOwnerId] ?? [] : []),
+ [activeOwnerId, elementsByOwner],
+ );
+
const toggleSelectMode = useCallback(() => {
setSelectMode((prev) => {
if (prev) setExcludeSelectId(null);
@@ -48,22 +63,65 @@ export const ElementSelectionProvider: React.FC<{ children: React.ReactNode }> =
}, []);
const addSelectedElement = useCallback((el: SelectedElement) => {
- setSelectedElements((prev) => {
- if (prev.some((e) => e.id === el.id)) return prev;
- return [...prev, el];
+ const ownerId = activeOwnerIdRef.current;
+ if (!ownerId) return;
+ setElementsByOwner((prev) => {
+ const existing = prev[ownerId] ?? [];
+ if (existing.some((e) => e.id === el.id)) return prev;
+ return { ...prev, [ownerId]: [...existing, el] };
});
}, []);
const updateSelectedElement = useCallback((id: string, patch: Partial) => {
- setSelectedElements((prev) => prev.map((e) => e.id === id ? { ...e, ...patch } : e));
+ const ownerId = activeOwnerIdRef.current;
+ if (!ownerId) return;
+ setElementsByOwner((prev) => {
+ const existing = prev[ownerId];
+ if (!existing) return prev;
+ return { ...prev, [ownerId]: existing.map((e) => (e.id === id ? { ...e, ...patch } : e)) };
+ });
}, []);
const removeSelectedElement = useCallback((id: string) => {
- setSelectedElements((prev) => prev.filter((e) => e.id !== id));
+ const ownerId = activeOwnerIdRef.current;
+ if (!ownerId) return;
+ setElementsByOwner((prev) => {
+ const existing = prev[ownerId];
+ if (!existing) return prev;
+ return { ...prev, [ownerId]: existing.filter((e) => e.id !== id) };
+ });
}, []);
const clearSelectedElements = useCallback(() => {
- setSelectedElements([]);
+ const ownerId = activeOwnerIdRef.current;
+ if (!ownerId) return;
+ setElementsByOwner((prev) => {
+ if (!prev[ownerId]?.length) return prev;
+ return { ...prev, [ownerId]: [] };
+ });
+ }, []);
+
+ const addElementForOwner = useCallback((ownerId: string, el: SelectedElement) => {
+ setElementsByOwner((prev) => {
+ const existing = prev[ownerId] ?? [];
+ if (existing.some((e) => e.semanticData?.selectId === el.semanticData?.selectId)) return prev;
+ return { ...prev, [ownerId]: [...existing, el] };
+ });
+ }, []);
+
+ const removeOwnerElement = useCallback((ownerId: string, elementId: string) => {
+ setElementsByOwner((prev) => {
+ const existing = prev[ownerId];
+ if (!existing) return prev;
+ return { ...prev, [ownerId]: existing.filter((e) => e.id !== elementId) };
+ });
+ }, []);
+
+ const clearOwnerElements = useCallback((ownerId: string) => {
+ setElementsByOwner((prev) => {
+ if (!prev[ownerId]?.length) return prev;
+ return { ...prev, [ownerId]: [] };
+ });
}, []);
return (
@@ -74,11 +132,17 @@ export const ElementSelectionProvider: React.FC<{ children: React.ReactNode }> =
setSelectMode,
excludeSelectId,
setExcludeSelectId,
+ activeOwnerId,
+ setActiveOwnerId,
selectedElements,
addSelectedElement,
updateSelectedElement,
removeSelectedElement,
clearSelectedElements,
+ elementsByOwner,
+ addElementForOwner,
+ removeOwnerElement,
+ clearOwnerElements,
iframeRef,
}}
>
diff --git a/frontend/src/app/components/GlobalApprovalOverlay.tsx b/frontend/src/app/components/GlobalApprovalOverlay.tsx
index 4405e7bf..a369ba1b 100644
--- a/frontend/src/app/components/GlobalApprovalOverlay.tsx
+++ b/frontend/src/app/components/GlobalApprovalOverlay.tsx
@@ -3,11 +3,23 @@ import Box from '@mui/material/Box';
import Typography from '@mui/material/Typography';
import Chip from '@mui/material/Chip';
import IconButton from '@mui/material/IconButton';
+import Tooltip from '@mui/material/Tooltip';
import ExpandLessIcon from '@mui/icons-material/ExpandLess';
import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
import NotificationsActiveIcon from '@mui/icons-material/NotificationsActive';
+import StopCircleOutlinedIcon from '@mui/icons-material/StopCircleOutlined';
+import CloseIcon from '@mui/icons-material/Close';
+import { useNavigate } from 'react-router-dom';
import { useAppDispatch, useAppSelector } from '@/shared/hooks';
-import { handleApproval, ApprovalRequest } from '@/shared/state/agentsSlice';
+import {
+ handleApproval,
+ stopAgent,
+ dismissAgentNotification,
+ ApprovalRequest,
+ AgentSession,
+ HistorySession,
+} from '@/shared/state/agentsSlice';
+import { setPendingFocusAgentId } from '@/shared/state/tempStateSlice';
import ApprovalBar, { BatchApprovalBar } from '@/app/pages/AgentChat/ApprovalBar';
import { useClaudeTokens } from '@/shared/styles/ThemeContext';
@@ -17,16 +29,133 @@ interface SessionApprovalGroup {
approvals: ApprovalRequest[];
}
+type TrackedAgent = {
+ id: string;
+ name: string;
+ status: AgentSession['status'] | string;
+ dashboardId?: string;
+};
+
+const STATUS_CONFIG: Record = {
+ running: { color: '', label: 'Running', tokenKey: 'success' },
+ waiting_approval: { color: '', label: 'Waiting', tokenKey: 'warning' },
+ completed: { color: '', label: 'Done', tokenKey: 'success' },
+ error: { color: '', label: 'Error', tokenKey: 'error' },
+ stopped: { color: '', label: 'Stopped', tokenKey: 'info' },
+};
+
+const StatusDot: React.FC<{ status: string; c: ReturnType }> = ({ status, c }) => {
+ const cfg = STATUS_CONFIG[status];
+ const color = cfg?.tokenKey ? (c.status as any)[cfg.tokenKey] : c.text.ghost;
+ const isActive = status === 'running';
+ return (
+
+ );
+};
+
+const AgentStatusRow: React.FC<{
+ agent: TrackedAgent;
+ c: ReturnType;
+ onStop: (id: string) => void;
+ onDismiss: (id: string) => void;
+ onNavigate: (dashboardId: string, agentId: string) => void;
+}> = ({ agent, c, onStop, onDismiss, onNavigate }) => {
+ const isActive = agent.status === 'running' || agent.status === 'waiting_approval';
+ const cfg = STATUS_CONFIG[agent.status] ?? { label: agent.status };
+
+ return (
+ agent.dashboardId && onNavigate(agent.dashboardId, agent.id)}
+ sx={{
+ display: 'flex',
+ alignItems: 'center',
+ gap: 1,
+ px: 2,
+ py: 0.75,
+ cursor: agent.dashboardId ? 'pointer' : 'default',
+ '&:hover': { bgcolor: `${c.text.ghost}10` },
+ transition: 'background-color 0.15s',
+ minHeight: 36,
+ }}
+ >
+
+
+ {agent.name}
+
+
+ {cfg.label}
+
+ {isActive ? (
+
+ { e.stopPropagation(); onStop(agent.id); }}
+ sx={{ p: 0.25, color: c.status.error, '&:hover': { bgcolor: `${c.status.error}15` } }}
+ >
+
+
+
+ ) : (
+
+ { e.stopPropagation(); onDismiss(agent.id); }}
+ sx={{ p: 0.25, color: c.text.ghost, '&:hover': { bgcolor: `${c.text.ghost}15` } }}
+ >
+
+
+
+ )}
+
+ );
+};
+
const GlobalApprovalOverlay: React.FC = () => {
const c = useClaudeTokens();
const dispatch = useAppDispatch();
+ const navigate = useNavigate();
const sessions = useAppSelector((state) => state.agents.sessions);
+ const history = useAppSelector((state) => state.agents.history);
+ const trackedIds = useAppSelector((state) => state.agents.trackedNotificationIds);
const [collapsed, setCollapsed] = useState(false);
const groups: SessionApprovalGroup[] = useMemo(() => {
const result: SessionApprovalGroup[] = [];
for (const [sessionId, session] of Object.entries(sessions)) {
- if (session.pending_approvals.length > 0) {
+ if (session.pending_approvals?.length > 0) {
result.push({
sessionId,
sessionName: session.name || 'Agent',
@@ -42,11 +171,38 @@ const GlobalApprovalOverlay: React.FC = () => {
[groups],
);
+ const trackedAgents: TrackedAgent[] = useMemo(() => {
+ return trackedIds
+ .map((id): TrackedAgent | null => {
+ const session = sessions[id];
+ if (session && session.status !== 'draft') {
+ return { id, name: session.name, status: session.status, dashboardId: session.dashboard_id };
+ }
+ const hist: HistorySession | undefined = history[id];
+ if (hist) {
+ return { id, name: hist.name, status: hist.status, dashboardId: hist.dashboard_id };
+ }
+ return null;
+ })
+ .filter((a): a is TrackedAgent => a !== null);
+ }, [trackedIds, sessions, history]);
+
+ const activeAgents = useMemo(
+ () => trackedAgents.filter((a) => a.status === 'running' || a.status === 'waiting_approval'),
+ [trackedAgents],
+ );
+ const finishedAgents = useMemo(
+ () => trackedAgents.filter((a) => a.status !== 'running' && a.status !== 'waiting_approval'),
+ [trackedAgents],
+ );
+
+ const totalBadge = totalApprovals + activeAgents.length;
+
useEffect(() => {
- if (totalApprovals > 0) {
+ if (totalApprovals > 0 || activeAgents.length > 0) {
setCollapsed(false);
}
- }, [totalApprovals]);
+ }, [totalApprovals, activeAgents.length]);
const onApprove = useCallback(
(requestId: string, updatedInput?: Record) => {
@@ -62,7 +218,39 @@ const GlobalApprovalOverlay: React.FC = () => {
[dispatch],
);
- if (totalApprovals === 0) return null;
+ const onStopAgent = useCallback(
+ (sessionId: string) => {
+ dispatch(stopAgent({ sessionId }));
+ },
+ [dispatch],
+ );
+
+ const onDismissAgent = useCallback(
+ (sessionId: string) => {
+ dispatch(dismissAgentNotification(sessionId));
+ },
+ [dispatch],
+ );
+
+ const onNavigateToDashboard = useCallback(
+ (dashboardId: string, agentId: string) => {
+ dispatch(setPendingFocusAgentId(agentId));
+ navigate(`/dashboard/${dashboardId}`);
+ },
+ [navigate, dispatch],
+ );
+
+ if (totalApprovals === 0 && trackedAgents.length === 0) return null;
+
+ const hasApprovals = totalApprovals > 0;
+ const hasAgents = trackedAgents.length > 0;
+ const headerTitle = hasApprovals && !hasAgents
+ ? 'Approval Required'
+ : hasAgents && !hasApprovals
+ ? 'Agents'
+ : 'Notifications';
+ const headerColor = hasApprovals ? c.status.warning : c.status.info;
+ const headerBg = hasApprovals ? c.status.warningBg : c.status.infoBg;
return (
{
flexDirection: 'column',
borderRadius: `${c.radius.xl}px`,
bgcolor: c.bg.surface,
- border: `1px solid ${c.status.warning}40`,
- boxShadow: `0 8px 32px rgba(0,0,0,0.25), 0 0 0 1px ${c.status.warning}20`,
+ border: `1px solid ${headerColor}40`,
+ boxShadow: `0 8px 32px rgba(0,0,0,0.25), 0 0 0 1px ${headerColor}20`,
overflow: 'hidden',
animation: 'approvalSlideIn 0.25s ease-out',
'@keyframes approvalSlideIn': {
@@ -97,19 +285,19 @@ const GlobalApprovalOverlay: React.FC = () => {
gap: 1,
px: 2,
py: 1.25,
- bgcolor: c.status.warningBg,
- borderBottom: collapsed ? 'none' : `1px solid ${c.status.warning}20`,
+ bgcolor: headerBg,
+ borderBottom: collapsed ? 'none' : `1px solid ${headerColor}20`,
cursor: 'pointer',
userSelect: 'none',
- '&:hover': { bgcolor: `${c.status.warning}18` },
+ '&:hover': { bgcolor: `${headerColor}18` },
transition: 'background-color 0.15s',
}}
>
{
},
}}
/>
-
- Approval Required
+
+ {headerTitle}
-
+ {totalBadge > 0 && (
+
+ )}
{collapsed ? : }
@@ -146,7 +336,6 @@ const GlobalApprovalOverlay: React.FC = () => {
{
scrollbarColor: `${c.border.medium} transparent`,
}}
>
- {groups.map((group) => (
-
- {groups.length > 1 && (
+ {/* Approvals section */}
+ {hasApprovals && (
+
+ {hasAgents && (
- {group.sessionName}
+ Approvals
)}
- {group.approvals.length > 1 ? (
-
- ) : (
- group.approvals.map((req) => (
-
- ))
- )}
+ {groups.map((group) => (
+
+ {groups.length > 1 && (
+
+ {group.sessionName}
+
+ )}
+ {group.approvals.length > 1 ? (
+
+ ) : (
+ group.approvals.map((req) => (
+
+ ))
+ )}
+
+ ))}
- ))}
+ )}
+
+ {/* Divider between sections */}
+ {hasApprovals && hasAgents && (
+
+ )}
+
+ {/* Agent status section */}
+ {hasAgents && (
+
+ {hasApprovals && (
+
+ Agents
+
+ )}
+ {activeAgents.map((agent) => (
+
+ ))}
+ {finishedAgents.map((agent) => (
+
+ ))}
+
+ )}
)}
diff --git a/frontend/src/app/components/KeyboardShortcutsHelp.tsx b/frontend/src/app/components/KeyboardShortcutsHelp.tsx
index 1447a635..23e9aa29 100644
--- a/frontend/src/app/components/KeyboardShortcutsHelp.tsx
+++ b/frontend/src/app/components/KeyboardShortcutsHelp.tsx
@@ -11,6 +11,7 @@ const shortcuts = [
{ key: 't', description: 'Go to Templates' },
{ key: '1-9', description: 'Open agent by position' },
{ key: '⌘M', description: 'Add App' },
+ { key: '⌘N', description: 'New Browser' },
{ key: '⌘O', description: 'History' },
{ key: 'Shift+A', description: 'Approve all pending' },
{ key: 'Shift+D', description: 'Deny all pending' },
diff --git a/frontend/src/app/components/Layout/AppShell.tsx b/frontend/src/app/components/Layout/AppShell.tsx
index ac9f8740..cd3e51a0 100644
--- a/frontend/src/app/components/Layout/AppShell.tsx
+++ b/frontend/src/app/components/Layout/AppShell.tsx
@@ -28,17 +28,24 @@ import ViewSidebarOutlinedIcon from '@mui/icons-material/ViewSidebarOutlined';
import ArrowBackOutlinedIcon from '@mui/icons-material/ArrowBackOutlined';
import ArrowForwardOutlinedIcon from '@mui/icons-material/ArrowForwardOutlined';
import RestartAltIcon from '@mui/icons-material/RestartAlt';
+import SystemUpdateAltIcon from '@mui/icons-material/SystemUpdateAlt';
+import CloseIcon from '@mui/icons-material/Close';
+import LinearProgress from '@mui/material/LinearProgress';
import Settings from '@/app/pages/Settings/Settings';
import GlobalApprovalOverlay from '@/app/components/GlobalApprovalOverlay';
import { useAppDispatch, useAppSelector } from '@/shared/hooks';
import { fetchDashboards, createDashboard, renameDashboard } from '@/shared/state/dashboardsSlice';
+import { addBrowserCard, addBrowserTab } from '@/shared/state/dashboardLayoutSlice';
+import { setPendingBrowserUrl } from '@/shared/state/tempStateSlice';
import { fetchOutputs } from '@/shared/state/outputsSlice';
+import { findBrowserByWebContentsId } from '@/shared/browserRegistry';
import { useClaudeTokens } from '@/shared/styles/ThemeContext';
const SIDEBAR_MIN = 160;
const SIDEBAR_MAX = 400;
const SIDEBAR_DEFAULT = 220;
const SIDEBAR_WIDTH_KEY = 'openswarm-sidebar-width';
+const UPDATE_DISMISS_KEY = 'openswarm-update-dismissed';
const CUSTOMIZATION_ITEMS = [
{ label: 'Prompts', path: '/templates', icon: },
@@ -76,10 +83,34 @@ const AppShell: React.FC = () => {
const updateStatus = useAppSelector((state) => state.update.status);
const availableVersion = useAppSelector((state) => state.update.availableVersion);
- const [updateBannerDismissed, setUpdateBannerDismissed] = useState(false);
+ const downloadPercent = useAppSelector((state) => state.update.downloadPercent);
- const showUpdateDot = updateStatus === 'available' || updateStatus === 'downloaded';
- const showUpdateBanner = updateStatus === 'downloaded' && !updateBannerDismissed;
+ const [dismissedVersion, setDismissedVersion] = useState(() => {
+ try { return localStorage.getItem(UPDATE_DISMISS_KEY); } catch { return null; }
+ });
+ const [snackbarDismissed, setSnackbarDismissed] = useState(false);
+
+ const bannerDismissedForVersion = availableVersion != null && dismissedVersion === availableVersion;
+ const isUpdateActionable = updateStatus === 'available' || updateStatus === 'downloaded' || updateStatus === 'downloading';
+
+ const showUpdateDot = (updateStatus === 'available' || updateStatus === 'downloaded') && !bannerDismissedForVersion;
+ const showUpdateBanner = isUpdateActionable && !bannerDismissedForVersion;
+ const showUpdateSnackbar = (updateStatus === 'available' || updateStatus === 'downloaded') && !bannerDismissedForVersion && !snackbarDismissed;
+
+ const handleDismissBanner = useCallback(() => {
+ if (availableVersion) {
+ try { localStorage.setItem(UPDATE_DISMISS_KEY, availableVersion); } catch {}
+ setDismissedVersion(availableVersion);
+ }
+ }, [availableVersion]);
+
+ const handleDownloadUpdate = useCallback(async () => {
+ try { await (window as any).openswarm?.downloadUpdate(); } catch {}
+ }, []);
+
+ const handleInstallUpdate = useCallback(() => {
+ (window as any).openswarm?.installUpdate();
+ }, []);
const dashboardItems = useAppSelector((state) => state.dashboards.items);
const dashboardList = Object.values(dashboardItems).sort(
@@ -96,6 +127,75 @@ const AppShell: React.FC = () => {
dispatch(fetchOutputs());
}, [dispatch]);
+ const openUrlInBrowser = useCallback((url: string, webContentsId?: number) => {
+ const dashMatch = location.pathname.match(/^\/dashboard\/(.+)/);
+ if (dashMatch) {
+ if (webContentsId != null) {
+ const browserId = findBrowserByWebContentsId(webContentsId);
+ if (browserId) {
+ dispatch(addBrowserTab({ browserId, url, makeActive: true }));
+ return;
+ }
+ }
+ dispatch(addBrowserCard({ url }));
+ } else {
+ dispatch(setPendingBrowserUrl(url));
+ const lastId = (window as any).__openswarm_last_dashboard_id as string | undefined;
+ const firstDashboard = dashboardList[0];
+ const targetId = lastId || firstDashboard?.id;
+ if (targetId) {
+ navigate(`/dashboard/${targetId}`);
+ } else {
+ dispatch(createDashboard('Untitled Dashboard')).then((result: any) => {
+ if (createDashboard.fulfilled.match(result)) {
+ navigate(`/dashboard/${result.payload.id}`);
+ }
+ });
+ }
+ }
+ }, [location.pathname, dashboardList, dispatch, navigate]);
+
+ useEffect(() => {
+ let lastUrl = '';
+ let lastTime = 0;
+
+ const handleClick = (e: MouseEvent) => {
+ const anchor = (e.target as HTMLElement)?.closest?.('a');
+ if (!anchor) return;
+ const href = anchor.getAttribute('href');
+ if (!href) return;
+ if (!/^https?:\/\//i.test(href)) return;
+ if (href.startsWith('http://localhost:')) return;
+
+ e.preventDefault();
+ e.stopPropagation();
+
+ const now = Date.now();
+ if (href === lastUrl && now - lastTime < 1000) return;
+ lastUrl = href;
+ lastTime = now;
+
+ openUrlInBrowser(href);
+ };
+
+ document.addEventListener('click', handleClick, true);
+ return () => document.removeEventListener('click', handleClick, true);
+ }, [openUrlInBrowser]);
+
+ useEffect(() => {
+ const w = window as any;
+ if (!w.openswarm?.onWebviewNewWindow) return;
+ let lastUrl = '';
+ let lastTime = 0;
+ return w.openswarm.onWebviewNewWindow((url: string, webContentsId: number) => {
+ const now = Date.now();
+ if (url === lastUrl && now - lastTime < 1000) return;
+ lastUrl = url;
+ lastTime = now;
+ openUrlInBrowser(url, webContentsId);
+ });
+ }, [openUrlInBrowser]);
+
useEffect(() => {
try { localStorage.setItem(SIDEBAR_WIDTH_KEY, String(sidebarWidth)); } catch {}
}, [sidebarWidth]);
@@ -281,6 +381,98 @@ const AppShell: React.FC = () => {
+ {showUpdateBanner && (
+
+
+
+ {updateStatus === 'available' && `OpenSwarm ${availableVersion} is available`}
+ {updateStatus === 'downloading' && `Downloading OpenSwarm ${availableVersion}…`}
+ {updateStatus === 'downloaded' && `OpenSwarm ${availableVersion} is ready to install`}
+
+ {updateStatus === 'downloading' && (
+
+ )}
+ {updateStatus === 'downloading' && (
+
+ {Math.round(downloadPercent)}%
+
+ )}
+ {updateStatus === 'available' && (
+
+ Download
+
+ )}
+ {updateStatus === 'downloaded' && (
+
+ Restart & Update
+
+ )}
+
+
+
+
+ )}
+
{!sidebarCollapsed && (
<>
@@ -769,36 +961,60 @@ const AppShell: React.FC = () => {
setSnackbarDismissed(true)}
anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}
>
}
+ icon={updateStatus === 'downloaded'
+ ?
+ :
+ }
action={
setUpdateBannerDismissed(true)}
+ onClick={() => setSnackbarDismissed(true)}
sx={{ color: c.text.muted, textTransform: 'none', fontSize: '0.8rem', minWidth: 'auto' }}
>
- Later
-
- (window as any).openswarm?.installUpdate()}
- sx={{
- bgcolor: c.accent.primary,
- '&:hover': { bgcolor: c.accent.pressed },
- textTransform: 'none',
- fontSize: '0.8rem',
- borderRadius: 1.5,
- minWidth: 'auto',
- }}
- >
- Restart
+ Dismiss
+ {updateStatus === 'available' && (
+
+ Download
+
+ )}
+ {updateStatus === 'downloaded' && (
+
+ Restart & Update
+
+ )}
}
sx={{
@@ -809,7 +1025,8 @@ const AppShell: React.FC = () => {
'& .MuiAlert-icon': { color: c.accent.primary },
}}
>
- OpenSwarm {availableVersion} downloaded — restart to update
+ {updateStatus === 'available' && `OpenSwarm ${availableVersion} is available`}
+ {updateStatus === 'downloaded' && `OpenSwarm ${availableVersion} downloaded — restart to update`}
diff --git a/frontend/src/app/components/useDomElementSelector.ts b/frontend/src/app/components/useDomElementSelector.ts
index b4535e19..8115769b 100644
--- a/frontend/src/app/components/useDomElementSelector.ts
+++ b/frontend/src/app/components/useDomElementSelector.ts
@@ -120,6 +120,7 @@ export function useDomElementSelector(): DomSelectorState {
const dragOriginRef = useRef<{ x: number; y: number } | null>(null);
const isDraggingRef = useRef(false);
const dragBoundsRef = useRef<{ left: number; top: number; right: number; bottom: number } | null>(null);
+ const preDragFocusRef = useRef(null);
const excludeIdRef = useRef(null);
useEffect(() => {
@@ -245,8 +246,11 @@ export function useDomElementSelector(): DomSelectorState {
if (e.button !== 0) return;
if (e.metaKey || e.ctrlKey) return;
const target = e.target as Element;
- // Only start drag on "empty" canvas areas (not on selectable elements)
- if (target && findSelectableAncestor(target, excludeIdRef.current)) return;
+ if (target && findSelectableAncestor(target, excludeIdRef.current)) {
+ e.preventDefault();
+ return;
+ }
+ preDragFocusRef.current = document.activeElement instanceof HTMLElement ? document.activeElement : null;
dragOriginRef.current = { x: e.clientX, y: e.clientY };
isDraggingRef.current = false;
}, []);
@@ -291,12 +295,17 @@ export function useDomElementSelector(): DomSelectorState {
});
}
+ const wasDragging = isDraggingRef.current;
dragOriginRef.current = null;
isDraggingRef.current = false;
dragBoundsRef.current = null;
setDragRect(EMPTY_DRAG);
setDragPreview([]);
if (dragPreviewRafRef.current) cancelAnimationFrame(dragPreviewRafRef.current);
+ if (wasDragging && preDragFocusRef.current) {
+ preDragFocusRef.current.focus();
+ }
+ preDragFocusRef.current = null;
}, [ctx]);
const handleClick = useCallback((e: MouseEvent) => {
@@ -327,6 +336,7 @@ export function useDomElementSelector(): DomSelectorState {
dragOriginRef.current = null;
dragBoundsRef.current = null;
isDraggingRef.current = false;
+ preDragFocusRef.current = null;
return;
}
@@ -353,6 +363,7 @@ export function useDomElementSelector(): DomSelectorState {
dragOriginRef.current = null;
dragBoundsRef.current = null;
isDraggingRef.current = false;
+ preDragFocusRef.current = null;
};
}, [ctx?.selectMode, handleMouseMove, handleMouseDown, handleMouseUp, handleClick]);
diff --git a/frontend/src/app/pages/AgentChat/AgentChat.tsx b/frontend/src/app/pages/AgentChat/AgentChat.tsx
index 0c5c43c5..6d1764cd 100644
--- a/frontend/src/app/pages/AgentChat/AgentChat.tsx
+++ b/frontend/src/app/pages/AgentChat/AgentChat.tsx
@@ -5,8 +5,16 @@ import Typography from '@mui/material/Typography';
import Chip from '@mui/material/Chip';
import IconButton from '@mui/material/IconButton';
import Tooltip from '@mui/material/Tooltip';
+import TextField from '@mui/material/TextField';
+import ClickAwayListener from '@mui/material/ClickAwayListener';
import CloseIcon from '@mui/icons-material/Close';
import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';
+import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp';
+import PlayArrowIcon from '@mui/icons-material/PlayArrow';
+import EditOutlinedIcon from '@mui/icons-material/EditOutlined';
+import DeleteOutlineIcon from '@mui/icons-material/DeleteOutline';
+import CheckIcon from '@mui/icons-material/Check';
+import DragIndicatorIcon from '@mui/icons-material/DragIndicator';
import { useAppDispatch, useAppSelector } from '@/shared/hooks';
import {
sendMessage as sendMessageThunk,
@@ -17,6 +25,8 @@ import {
handleApproval,
editMessage,
switchBranch,
+ duplicateSession,
+ setActiveSession,
updateSessionModel,
updateSessionMode,
fetchSession,
@@ -25,12 +35,12 @@ import {
import { fetchModes } from '@/shared/state/modesSlice';
import { createSessionWs } from '@/shared/ws/WebSocketManager';
import MessageBubble from './MessageBubble';
+import MessageActionBar from './MessageActionBar';
import ToolCallBubble, { ToolPair } from './ToolCallBubble';
import ToolGroupBubble, { RenderItem, ToolGroup, isToolGroup, isToolPair } from './ToolGroupBubble';
import ApprovalBar, { BatchApprovalBar } from './ApprovalBar';
import ChatInput, { ChatInputHandle } from './ChatInput';
import { ContextPath } from '@/app/components/DirectoryBrowser';
-import BranchNavigator from './BranchNavigator';
import DiffViewer from './DiffViewer';
import { setGlowingBrowserCards, clearGlowingBrowserCards } from '@/shared/state/dashboardLayoutSlice';
import { useClaudeTokens } from '@/shared/styles/ThemeContext';
@@ -91,14 +101,27 @@ const ThinkingBubble: React.FC = () => {
);
};
+interface QueuedMessage {
+ prompt: string;
+ images?: Array<{ data: string; media_type: string }>;
+ contextPaths?: Array<{ path: string; type: 'file' | 'directory' }>;
+ forcedTools?: string[];
+ attachedSkills?: Array<{ id: string; name: string; content: string }>;
+ selectedBrowserIds?: string[];
+}
+
interface AgentChatProps {
sessionId?: string;
onClose?: () => void;
embedded?: boolean;
+ autoFocus?: boolean;
+ isGlowing?: boolean;
+ onDismissGlow?: () => void;
initialContextPaths?: ContextPath[];
+ onBranch?: (newSessionId: string) => void;
}
-const AgentChat: React.FC = ({ sessionId: sessionIdProp, onClose, embedded, initialContextPaths }) => {
+const AgentChat: React.FC = ({ sessionId: sessionIdProp, onClose, embedded, autoFocus, isGlowing, onDismissGlow, initialContextPaths, onBranch }) => {
const c = useClaudeTokens();
const STATUS_STYLES: Record = {
running: { color: c.status.success, bg: c.status.successBg },
@@ -116,11 +139,20 @@ const AgentChat: React.FC = ({ sessionId: sessionIdProp, onClose
const chatInputRef = useRef(null);
const isAtBottomRef = useRef(true);
const [showScrollButton, setShowScrollButton] = useState(false);
+ const [showResumeBubble, setShowResumeBubble] = useState(false);
+ const [awaitingResponse, setAwaitingResponse] = useState(false);
const [mode, setMode] = useState('agent');
const [model, setModel] = useState('sonnet');
const wsRef = useRef | null>(null);
const initialContextApplied = useRef(false);
+ const messageQueueRef = useRef([]);
+ const [queueLength, setQueueLength] = useState(0);
+ const [queueExpanded, setQueueExpanded] = useState(false);
+ const [editingQueueIdx, setEditingQueueIdx] = useState(null);
+ const [editingQueueText, setEditingQueueText] = useState('');
+ const [dragIdx, setDragIdx] = useState(null);
+ const [dropTargetIdx, setDropTargetIdx] = useState(null);
const isDraft = session?.status === 'draft';
@@ -157,13 +189,64 @@ const AgentChat: React.FC = ({ sessionId: sessionIdProp, onClose
if (Object.keys(modesMap).length === 0) dispatch(fetchModes());
}, [dispatch, modesMap]);
+ const dispatchMessage = useCallback((msg: QueuedMessage) => {
+ if (!id) return;
+ setShowResumeBubble(false);
+ setAwaitingResponse(true);
+ if (isDraft) {
+ const config: Record = { model, mode };
+ if (session?.system_prompt) config.system_prompt = session.system_prompt;
+ if (session?.target_directory) config.target_directory = session.target_directory;
+ dispatch(
+ launchAndSendFirstMessage({ draftId: id, config, prompt: msg.prompt, mode, model, images: msg.images, contextPaths: msg.contextPaths, forcedTools: msg.forcedTools, attachedSkills: msg.attachedSkills, selectedBrowserIds: msg.selectedBrowserIds })
+ ).then((action) => {
+ if (launchAndSendFirstMessage.fulfilled.match(action)) {
+ const realId = action.payload.session.id;
+ dispatch(generateTitle({ sessionId: realId, prompt: msg.prompt }));
+ if (msg.selectedBrowserIds?.length) {
+ dispatch(setGlowingBrowserCards({ browserIds: msg.selectedBrowserIds, sessionId: realId }));
+ }
+ }
+ });
+ } else {
+ if (msg.selectedBrowserIds?.length) {
+ dispatch(setGlowingBrowserCards({ browserIds: msg.selectedBrowserIds, sessionId: id }));
+ }
+ dispatch(sendMessageThunk({ sessionId: id, prompt: msg.prompt, mode, model, images: msg.images, contextPaths: msg.contextPaths, forcedTools: msg.forcedTools, attachedSkills: msg.attachedSkills, selectedBrowserIds: msg.selectedBrowserIds }))
+ .then((action) => {
+ if (sendMessageThunk.rejected.match(action)) {
+ setAwaitingResponse(false);
+ }
+ });
+ }
+ }, [id, isDraft, mode, model, session?.system_prompt, session?.target_directory, dispatch]);
+
+ const agentBusy = awaitingResponse || (!isDraft && (session?.status === 'running' || session?.status === 'waiting_approval'));
+
const prevStatusRef = useRef(session?.status);
useEffect(() => {
const prev = prevStatusRef.current;
const curr = session?.status;
prevStatusRef.current = curr;
- if (prev === 'running' && (curr === 'completed' || curr === 'stopped' || curr === 'error')) {
+ let didDispatchQueued = false;
+
+ const wasActive = prev === 'running' || prev === 'waiting_approval';
+ const isTerminal = curr === 'completed' || curr === 'stopped' || curr === 'error';
+
+ if (wasActive && isTerminal) {
if (id) dispatch(clearGlowingBrowserCards(id));
+
+ const nextQueued = messageQueueRef.current.shift();
+ if (nextQueued) {
+ setQueueLength(messageQueueRef.current.length);
+ dispatchMessage(nextQueued);
+ didDispatchQueued = true;
+ } else {
+ if (curr === 'stopped') {
+ setShowResumeBubble(true);
+ }
+ }
+
const currentMode = modesMap[mode];
if (currentMode?.default_next_mode && modesMap[currentMode.default_next_mode]) {
setMode(currentMode.default_next_mode);
@@ -172,7 +255,13 @@ const AgentChat: React.FC = ({ sessionId: sessionIdProp, onClose
}
}
}
- }, [session?.status, mode, modesMap, id, isDraft, dispatch]);
+ if (curr === 'running') {
+ setShowResumeBubble(false);
+ }
+ if (curr !== 'draft' && !didDispatchQueued) {
+ setAwaitingResponse(false);
+ }
+ }, [session?.status, mode, modesMap, id, isDraft, dispatch, dispatchMessage]);
const SCROLL_THRESHOLD = 50;
@@ -201,27 +290,13 @@ const AgentChat: React.FC = ({ sessionId: sessionIdProp, onClose
const handleSend = (prompt: string, images?: Array<{ data: string; media_type: string }>, contextPaths?: Array<{ path: string; type: 'file' | 'directory' }>, forcedTools?: string[], attachedSkills?: Array<{ id: string; name: string; content: string }>, selectedBrowserIds?: string[]) => {
if (!id) return;
- if (isDraft) {
- const config: Record = { model, mode };
- if (session?.system_prompt) config.system_prompt = session.system_prompt;
- if (session?.target_directory) config.target_directory = session.target_directory;
- dispatch(
- launchAndSendFirstMessage({ draftId: id, config, prompt, mode, model, images, contextPaths, forcedTools, attachedSkills })
- ).then((action) => {
- if (launchAndSendFirstMessage.fulfilled.match(action)) {
- const realId = action.payload.session.id;
- dispatch(generateTitle({ sessionId: realId, prompt }));
- if (selectedBrowserIds?.length) {
- dispatch(setGlowingBrowserCards({ browserIds: selectedBrowserIds, sessionId: realId }));
- }
- }
- });
- } else {
- if (selectedBrowserIds?.length) {
- dispatch(setGlowingBrowserCards({ browserIds: selectedBrowserIds, sessionId: id }));
- }
- dispatch(sendMessageThunk({ sessionId: id, prompt, mode, model, images, contextPaths, forcedTools, attachedSkills }));
+ const msg: QueuedMessage = { prompt, images, contextPaths, forcedTools, attachedSkills, selectedBrowserIds };
+ if (agentBusy) {
+ messageQueueRef.current.push(msg);
+ setQueueLength(messageQueueRef.current.length);
+ return;
}
+ dispatchMessage(msg);
};
const handleModeChange = useCallback((newMode: string) => {
@@ -247,14 +322,33 @@ const AgentChat: React.FC = ({ sessionId: sessionIdProp, onClose
dispatch(stopAgent({ sessionId: id }));
};
- const handleEdit = useCallback(
+ const handleResume = useCallback(() => {
+ if (!id) return;
+ setShowResumeBubble(false);
+ dispatch(sendMessageThunk({
+ sessionId: id,
+ prompt: "Continue where you left off. Start you're response EXACTLY with 'Sorry, let me pick up where I left off",
+ mode,
+ model,
+ hidden: true,
+ }));
+ }, [id, mode, model, dispatch]);
+
+ const [editingMessageId, setEditingMessageId] = useState(null);
+
+ const handleSaveEdit = useCallback(
(messageId: string, newContent: string) => {
if (!id) return;
dispatch(editMessage({ sessionId: id, messageId, content: newContent }));
+ setEditingMessageId(null);
},
[id, dispatch]
);
+ const handleCancelEdit = useCallback(() => {
+ setEditingMessageId(null);
+ }, []);
+
const activeBranchMessages = useMemo(() => {
if (!session) return [];
const branchId = session.active_branch_id || 'main';
@@ -264,14 +358,74 @@ const AgentChat: React.FC = ({ sessionId: sessionIdProp, onClose
return session.messages.filter((m) => m.branch_id === 'main' || m.branch_id === branchId);
}
- const forkIdx = session.messages.findIndex((m) => m.id === branch.fork_point_message_id);
- const preMessages = session.messages
- .slice(0, forkIdx)
- .filter((m) => m.branch_id === (branch.parent_branch_id || 'main'));
- const branchMessages = session.messages.filter((m) => m.branch_id === branchId);
- return [...preMessages, ...branchMessages];
+ const segments: Array<{ branchId: string; upToMessageId?: string }> = [];
+ let cur = branch;
+ let curId = branchId;
+ while (cur && cur.fork_point_message_id) {
+ segments.unshift({ branchId: curId, upToMessageId: cur.fork_point_message_id });
+ curId = cur.parent_branch_id || 'main';
+ cur = session.branches?.[curId];
+ }
+ segments.unshift({ branchId: curId });
+
+ const result: typeof session.messages = [];
+ for (let i = 0; i < segments.length; i++) {
+ const seg = segments[i];
+ const nextForkMsgId = seg.upToMessageId;
+ if (nextForkMsgId) {
+ const forkIdx = session.messages.findIndex((m) => m.id === nextForkMsgId);
+ const pre = session.messages
+ .slice(0, forkIdx)
+ .filter((m) => m.branch_id === seg.branchId);
+ result.push(...pre);
+ } else if (i < segments.length - 1) {
+ const nextFork = segments[i + 1].upToMessageId;
+ const forkIdx = nextFork
+ ? session.messages.findIndex((m) => m.id === nextFork)
+ : session.messages.length;
+ result.push(
+ ...session.messages.slice(0, forkIdx).filter((m) => m.branch_id === seg.branchId)
+ );
+ } else {
+ result.push(...session.messages.filter((m) => m.branch_id === seg.branchId));
+ }
+ }
+ const leafMsgs = session.messages.filter((m) => m.branch_id === branchId);
+ if (!result.some((m) => m.branch_id === branchId)) {
+ result.push(...leafMsgs);
+ }
+ return result;
}, [session?.messages, session?.active_branch_id, session?.branches]);
+ const handleRegenerate = useCallback(
+ (assistantMsg: AgentMessage) => {
+ if (!id) return;
+ const idx = activeBranchMessages.findIndex((m) => m.id === assistantMsg.id);
+ for (let i = idx - 1; i >= 0; i--) {
+ if (activeBranchMessages[i].role === 'user') {
+ const userMsg = activeBranchMessages[i];
+ const content = typeof userMsg.content === 'string' ? userMsg.content : JSON.stringify(userMsg.content);
+ dispatch(editMessage({ sessionId: id, messageId: userMsg.id, content }));
+ break;
+ }
+ }
+ },
+ [id, activeBranchMessages, dispatch]
+ );
+
+ const handleBranchChat = useCallback(async (upToMessageId: string) => {
+ if (!id) return;
+ const dashId = session?.dashboard_id;
+ const action = await dispatch(duplicateSession({ sessionId: id, dashboardId: dashId, upToMessageId }));
+ if (duplicateSession.fulfilled.match(action)) {
+ if (onBranch) {
+ onBranch(action.payload.id);
+ } else {
+ dispatch(setActiveSession(action.payload.id));
+ }
+ }
+ }, [id, dispatch, onBranch, session?.dashboard_id]);
+
const contextEstimate = useMemo(() => {
const limit = CONTEXT_WINDOWS[model] || 200_000;
let totalChars = 0;
@@ -373,13 +527,33 @@ const AgentChat: React.FC = ({ sessionId: sessionIdProp, onClose
items.push(...outputItems);
} else {
- items.push(msg);
+ if (!msg.hidden) {
+ items.push(msg);
+ }
i++;
}
}
return items;
}, [activeBranchMessages]);
+ const lastAssistantIdsInTurn = useMemo(() => {
+ const ids = new Set();
+ let lastAssistantId: string | null = null;
+ for (const item of renderItems) {
+ if (!isToolGroup(item) && !isToolPair(item)) {
+ const msg = item as AgentMessage;
+ if (msg.role === 'assistant') {
+ lastAssistantId = msg.id;
+ } else if (msg.role === 'user') {
+ if (lastAssistantId) ids.add(lastAssistantId);
+ lastAssistantId = null;
+ }
+ }
+ }
+ if (lastAssistantId) ids.add(lastAssistantId);
+ return ids;
+ }, [renderItems]);
+
const groupMetaRequestedRef = useRef>(new Set());
const groupMetaRefinedRef = useRef>(new Set());
@@ -427,11 +601,33 @@ const AgentChat: React.FC = ({ sessionId: sessionIdProp, onClose
const getSiblingBranches = useCallback(
(messageId: string): string[] => {
if (!session?.branches) return [];
- return Object.values(session.branches)
+
+ const directForks = Object.values(session.branches)
.filter((b) => b.fork_point_message_id === messageId)
.map((b) => b.id);
+ if (directForks.length > 0) {
+ const originalMsg = session.messages.find((m) => m.id === messageId);
+ const parentBranchId = originalMsg?.branch_id || 'main';
+ return [parentBranchId, ...directForks];
+ }
+
+ const msg = session.messages.find((m) => m.id === messageId);
+ if (!msg || msg.role !== 'user') return [];
+ const msgBranch = session.branches[msg.branch_id];
+ if (!msgBranch?.fork_point_message_id) return [];
+ const branchUserMsgs = session.messages.filter(
+ (m) => m.branch_id === msg.branch_id && m.role === 'user'
+ );
+ if (branchUserMsgs.length === 0 || branchUserMsgs[0].id !== messageId) return [];
+
+ const forkPointId = msgBranch.fork_point_message_id;
+ const siblingBranches = Object.values(session.branches)
+ .filter((b) => b.fork_point_message_id === forkPointId)
+ .map((b) => b.id);
+ const parentBranchId = msgBranch.parent_branch_id || 'main';
+ return [parentBranchId, ...siblingBranches];
},
- [session?.branches]
+ [session?.branches, session?.messages]
);
if (!session) {
@@ -527,37 +723,55 @@ const AgentChat: React.FC = ({ sessionId: sessionIdProp, onClose
{renderItems.map((item) => {
if (isToolGroup(item)) {
const groupMeta = session.tool_group_meta?.[item.id];
- return ;
+ return ;
}
if (isToolPair(item)) {
const isPending = item.result === null && sessionRunning;
- return ;
+ return ;
}
const msg = item;
+ const isEditing = editingMessageId === msg.id;
const siblings = getSiblingBranches(msg.id);
const hasBranches = siblings.length > 0;
const currentBranchIdx = hasBranches
? siblings.indexOf(session.active_branch_id || 'main')
: 0;
+ const rawText = typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content);
return (
-
-
- {hasBranches && (
- {
- const prevBranch = siblings[Math.max(0, currentBranchIdx - 1)];
- if (prevBranch && id) dispatch(switchBranch({ sessionId: id, branchId: prevBranch }));
- }}
- onNext={() => {
- const nextBranch = siblings[Math.min(siblings.length - 1, currentBranchIdx + 1)];
- if (nextBranch && id) dispatch(switchBranch({ sessionId: id, branchId: nextBranch }));
- }}
+
+
+ {!isEditing && (msg.role === 'user' || (msg.role === 'assistant' && lastAssistantIdsInTurn.has(msg.id))) && (
+ navigator.clipboard.writeText(rawText)}
+ onEdit={msg.role === 'user' ? () => setEditingMessageId(msg.id) : undefined}
+ onRegenerate={msg.role === 'assistant' ? () => handleRegenerate(msg) : undefined}
+ onBranch={msg.role === 'assistant' ? () => handleBranchChat(msg.id) : undefined}
+ branchNav={
+ hasBranches
+ ? {
+ currentIndex: Math.max(0, currentBranchIdx),
+ totalBranches: siblings.length,
+ onPrevious: () => {
+ const prevBranch = siblings[Math.max(0, currentBranchIdx - 1)];
+ if (prevBranch && id) dispatch(switchBranch({ sessionId: id, branchId: prevBranch }));
+ },
+ onNext: () => {
+ const nextBranch = siblings[Math.min(siblings.length - 1, currentBranchIdx + 1)];
+ if (nextBranch && id) dispatch(switchBranch({ sessionId: id, branchId: nextBranch }));
+ },
+ }
+ : undefined
+ }
/>
)}
-
+
);
})}
{session.streamingMessage && (
@@ -566,6 +780,7 @@ const AgentChat: React.FC = ({ sessionId: sessionIdProp, onClose
key={`streaming-${session.streamingMessage.id}`}
isStreaming
isPending
+ sessionId={session.id}
call={{
id: session.streamingMessage.id,
role: 'tool_call',
@@ -590,9 +805,37 @@ const AgentChat: React.FC = ({ sessionId: sessionIdProp, onClose
/>
)
)}
- {session.status === 'running' && !session.streamingMessage && (
+ {(awaitingResponse || (session.status === 'running' && !session.streamingMessage)) && (
)}
+ {showResumeBubble && session.status === 'stopped' && (
+
+
+
+
+ Resume Agent Response
+
+
+
+ )}
{showScrollButton && (
@@ -627,19 +870,262 @@ const AgentChat: React.FC = ({ sessionId: sessionIdProp, onClose
))
)}
-
+ {isGlowing ? (
+ { e.stopPropagation(); onDismissGlow?.(); }}
+ sx={{
+ mx: 1.5,
+ mb: 1.5,
+ py: 1.25,
+ display: 'flex',
+ alignItems: 'center',
+ justifyContent: 'center',
+ borderRadius: 2.5,
+ cursor: 'pointer',
+ fontWeight: 600,
+ fontSize: '0.85rem',
+ color: c.accent.primary,
+ border: `1.5px solid ${c.accent.primary}`,
+ background: `${c.accent.primary}08`,
+ boxShadow: `0 0 12px ${c.accent.primary}25, inset 0 0 12px ${c.accent.primary}08`,
+ animation: 'continue-chat-glow 2s ease-in-out infinite',
+ transition: 'background 0.15s, box-shadow 0.15s',
+ '@keyframes continue-chat-glow': {
+ '0%, 100%': {
+ boxShadow: `0 0 12px ${c.accent.primary}25, inset 0 0 12px ${c.accent.primary}08`,
+ },
+ '50%': {
+ boxShadow: `0 0 20px ${c.accent.primary}40, inset 0 0 20px ${c.accent.primary}15`,
+ },
+ },
+ '&:hover': {
+ background: `${c.accent.primary}14`,
+ boxShadow: `0 0 24px ${c.accent.primary}50, inset 0 0 20px ${c.accent.primary}18`,
+ },
+ }}
+ >
+ Continue chat
+
+ ) : (
+ { if (queueExpanded) { setQueueExpanded(false); setEditingQueueIdx(null); } }}>
+
+ {queueLength > 0 && (
+
+ { setQueueExpanded((v) => !v); setEditingQueueIdx(null); }}
+ sx={{
+ display: 'inline-flex',
+ alignItems: 'center',
+ gap: 0.5,
+ px: 1.25,
+ py: 0.25,
+ borderRadius: '8px 8px 0 0',
+ bgcolor: c.bg.surface,
+ border: `1px solid ${c.border.subtle}`,
+ borderBottom: 'none',
+ cursor: 'pointer',
+ userSelect: 'none',
+ '&:hover': { bgcolor: c.bg.secondary },
+ transition: 'background 0.12s',
+ }}
+ >
+ {queueExpanded
+ ?
+ :
+ }
+
+ {queueLength} queued
+
+
+ { e.stopPropagation(); messageQueueRef.current = []; setQueueLength(0); setQueueExpanded(false); setEditingQueueIdx(null); }}
+ sx={{ p: 0.15, color: c.text.tertiary, '&:hover': { color: c.status.error } }}
+ >
+
+
+
+
+
+ {queueExpanded && (
+
+ {messageQueueRef.current.map((msg, idx) => (
+ {
+ setDragIdx(idx);
+ e.dataTransfer.effectAllowed = 'move';
+ }}
+ onDragOver={(e) => {
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'move';
+ if (dragIdx !== null && dragIdx !== idx) setDropTargetIdx(idx);
+ }}
+ onDragLeave={() => { if (dropTargetIdx === idx) setDropTargetIdx(null); }}
+ onDrop={(e) => {
+ e.preventDefault();
+ if (dragIdx !== null && dragIdx !== idx) {
+ const q = messageQueueRef.current;
+ const [item] = q.splice(dragIdx, 1);
+ q.splice(idx, 0, item);
+ setQueueLength(q.length);
+ }
+ setDragIdx(null);
+ setDropTargetIdx(null);
+ }}
+ onDragEnd={() => { setDragIdx(null); setDropTargetIdx(null); }}
+ sx={{
+ display: 'flex',
+ alignItems: 'flex-start',
+ gap: 0.75,
+ px: 1.5,
+ py: 1,
+ borderBottom: idx < queueLength - 1 ? `1px solid ${c.border.subtle}` : 'none',
+ '&:hover': { bgcolor: c.bg.secondary },
+ transition: 'background 0.1s, opacity 0.15s',
+ ...(dragIdx === idx ? { opacity: 0.35 } : {}),
+ ...(dropTargetIdx === idx && dragIdx !== null && dragIdx !== idx
+ ? { borderTop: `2px solid ${c.accent.primary}` }
+ : {}),
+ }}
+ >
+
+
+
+ {editingQueueIdx === idx ? (
+
+ setEditingQueueText(e.target.value)}
+ autoFocus
+ onKeyDown={(e) => {
+ if (e.key === 'Enter' && !e.shiftKey) {
+ e.preventDefault();
+ const trimmed = editingQueueText.trim();
+ if (trimmed) {
+ messageQueueRef.current[idx] = { ...messageQueueRef.current[idx], prompt: trimmed };
+ setQueueLength(messageQueueRef.current.length);
+ }
+ setEditingQueueIdx(null);
+ }
+ if (e.key === 'Escape') setEditingQueueIdx(null);
+ }}
+ sx={{
+ '& .MuiOutlinedInput-root': {
+ fontSize: '0.78rem',
+ color: c.text.primary,
+ '& fieldset': { borderColor: c.border.medium },
+ '&.Mui-focused fieldset': { borderColor: c.accent.primary },
+ },
+ }}
+ />
+ {
+ const trimmed = editingQueueText.trim();
+ if (trimmed) {
+ messageQueueRef.current[idx] = { ...messageQueueRef.current[idx], prompt: trimmed };
+ setQueueLength(messageQueueRef.current.length);
+ }
+ setEditingQueueIdx(null);
+ }}
+ sx={{ p: 0.25, color: c.accent.primary, mt: 0.25 }}
+ >
+
+
+
+ ) : (
+
+ {msg.prompt}
+
+ )}
+ {editingQueueIdx !== idx && (
+
+
+ { setEditingQueueIdx(idx); setEditingQueueText(msg.prompt); }}
+ sx={{ p: 0.25, color: c.text.tertiary, '&:hover': { color: c.text.primary } }}
+ >
+
+
+
+
+ {
+ messageQueueRef.current.splice(idx, 1);
+ setQueueLength(messageQueueRef.current.length);
+ if (messageQueueRef.current.length === 0) setQueueExpanded(false);
+ }}
+ sx={{ p: 0.25, color: c.text.tertiary, '&:hover': { color: c.status.error } }}
+ >
+
+
+
+
+ )}
+
+ ))}
+
+ )}
+
+ )}
+
+
+
+ )}
);
diff --git a/frontend/src/app/pages/AgentChat/BranchNavigator.tsx b/frontend/src/app/pages/AgentChat/BranchNavigator.tsx
index 4dbabb95..e506f8c5 100644
--- a/frontend/src/app/pages/AgentChat/BranchNavigator.tsx
+++ b/frontend/src/app/pages/AgentChat/BranchNavigator.tsx
@@ -21,31 +21,38 @@ const BranchNavigator: React.FC = ({ currentIndex, totalBranches, onPrevi
-
-
-
-
- {currentIndex + 1}/{totalBranches}
-
-
-
-
+
+
+
+
+ {currentIndex + 1} / {totalBranches}
+
+
+
+
+
);
};
diff --git a/frontend/src/app/pages/AgentChat/BrowserAgentInlineFeed.tsx b/frontend/src/app/pages/AgentChat/BrowserAgentInlineFeed.tsx
new file mode 100644
index 00000000..010c1782
--- /dev/null
+++ b/frontend/src/app/pages/AgentChat/BrowserAgentInlineFeed.tsx
@@ -0,0 +1,403 @@
+import React, { useEffect, useRef, useMemo } from 'react';
+import Box from '@mui/material/Box';
+import Typography from '@mui/material/Typography';
+import SmartToyOutlinedIcon from '@mui/icons-material/SmartToyOutlined';
+import CheckCircleOutlineIcon from '@mui/icons-material/CheckCircleOutline';
+import ErrorOutlineIcon from '@mui/icons-material/ErrorOutline';
+import LanguageIcon from '@mui/icons-material/Language';
+import OpenInNewIcon from '@mui/icons-material/OpenInNew';
+import TouchAppOutlinedIcon from '@mui/icons-material/TouchAppOutlined';
+import KeyboardOutlinedIcon from '@mui/icons-material/KeyboardOutlined';
+import CameraAltOutlinedIcon from '@mui/icons-material/CameraAltOutlined';
+import ArticleOutlinedIcon from '@mui/icons-material/ArticleOutlined';
+import AccountTreeOutlinedIcon from '@mui/icons-material/AccountTreeOutlined';
+import CodeOutlinedIcon from '@mui/icons-material/CodeOutlined';
+import BuildOutlinedIcon from '@mui/icons-material/BuildOutlined';
+import { createSelector } from '@reduxjs/toolkit';
+import { useAppSelector, useAppDispatch } from '@/shared/hooks';
+import { AgentMessage, AgentSession, fetchBrowserAgentChildren } from '@/shared/state/agentsSlice';
+import { useClaudeTokens, useThemeMode } from '@/shared/styles/ThemeContext';
+import type { RootState } from '@/shared/state/store';
+
+interface Props {
+ parentSessionId: string;
+ browserId?: string;
+}
+
+interface FeedEntry {
+ type: 'thought' | 'action' | 'result' | 'system';
+ text: string;
+ actionTool?: string;
+ sessionLabel?: string;
+}
+
+function formatMessage(msg: AgentMessage): FeedEntry | null {
+ if (msg.role === 'user') return null;
+
+ if (msg.role === 'assistant' && typeof msg.content === 'string') {
+ const trimmed = msg.content.trim();
+ if (!trimmed) return null;
+ return { type: 'thought', text: trimmed };
+ }
+
+ if (msg.role === 'tool_call') {
+ const content =
+ typeof msg.content === 'string'
+ ? (() => { try { return JSON.parse(msg.content); } catch { return {}; } })()
+ : msg.content;
+ const tool = content?.tool || content?.name || '?';
+ const input = content?.input || {};
+ let brief = '';
+ switch (tool) {
+ case 'BrowserNavigate':
+ brief = `Navigate → ${input.url || '...'}`;
+ break;
+ case 'BrowserClick':
+ brief = `Click ${input.selector || '...'}`;
+ break;
+ case 'BrowserType': {
+ const txt = (input.text || '').slice(0, 40);
+ const ellipsis = (input.text || '').length > 40 ? '…' : '';
+ brief = `Type "${txt}${ellipsis}" into ${input.selector || '...'}`;
+ break;
+ }
+ case 'BrowserScreenshot':
+ brief = 'Screenshot';
+ break;
+ case 'BrowserGetText':
+ brief = 'Read page text';
+ break;
+ case 'BrowserGetElements':
+ brief = `Inspect elements${input.selector ? ` (${input.selector})` : ''}`;
+ break;
+ case 'BrowserEvaluate':
+ brief = `Evaluate JS`;
+ break;
+ default:
+ brief = `${tool}(${JSON.stringify(input).slice(0, 60)})`;
+ }
+ return { type: 'action', text: brief, actionTool: tool };
+ }
+
+ if (msg.role === 'tool_result') {
+ const content =
+ typeof msg.content === 'string'
+ ? (() => { try { return JSON.parse(msg.content); } catch { return { text: msg.content }; } })()
+ : msg.content;
+ const toolName = content?.tool_name || '';
+ const elapsed = content?.elapsed_ms;
+ const text = content?.text || '';
+
+ if (toolName === 'BrowserScreenshot') {
+ return { type: 'result', text: `Screenshot captured${elapsed ? ` (${elapsed}ms)` : ''}` };
+ }
+ const preview = text.length > 120 ? text.slice(0, 120) + '…' : text;
+ return { type: 'result', text: `${preview}${elapsed ? ` (${elapsed}ms)` : ''}` };
+ }
+
+ if (msg.role === 'system') {
+ return { type: 'system', text: typeof msg.content === 'string' ? msg.content : '' };
+ }
+
+ return null;
+}
+
+type SvgIconComponent = typeof OpenInNewIcon;
+
+function getActionIcon(tool?: string): SvgIconComponent {
+ switch (tool) {
+ case 'BrowserNavigate': return OpenInNewIcon;
+ case 'BrowserClick': return TouchAppOutlinedIcon;
+ case 'BrowserType': return KeyboardOutlinedIcon;
+ case 'BrowserScreenshot': return CameraAltOutlinedIcon;
+ case 'BrowserGetText': return ArticleOutlinedIcon;
+ case 'BrowserGetElements': return AccountTreeOutlinedIcon;
+ case 'BrowserEvaluate': return CodeOutlinedIcon;
+ default: return BuildOutlinedIcon;
+ }
+}
+
+interface FeedColors {
+ thought: string;
+ thoughtIcon: string;
+ result: string;
+ error: string;
+ errorIcon: string;
+ scrollThumb: string;
+}
+
+const darkFeedColors: FeedColors = {
+ thought: '#a0aab8',
+ thoughtIcon: '#555b6e',
+ result: '#555b6e',
+ error: '#ff8787',
+ errorIcon: '#ff8787',
+ scrollThumb: '#2a2d3e',
+};
+
+const lightFeedColors: FeedColors = {
+ thought: '#555550',
+ thoughtIcon: '#9e9c95',
+ result: '#9e9c95',
+ error: '#c03030',
+ errorIcon: '#c03030',
+ scrollThumb: '#ccc9c0',
+};
+
+const selectBrowserSessions = createSelector(
+ [(state: RootState) => state.agents.sessions,
+ (_: RootState, parentSessionId: string) => parentSessionId,
+ (_: RootState, __: string, browserId?: string) => browserId],
+ (sessions, parentSessionId, browserId) =>
+ Object.values(sessions).filter(
+ (s): s is AgentSession =>
+ s.mode === 'browser-agent' &&
+ s.parent_session_id === parentSessionId &&
+ (!browserId || s.browser_id === browserId),
+ ),
+);
+
+const BrowserAgentInlineFeed: React.FC = ({ parentSessionId, browserId }) => {
+ const c = useClaudeTokens();
+ const dispatch = useAppDispatch();
+ const { mode } = useThemeMode();
+ const fc = mode === 'dark' ? darkFeedColors : lightFeedColors;
+ const scrollRef = useRef(null);
+ const fetchedForSession = useRef(null);
+
+ const browserSessions = useAppSelector((state) =>
+ selectBrowserSessions(state, parentSessionId, browserId),
+ );
+
+ useEffect(() => {
+ if (browserSessions.length === 0 && fetchedForSession.current !== parentSessionId) {
+ fetchedForSession.current = parentSessionId;
+ dispatch(fetchBrowserAgentChildren(parentSessionId))
+ .unwrap()
+ .catch(() => { fetchedForSession.current = null; });
+ }
+ }, [browserSessions.length, parentSessionId, dispatch]);
+
+ const sessionsWithEntries = useMemo(() => {
+ return browserSessions.map((session) => {
+ const entries: FeedEntry[] = [];
+ for (const msg of session.messages) {
+ const entry = formatMessage(msg);
+ if (entry) entries.push(entry);
+ }
+ if (session.streamingMessage?.role === 'assistant' && session.streamingMessage.content) {
+ entries.push({ type: 'thought', text: session.streamingMessage.content });
+ }
+ return { session, entries };
+ });
+ }, [browserSessions]);
+
+ const totalMessages = browserSessions.reduce(
+ (n, s) => n + s.messages.length + (s.streamingMessage ? 1 : 0),
+ 0,
+ );
+
+ useEffect(() => {
+ if (scrollRef.current) {
+ scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
+ }
+ }, [totalMessages]);
+
+ if (browserSessions.length === 0) return null;
+
+ const showLabels = sessionsWithEntries.length > 1;
+ const accentColor = c.accent.primary;
+
+ return (
+
+ {sessionsWithEntries.map(({ session, entries }, si) => (
+
+ {showLabels && (
+ 0 ? 1 : 0, mb: 0.25 }}>
+
+
+ {session.browser_id || `Browser ${si + 1}`}
+
+
+
+ )}
+
+ {!showLabels && entries.length === 0 && session.status === 'running' && (
+
+ Starting browser agent...
+
+ )}
+
+ {entries.map((entry, i) => (
+
+ ))}
+
+ {!showLabels && session.status === 'running' && entries.length > 0 && (
+
+
+
+ )}
+
+ ))}
+
+ );
+};
+
+const EntryRow: React.FC<{ entry: FeedEntry; accentColor: string; fc: FeedColors }> = ({ entry, accentColor, fc }) => {
+ const c = useClaudeTokens();
+
+ if (entry.type === 'thought') {
+ return (
+
+
+
+ {entry.text}
+
+
+ );
+ }
+
+ if (entry.type === 'action') {
+ const ActionIcon = getActionIcon(entry.actionTool);
+ return (
+
+
+
+ {entry.text}
+
+
+ );
+ }
+
+ if (entry.type === 'result') {
+ return (
+
+
+ ↳ {entry.text}
+
+
+ );
+ }
+
+ if (entry.type === 'system') {
+ return (
+
+
+
+ {entry.text}
+
+
+ );
+ }
+
+ return null;
+};
+
+const SessionStatusChip: React.FC<{ status: string }> = ({ status }) => {
+ const c = useClaudeTokens();
+ if (status === 'running') {
+ return (
+
+ );
+ }
+ if (status === 'completed') {
+ return ;
+ }
+ if (status === 'error') {
+ return ;
+ }
+ return null;
+};
+
+export default React.memo(BrowserAgentInlineFeed);
diff --git a/frontend/src/app/pages/AgentChat/ChatInput.tsx b/frontend/src/app/pages/AgentChat/ChatInput.tsx
index ff028b5d..d07e4cb1 100644
--- a/frontend/src/app/pages/AgentChat/ChatInput.tsx
+++ b/frontend/src/app/pages/AgentChat/ChatInput.tsx
@@ -26,6 +26,7 @@ import AttachFileIcon from '@mui/icons-material/AttachFile';
import AdsClickIcon from '@mui/icons-material/AdsClick';
import CommandPicker, { CommandPickerItem, getToolGroupIcon } from '@/app/components/CommandPicker';
import { useElementSelection, SelectedElement } from '@/app/components/ElementSelectionContext';
+import { getClipboardCards, clearClipboard } from '@/shared/dashboardClipboard';
import { getWebview } from '@/shared/browserRegistry';
import { API_BASE } from '@/shared/config';
import { ContextPath } from '@/app/components/DirectoryBrowser';
@@ -73,6 +74,7 @@ interface Props {
embedded?: boolean;
autoFocus?: boolean;
sessionId?: string;
+ queueLength?: number;
}
export interface ChatInputHandle {
@@ -130,7 +132,7 @@ const ContextRing: React.FC<{ used: number; limit: number; accentColor: string;
);
};
-const ChatInput = forwardRef(({ onSend, disabled, mode, onModeChange, model, onModelChange, isRunning, onStop, autoRunMode, contextEstimate, embedded, autoFocus, sessionId }, ref) => {
+const ChatInput = forwardRef(({ onSend, disabled, mode, onModeChange, model, onModelChange, isRunning, onStop, autoRunMode, contextEstimate, embedded, autoFocus, sessionId, queueLength = 0 }, ref) => {
const c = useClaudeTokens();
const editorRef = useRef(null);
const containerRef = useRef(null);
@@ -138,6 +140,9 @@ const ChatInput = forwardRef(({ onSend, disabled, mode,
const dispatch = useAppDispatch();
const elementSelection = useElementSelection();
+ const fallbackOwnerIdRef = useRef(`input-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 6)}`);
+ const ownerId = sessionId || fallbackOwnerIdRef.current;
+
useEffect(() => {
if (autoFocus) editorRef.current?.focus();
}, [autoFocus]);
@@ -281,7 +286,7 @@ const ChatInput = forwardRef(({ onSend, disabled, mode,
let trimmed = serialized.trim();
if (!trimmed) return;
- const selectedEls = elementSelection?.selectedElements ?? [];
+ const selectedEls = elementSelection?.elementsByOwner?.[ownerId] ?? [];
let allImages = images.length > 0
? images.map(({ data, media_type }) => ({ data, media_type }))
: [];
@@ -298,7 +303,7 @@ const ChatInput = forwardRef(({ onSend, disabled, mode,
lines.push(`${i + 1}. [Browser Card] ${title}`);
lines.push(` browser_id: ${el.semanticData.selectId}`);
if (url) lines.push(` URL: ${url}`);
- lines.push(` (Use BrowserAgent with this browser_id to interact with it)`);
+ lines.push(` (Use BrowserAgent with this browser_id to interact with it, or CreateBrowserAgent for a new browser)`);
} else if (el.semanticType && el.semanticData) {
const typeLabel = {
'agent-card': 'Agent Card',
@@ -317,6 +322,9 @@ const ChatInput = forwardRef(({ onSend, disabled, mode,
.map(([k, v]) => `${k}: ${typeof v === 'string' ? v : JSON.stringify(v)}`)
.join(', ');
if (metaStr) lines.push(` ${metaStr}`);
+ if (el.semanticType === 'agent-card' && selectId) {
+ lines.push(` (Use InvokeAgent with session_id "${selectId}" to query this agent with full conversation context)`);
+ }
} else {
const styleStr = Object.entries(el.computedStyles)
.map(([k, v]) => `${k}: ${v}`)
@@ -359,8 +367,8 @@ const ChatInput = forwardRef(({ onSend, disabled, mode,
setForcedTools([]);
setAttachedSkills({});
setHasContent(false);
- elementSelection?.clearSelectedElements();
- }, [disabled, images, contextPaths, forcedTools, onSend, elementSelection]);
+ elementSelection?.clearOwnerElements(ownerId);
+ }, [disabled, images, contextPaths, forcedTools, onSend, elementSelection, ownerId]);
const detectTrigger = useCallback(() => {
const result = detectEditorTrigger();
@@ -469,6 +477,41 @@ const ChatInput = forwardRef(({ onSend, disabled, mode,
};
const handlePaste = useCallback((e: React.ClipboardEvent) => {
+ const copied = getClipboardCards();
+ if (copied.length > 0 && elementSelection) {
+ e.preventDefault();
+ for (const card of copied) {
+ const semanticTypeMap: Record = {
+ agent: 'agent-card',
+ view: 'view-card',
+ browser: 'browser-card',
+ };
+ const semanticType = semanticTypeMap[card.type];
+ if (!semanticType) continue;
+ const labelMap: Record = {
+ 'agent-card': 'Agent',
+ 'view-card': 'View',
+ 'browser-card': 'Browser',
+ };
+ const semanticLabel = (labelMap[semanticType] || semanticType) + ': ' + card.name;
+ const el: SelectedElement = {
+ id: `sel-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
+ selectorPath: `[data-select-type="${semanticType}"][data-select-id="${card.id}"]`,
+ tagName: 'DIV',
+ className: '',
+ outerHTML: '',
+ computedStyles: {},
+ boundingRect: { x: 0, y: 0, width: 0, height: 0 },
+ semanticType,
+ semanticLabel,
+ semanticData: { ...card.meta, selectId: card.id },
+ };
+ elementSelection.addElementForOwner(ownerId, el);
+ }
+ clearClipboard();
+ return;
+ }
+
const items = e.clipboardData?.items;
if (!items) return;
const imageFiles: File[] = [];
@@ -486,7 +529,7 @@ const ChatInput = forwardRef(({ onSend, disabled, mode,
e.preventDefault();
const plain = e.clipboardData.getData('text/plain');
if (plain) document.execCommand('insertText', false, plain);
- }, [addImageFiles]);
+ }, [addImageFiles, elementSelection, ownerId]);
const handleDragOver = useCallback((e: React.DragEvent) => {
e.preventDefault();
@@ -535,7 +578,7 @@ const ChatInput = forwardRef(({ onSend, disabled, mode,
},
};
- const selectedElements = elementSelection?.selectedElements ?? [];
+ const selectedElements = elementSelection?.elementsByOwner?.[ownerId] ?? [];
const hasAttachments = images.length > 0 || contextPaths.length > 0 || forcedTools.length > 0 || selectedElements.length > 0;
return (
@@ -783,7 +826,7 @@ const ChatInput = forwardRef(({ onSend, disabled, mode,
icon={ }
label={chipLabel}
size="small"
- onDelete={() => elementSelection?.removeSelectedElement(el.id)}
+ onDelete={() => elementSelection?.removeOwnerElement(ownerId, el.id)}
sx={{
bgcolor: 'rgba(59, 130, 246, 0.1)',
color: '#3b82f6',
@@ -849,7 +892,7 @@ const ChatInput = forwardRef(({ onSend, disabled, mode,
userSelect: 'none',
}}
>
- {disabled ? 'Agent is working...' : autoRunMode ? 'Describe what data to generate…' : `${modeConf.label}, @ for context, / for commands`}
+ {disabled ? 'Agent is working...' : autoRunMode ? 'Describe what data to generate…' : isRunning ? (queueLength > 0 ? `${queueLength} queued — type another or wait…` : 'Agent is working — messages will queue…') : `${modeConf.label}, @ for context, / for commands`}
)}
@@ -977,40 +1020,54 @@ const ChatInput = forwardRef(({ onSend, disabled, mode,
/>
)}
- {elementSelection && !autoRunMode && (
-
- {
- if (!elementSelection.selectMode && sessionId) {
- elementSelection.setExcludeSelectId(sessionId);
- }
- elementSelection.toggleSelectMode();
- }}
- sx={{
- p: 0.5,
- ...(elementSelection.selectMode
- ? {
- bgcolor: '#3b82f6',
- color: '#fff',
- '&:hover': { bgcolor: '#2563eb' },
- animation: 'selectBtnPulse 2s ease-in-out infinite',
- '@keyframes selectBtnPulse': {
- '0%, 100%': { boxShadow: '0 0 0 0 rgba(59,130,246,0.4)' },
- '50%': { boxShadow: '0 0 0 4px rgba(59,130,246,0.1)' },
- },
+ {elementSelection && !autoRunMode && (() => {
+ const isMySelectMode = elementSelection.selectMode && elementSelection.activeOwnerId === ownerId;
+ return (
+
+ e.preventDefault()}
+ onClick={() => {
+ if (isMySelectMode) {
+ elementSelection.setSelectMode(false);
+ } else {
+ if (elementSelection.activeOwnerId !== ownerId) {
+ elementSelection.clearOwnerElements(ownerId);
}
- : {
- color: c.text.tertiary,
- '&:hover': { color: c.text.secondary, bgcolor: 'rgba(0,0,0,0.04)' },
- }),
- transition: 'background-color 0.15s, color 0.15s',
- }}
- >
-
-
-
- )}
+ elementSelection.setActiveOwnerId(ownerId);
+ if (sessionId) {
+ elementSelection.setExcludeSelectId(sessionId);
+ } else {
+ elementSelection.setExcludeSelectId(null);
+ }
+ elementSelection.setSelectMode(true);
+ }
+ }}
+ sx={{
+ p: 0.5,
+ ...(isMySelectMode
+ ? {
+ bgcolor: '#3b82f6',
+ color: '#fff',
+ '&:hover': { bgcolor: '#2563eb' },
+ animation: 'selectBtnPulse 2s ease-in-out infinite',
+ '@keyframes selectBtnPulse': {
+ '0%, 100%': { boxShadow: '0 0 0 0 rgba(59,130,246,0.4)' },
+ '50%': { boxShadow: '0 0 0 4px rgba(59,130,246,0.1)' },
+ },
+ }
+ : {
+ color: c.text.tertiary,
+ '&:hover': { color: c.text.secondary, bgcolor: 'rgba(0,0,0,0.04)' },
+ }),
+ transition: 'background-color 0.15s, color 0.15s',
+ }}
+ >
+
+
+
+ );
+ })()}
(({ onSend, disabled, mode,
- {!autoRunMode && (isRunning ? (
-
-
-
-
-
- ) : hasContent ? (
-
-
-
-
-
- ) : (
-
-
-
-
-
-
-
- ))}
+ {!autoRunMode && (
+
+ {hasContent && (
+
+
+
+
+
+ )}
+ {isRunning ? (
+
+
+
+
+
+ ) : !hasContent ? (
+
+
+
+
+
+
+
+ ) : null}
+
+ )}
{selectedTemplate && (
diff --git a/frontend/src/app/pages/AgentChat/MessageActionBar.tsx b/frontend/src/app/pages/AgentChat/MessageActionBar.tsx
new file mode 100644
index 00000000..5ff19921
--- /dev/null
+++ b/frontend/src/app/pages/AgentChat/MessageActionBar.tsx
@@ -0,0 +1,153 @@
+import React, { useState } from 'react';
+import Box from '@mui/material/Box';
+import IconButton from '@mui/material/IconButton';
+import Typography from '@mui/material/Typography';
+import Tooltip from '@mui/material/Tooltip';
+import ContentCopyIcon from '@mui/icons-material/ContentCopy';
+import CheckIcon from '@mui/icons-material/Check';
+import EditIcon from '@mui/icons-material/Edit';
+import BookmarkBorderIcon from '@mui/icons-material/BookmarkBorder';
+import ReplayIcon from '@mui/icons-material/Replay';
+import CallSplitIcon from '@mui/icons-material/CallSplit';
+import ChevronLeftIcon from '@mui/icons-material/ChevronLeft';
+import ChevronRightIcon from '@mui/icons-material/ChevronRight';
+import { useClaudeTokens } from '@/shared/styles/ThemeContext';
+
+interface BranchNavProps {
+ currentIndex: number;
+ totalBranches: number;
+ onPrevious: () => void;
+ onNext: () => void;
+}
+
+interface Props {
+ role: 'user' | 'assistant';
+ onCopy: () => void;
+ onEdit?: () => void;
+ onRegenerate?: () => void;
+ onBranch?: () => void;
+ branchNav?: BranchNavProps;
+}
+
+const btnSx = (c: ReturnType) => ({
+ color: c.text.tertiary,
+ p: 0.4,
+ '&:hover': { color: c.text.secondary, bgcolor: 'transparent' },
+ '&.Mui-disabled': { color: c.border.medium },
+});
+
+const MessageActionBar: React.FC = ({
+ role,
+ onCopy,
+ onEdit,
+ onRegenerate,
+ onBranch,
+ branchNav,
+}) => {
+ const c = useClaudeTokens();
+ const [copied, setCopied] = useState(false);
+
+ const handleCopy = () => {
+ onCopy();
+ setCopied(true);
+ setTimeout(() => setCopied(false), 1500);
+ };
+
+ const isUser = role === 'user';
+
+ return (
+
+ {isUser ? (
+ <>
+
+
+
+
+
+
+
+
+
+ {copied ? : }
+
+
+ {onEdit && (
+
+
+
+
+
+ )}
+ {branchNav && branchNav.totalBranches > 1 && (
+
+
+
+
+
+ {branchNav.currentIndex + 1} / {branchNav.totalBranches}
+
+
+
+
+
+ )}
+ >
+ ) : (
+ <>
+
+
+ {copied ? : }
+
+
+ {onRegenerate && (
+
+
+
+
+
+ )}
+ {onBranch && (
+
+
+
+
+
+ )}
+ >
+ )}
+
+ );
+};
+
+export default MessageActionBar;
diff --git a/frontend/src/app/pages/AgentChat/MessageBubble.tsx b/frontend/src/app/pages/AgentChat/MessageBubble.tsx
index 5fbd998e..11cfb126 100644
--- a/frontend/src/app/pages/AgentChat/MessageBubble.tsx
+++ b/frontend/src/app/pages/AgentChat/MessageBubble.tsx
@@ -8,7 +8,6 @@ import Chip from '@mui/material/Chip';
import Tooltip from '@mui/material/Tooltip';
import Collapse from '@mui/material/Collapse';
import Modal from '@mui/material/Modal';
-import EditIcon from '@mui/icons-material/Edit';
import CloseIcon from '@mui/icons-material/Close';
import AdsClickIcon from '@mui/icons-material/AdsClick';
import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
@@ -391,13 +390,14 @@ const MessageImageThumbnails: React.FC<{
interface Props {
message: AgentMessage;
- onEdit?: (messageId: string, newContent: string) => void;
+ editing?: boolean;
+ onSaveEdit?: (messageId: string, newContent: string) => void;
+ onCancelEdit?: () => void;
isStreaming?: boolean;
}
-const MessageBubble: React.FC = React.memo(({ message, onEdit, isStreaming }) => {
+const MessageBubble: React.FC = React.memo(({ message, editing = false, onSaveEdit, onCancelEdit, isStreaming }) => {
const c = useClaudeTokens();
- const [editing, setEditing] = useState(false);
const [editText, setEditText] = useState('');
const { role, content } = message;
@@ -440,23 +440,22 @@ const MessageBubble: React.FC = React.memo(({ message, onEdit, isStreamin
? parseElementContext(rawText)
: { userMessage: rawText, elements: [] };
- const handleStartEdit = () => {
- setEditText(rawText);
- setEditing(true);
- };
+ React.useEffect(() => {
+ if (editing) setEditText(rawText);
+ }, [editing, rawText]);
const handleCancelEdit = () => {
- setEditing(false);
setEditText('');
+ onCancelEdit?.();
};
const handleSaveEdit = () => {
const trimmed = editText.trim();
- if (trimmed && trimmed !== rawText && onEdit) {
- onEdit(message.id, trimmed);
+ if (trimmed && trimmed !== rawText && onSaveEdit) {
+ onSaveEdit(message.id, trimmed);
}
- setEditing(false);
setEditText('');
+ onCancelEdit?.();
};
const truncatedContent = typeof content === 'string'
@@ -472,26 +471,8 @@ const MessageBubble: React.FC = React.memo(({ message, onEdit, isStreamin
display: 'flex',
justifyContent: isUser ? 'flex-end' : 'flex-start',
my: 0.75,
- '&:hover .edit-btn': { opacity: 1 },
}}
>
- {isUser && onEdit && !editing && (
-
-
-
- )}
= React.memo(({ message, onEdit, isStreamin
'& a': { color: c.accent.primary },
}}
>
- {rawText}
+ (
+ {children}
+ ),
+ }}
+ >{rawText}
{isStreaming && }
)}
diff --git a/frontend/src/app/pages/AgentChat/ToolCallBubble.tsx b/frontend/src/app/pages/AgentChat/ToolCallBubble.tsx
index f058b69e..1b2bf7ef 100644
--- a/frontend/src/app/pages/AgentChat/ToolCallBubble.tsx
+++ b/frontend/src/app/pages/AgentChat/ToolCallBubble.tsx
@@ -1,8 +1,9 @@
-import React, { useState, useEffect, useCallback, useMemo } from 'react';
+import React, { useState, useEffect, useCallback, useMemo, useRef } from 'react';
import Box from '@mui/material/Box';
import Typography from '@mui/material/Typography';
import Collapse from '@mui/material/Collapse';
import IconButton from '@mui/material/IconButton';
+import Tooltip from '@mui/material/Tooltip';
import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
import ExpandLessIcon from '@mui/icons-material/ExpandLess';
import TerminalIcon from '@mui/icons-material/Terminal';
@@ -15,10 +16,14 @@ import FolderIcon from '@mui/icons-material/Folder';
import AttachFileIcon from '@mui/icons-material/AttachFile';
import SearchIcon from '@mui/icons-material/Search';
import SendIcon from '@mui/icons-material/Send';
+import CallSplitIcon from '@mui/icons-material/CallSplit';
import ReactMarkdown from 'react-markdown';
import remarkGfm from 'remark-gfm';
-import { AgentMessage } from '@/shared/state/agentsSlice';
+import { AgentMessage, expandSession, collapseSession, fetchSession } from '@/shared/state/agentsSlice';
+import { useAppDispatch, useAppSelector } from '@/shared/hooks';
+import { placeCard, removeCard, setGlowingAgentCard, clearGlowingAgentCard, DEFAULT_CARD_W, DEFAULT_CARD_H, EXPANDED_CARD_MIN_H, GRID_GAP } from '@/shared/state/dashboardLayoutSlice';
import { useClaudeTokens, useThemeMode } from '@/shared/styles/ThemeContext';
+import BrowserAgentInlineFeed from './BrowserAgentInlineFeed';
const GoogleServiceIcon: React.FC<{ service: string; size?: number }> = ({ service, size = 14 }) => {
if (service === 'gmail') {
@@ -68,7 +73,13 @@ export interface ToolPair {
result: AgentMessage | null;
}
-const pulsingKeyframes = `
+let toolCallKeyframesInjected = false;
+function ensureToolCallKeyframes() {
+ if (toolCallKeyframesInjected) return;
+ toolCallKeyframesInjected = true;
+ const style = document.createElement('style');
+ style.setAttribute('data-tool-call-keyframes', '');
+ style.textContent = `
@keyframes tool-pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.4; }
@@ -77,14 +88,13 @@ const pulsingKeyframes = `
0%, 100% { box-shadow: 0 0 0 0 rgba(var(--glow-rgb), 0); }
50% { box-shadow: 0 0 10px 2px rgba(var(--glow-rgb), 0.12); }
}
-`;
-
-const streamingCursorKeyframes = `
@keyframes blink-cursor {
0%, 100% { opacity: 1; }
50% { opacity: 0; }
}
`;
+ document.head.appendChild(style);
+}
const ElapsedTimer: React.FC<{ startTime: string }> = ({ startTime }) => {
const c = useClaudeTokens();
@@ -466,6 +476,7 @@ interface ToolCallBubbleProps {
isPending?: boolean;
isStreaming?: boolean;
mcpCompact?: boolean;
+ sessionId?: string;
}
interface TermColors {
@@ -929,7 +940,7 @@ const GmailCard: React.FC<{ data: Record; action: string; hideSubje
}}>
{children} }}
+ components={{ a: ({ children, ...props }) => {children} }}
>
{email.bodyPreview || email.snippet}
@@ -1169,18 +1180,92 @@ const McpResultCard: React.FC<{ parsed: ParsedMcpResult; compact?: boolean }> =
return ;
};
+function isBrowserAgentTool(name: string): boolean {
+ if (name === 'CreateBrowserAgent' || name === 'BrowserAgent' || name === 'BrowserAgents') return true;
+ const mcp = parseMcpToolName(name);
+ return mcp.isMcp && mcp.serverSlug === 'openswarm-browser-agent';
+}
+
+function isInvokeAgentTool(name: string): boolean {
+ if (name === 'InvokeAgent') return true;
+ const mcp = parseMcpToolName(name);
+ return mcp.isMcp && mcp.serverSlug === 'openswarm-invoke-agent';
+}
+
+function isCreateAgentTool(name: string): boolean {
+ return name === 'Agent';
+}
+
+function parseInvokedSessionId(rawText: string): string | null {
+ const match = rawText.match(/\(forked session:\s*([a-f0-9]+)\)/);
+ return match ? match[1] : null;
+}
+
+interface InvokeAgentParsed {
+ agentName: string;
+ sessionId: string | null;
+ cost: string | null;
+ response: string;
+}
+
+function parseCreateAgentResult(rawText: string): string {
+ if (!rawText) return '';
+ try {
+ const parsed = JSON.parse(rawText);
+ if (typeof parsed === 'string') return parsed;
+ if (typeof parsed === 'object' && parsed !== null) {
+ if (parsed.text) return parsed.text;
+ if (parsed.content) return typeof parsed.content === 'string' ? parsed.content : JSON.stringify(parsed.content);
+ if (parsed.result) return typeof parsed.result === 'string' ? parsed.result : JSON.stringify(parsed.result);
+ }
+ } catch {}
+ return rawText;
+}
+
+function parseInvokeAgentResult(rawText: string): InvokeAgentParsed | null {
+ const headerMatch = rawText.match(
+ /\*\*Invoked Agent Result\*\*(?:\s*—\s*(.+?))?\s*\(forked session:\s*([a-f0-9]+)\)/,
+ );
+ if (!headerMatch) return null;
+
+ const agentName = headerMatch[1]?.trim() || 'Agent';
+ const sessionId = headerMatch[2];
+
+ const costMatch = rawText.match(/\*Cost:\s*\$([0-9.]+)\*/);
+ const cost = costMatch ? costMatch[1] : null;
+
+ const bodyStart = rawText.indexOf('\n\n');
+ let response = bodyStart >= 0 ? rawText.slice(bodyStart + 2).trim() : '';
+ if (response.startsWith('*Cost:')) {
+ const afterCost = response.indexOf('\n');
+ response = afterCost >= 0 ? response.slice(afterCost + 1).trim() : '';
+ }
+
+ return { agentName, sessionId, cost, response };
+}
+
const ToolCallBubble: React.FC = React.memo(
- ({ call, result = null, isPending = false, isStreaming = false, mcpCompact = false }) => {
+ ({ call, result = null, isPending = false, isStreaming = false, mcpCompact = false, sessionId }) => {
+ ensureToolCallKeyframes();
+
const c = useClaudeTokens();
const tc = useTermColors();
+ const dispatch = useAppDispatch();
+ const cards = useAppSelector((s) => s.dashboardLayout.cards);
const [expanded, setExpanded] = useState(false);
+ const bubbleRef = useRef(null);
const { toolName, input, isDenied } = getToolData(call);
const mcpInfo = useMemo(() => parseMcpToolName(toolName), [toolName]);
const inputSummary = getInputSummary(toolName, input);
const formattedInput = useMemo(() => formatInputDisplay(toolName, input), [toolName, input]);
const showTimer = isPending && !isDenied && !isStreaming;
- const showBody = expanded || isStreaming;
+
+ const isBrowserAgent = isBrowserAgentTool(toolName);
+ const isInvokeAgent = isInvokeAgentTool(toolName);
+ const isCreateAgent = isCreateAgentTool(toolName);
+ const browserAgentAutoExpand = isBrowserAgent && isPending && !isStreaming;
+ const showBody = expanded || isStreaming || browserAgentAutoExpand;
const resultContent = result?.content;
const hasStructuredResult =
@@ -1206,6 +1291,95 @@ const ToolCallBubble: React.FC = React.memo(
(parsedResult?.type === 'bash' && parsedResult.exitCode !== null && parsedResult.exitCode !== 0) ||
(parsedResult?.type === 'text' && parsedResult.isError);
+ const invokedSessionId = useMemo(
+ () => (isInvokeAgent && result ? parseInvokedSessionId(resultRawText) : null),
+ [isInvokeAgent, result, resultRawText],
+ );
+
+ const invokeAgentParsed = useMemo(
+ () => (isInvokeAgent && result ? parseInvokeAgentResult(resultRawText) : null),
+ [isInvokeAgent, result, resultRawText],
+ );
+
+ const createAgentResponse = useMemo(
+ () => (isCreateAgent && result ? parseCreateAgentResult(resultRawText) : ''),
+ [isCreateAgent, result, resultRawText],
+ );
+
+ const createAgentSessionId: string | null = useMemo(
+ () => (isCreateAgent && hasStructuredResult && resultContent?.sub_session_id) ? resultContent.sub_session_id : null,
+ [isCreateAgent, hasStructuredResult, resultContent],
+ );
+
+ const revealTargetSessionId = invokedSessionId || createAgentSessionId;
+
+ const sessions = useAppSelector((s) => s.agents.sessions);
+
+ const handleRevealAgent = useCallback(
+ (e: React.MouseEvent) => {
+ e.stopPropagation();
+ if (!revealTargetSessionId || !sessionId) return;
+
+ if (cards[revealTargetSessionId]) {
+ dispatch(collapseSession(revealTargetSessionId));
+ dispatch(removeCard(revealTargetSessionId));
+ setTimeout(() => {
+ dispatch(clearGlowingAgentCard(revealTargetSessionId));
+ }, 500);
+ return;
+ }
+
+ let sourceYRatio: number | undefined;
+ if (bubbleRef.current) {
+ const bubbleEl = bubbleRef.current;
+ const cardEl = bubbleEl.closest('[data-select-type="agent-card"]') as HTMLElement | null;
+ if (cardEl) {
+ const cardRect = cardEl.getBoundingClientRect();
+ const bubbleRect = bubbleEl.getBoundingClientRect();
+ const bubbleCenterY = bubbleRect.top + bubbleRect.height / 2;
+ const ratio = (bubbleCenterY - cardRect.top) / cardRect.height;
+ sourceYRatio = Math.max(0, Math.min(1, ratio));
+ }
+ }
+
+ const doPlace = () => {
+ const parentCard = cards[sessionId];
+ const targetX = parentCard
+ ? parentCard.x + parentCard.width + GRID_GAP * 12
+ : 40;
+ let targetY = parentCard ? parentCard.y : 100;
+ if (parentCard) {
+ const columnCards = Object.values(cards).filter(
+ (c) => Math.abs(c.x - targetX) < 50 && c.session_id !== revealTargetSessionId,
+ );
+ if (columnCards.length > 0) {
+ const lowestBottom = Math.max(
+ ...columnCards.map((c) => c.y + Math.max(EXPANDED_CARD_MIN_H, c.height)),
+ );
+ targetY = lowestBottom + GRID_GAP;
+ }
+ }
+ dispatch(placeCard({
+ sessionId: revealTargetSessionId,
+ x: targetX,
+ y: targetY,
+ width: DEFAULT_CARD_W,
+ height: DEFAULT_CARD_H,
+ }));
+ dispatch(expandSession(revealTargetSessionId));
+ const label = isCreateAgent ? 'Create Agent' : isInvokeAgent ? 'Invoke Agent' : 'Agent';
+ dispatch(setGlowingAgentCard({ sessionId: revealTargetSessionId, sourceId: sessionId, sourceYRatio, label }));
+ };
+
+ if (!sessions[revealTargetSessionId]) {
+ dispatch(fetchSession(revealTargetSessionId)).then(doPlace);
+ } else {
+ doPlace();
+ }
+ },
+ [revealTargetSessionId, sessionId, cards, sessions, dispatch],
+ );
+
const toggle = useCallback(() => {
if (!isStreaming) setExpanded((v) => !v);
}, [isStreaming]);
@@ -1233,10 +1407,415 @@ const ToolCallBubble: React.FC = React.memo(
'data-select-meta': JSON.stringify({ tool: toolName, inputSummary }),
};
+ if (isInvokeAgent) {
+ const agentName = invokeAgentParsed?.agentName || input?.session_id || 'Agent';
+ const responsePreview = invokeAgentParsed?.response || '';
+ const costLabel = invokeAgentParsed?.cost ? `$${invokeAgentParsed.cost}` : null;
+ const hasResponse = !!invokeAgentParsed;
+
+ return (
+
+
+ {/* Header */}
+
+
+
+ InvokeAgent
+
+
+
+ {agentName}
+
+
+
+ {!hasResponse && !showTimer && }
+
+ {hasResponse && responsePreview && !expanded && (
+
+ {responsePreview.slice(0, 100)}{responsePreview.length > 100 ? '…' : ''}
+
+ )}
+ {expanded && }
+
+ {isDenied && (
+
+
+ denied
+
+ )}
+
+ {hasResponse && !isDenied && (
+
+ {isError ? (
+
+ ) : (
+
+ )}
+ {resultElapsedMs != null && (
+
+ {formatElapsed(resultElapsedMs)}
+
+ )}
+ {costLabel && (
+
+ {costLabel}
+
+ )}
+
+ )}
+
+ {showTimer && }
+
+ {invokedSessionId && (
+
+
+
+
+
+ )}
+
+ {hasResponse && (
+
+ {expanded ? : }
+
+ )}
+
+
+ {/* Expanded body — markdown rendered, not terminal */}
+
+
+ (
+ {children}
+ ),
+ }}
+ >
+ {responsePreview}
+
+
+
+
+
+ );
+ }
+
+ if (isCreateAgent) {
+ const taskPrompt = input?.prompt || input?.task || input?.message || '';
+ const taskLabel = taskPrompt
+ ? taskPrompt.length > 40 ? taskPrompt.slice(0, 40) + '…' : taskPrompt
+ : 'Sub-agent';
+ const hasResponse = !!createAgentResponse;
+
+ return (
+
+
+
+
+
+ CreateAgent
+
+
+
+ {taskLabel}
+
+
+
+ {!hasResponse && !showTimer && }
+
+ {hasResponse && createAgentResponse && !expanded && (
+
+ {createAgentResponse.slice(0, 100)}{createAgentResponse.length > 100 ? '…' : ''}
+
+ )}
+ {expanded && }
+
+ {isDenied && (
+
+
+ denied
+
+ )}
+
+ {hasResponse && !isDenied && (
+
+ {isError ? (
+
+ ) : (
+
+ )}
+ {resultElapsedMs != null && (
+
+ {formatElapsed(resultElapsedMs)}
+
+ )}
+
+ )}
+
+ {showTimer && }
+
+ {createAgentSessionId && (
+
+
+
+
+
+ )}
+
+ {hasResponse && (
+
+ {expanded ? : }
+
+ )}
+
+
+
+
+ (
+ {children}
+ ),
+ }}
+ >
+ {createAgentResponse}
+
+
+
+
+
+ );
+ }
+
if (mcpCompact && mcpInfo.isMcp) {
return (
-
= React.memo(
'&::-webkit-scrollbar-thumb': { background: tc.SCROLLBAR_THUMB, borderRadius: 3 },
}}
>
+ {isBrowserAgent && sessionId && (
+
+ )}
{parsedResult && parsedResult.type === 'mcp' ? (
) : parsedResult ? (
@@ -1330,7 +1915,7 @@ const ToolCallBubble: React.FC = React.memo(
{parsedResult.type === 'text' ? parsedResult.content : ''}
) : null}
- {!parsedResult && isPending && !isStreaming && (
+ {!parsedResult && isPending && !isStreaming && !isBrowserAgent && (
@@ -1343,8 +1928,6 @@ const ToolCallBubble: React.FC = React.memo(
return (
-
- {isStreaming && }
= React.memo(
)}
+ {/* Browser agent inline feed */}
+ {isBrowserAgent && sessionId && (
+
+ )}
+
{/* Output */}
{parsedResult && parsedResult.type === 'mcp' ? (
@@ -1566,8 +2157,8 @@ const ToolCallBubble: React.FC = React.memo(
) : null}
- {/* Pending indicator when waiting for result */}
- {!parsedResult && isPending && !isStreaming && (
+ {/* Pending indicator when waiting for result (skip for browser agent — feed replaces it) */}
+ {!parsedResult && isPending && !isStreaming && !isBrowserAgent && (
= React.memo(({ group, isSessionRunning = false, meta }) => {
+const ToolGroupBubble: React.FC = React.memo(({ group, isSessionRunning = false, meta, sessionId }) => {
const c = useClaudeTokens();
const isMcp = !!group.mcpServer;
const [expanded, setExpanded] = useState(isMcp);
@@ -186,6 +187,7 @@ const ToolGroupBubble: React.FC = React.memo(({ group, isSessionRunning =
result={pair.result}
isPending={pair.result === null && isSessionRunning}
mcpCompact
+ sessionId={sessionId}
/>
))}
diff --git a/frontend/src/app/pages/Dashboard/AgentCard.tsx b/frontend/src/app/pages/Dashboard/AgentCard.tsx
index 31c2e07f..751d09ea 100644
--- a/frontend/src/app/pages/Dashboard/AgentCard.tsx
+++ b/frontend/src/app/pages/Dashboard/AgentCard.tsx
@@ -22,12 +22,16 @@ import {
import {
setCardPosition,
setCardSize,
+ fadeGlowingAgentCard,
+ clearGlowingAgentCard,
+ removeCard,
} from '@/shared/state/dashboardLayoutSlice';
-import { useAppDispatch } from '@/shared/hooks';
+import { useAppDispatch, useAppSelector } from '@/shared/hooks';
import { QuestionForm } from '@/app/pages/AgentChat/ApprovalBar';
import AgentChat from '@/app/pages/AgentChat/AgentChat';
import { parseMcpToolName, getMcpShortAction } from '@/app/pages/AgentChat/ToolCallBubble';
import { useClaudeTokens } from '@/shared/styles/ThemeContext';
+import { useOverlayScrollPassthrough } from './useOverlayScrollPassthrough';
// ---------------------------------------------------------------------------
// Helper components & functions (unchanged)
@@ -168,7 +172,8 @@ interface Props {
cardWidth: number;
cardHeight: number;
zoom?: number;
- spawnFrom?: { x: number; y: number };
+ spawnFrom?: { x: number; y: number; type?: 'branch' };
+ exitTarget?: { x: number; y: number };
isSelected?: boolean;
isHighlighted?: boolean;
multiDragDelta?: { dx: number; dy: number } | null;
@@ -176,6 +181,10 @@ interface Props {
onDragStart?: (id: string, type: 'agent' | 'view') => void;
onDragMove?: (dx: number, dy: number) => void;
onDragEnd?: (dx: number, dy: number, didDrag: boolean) => void;
+ onBranch?: (sourceSessionId: string, newSessionId: string) => void;
+ onMeasuredHeight?: (sessionId: string, height: number) => void;
+ snapColumn?: { x: number; width: number };
+ autoFocusInput?: boolean;
}
const MIN_W = 480;
@@ -183,13 +192,54 @@ const MIN_H = 120;
const EXPANDED_OVERLAY_H = 620;
const SPAWN_SPRING = { type: 'spring' as const, stiffness: 400, damping: 28, mass: 0.6 };
+const BRANCH_SPRING = { type: 'spring' as const, stiffness: 300, damping: 26, mass: 0.8 };
+const EXIT_SPRING = { type: 'spring' as const, stiffness: 350, damping: 30, mass: 0.7 };
+const GLOW_FADE_MS = 2500;
+
+const SNAP_THRESHOLD = 60;
const AgentCard: React.FC = ({
- session, expanded, cardX, cardY, cardWidth, cardHeight, zoom = 1, spawnFrom,
+ session, expanded, cardX, cardY, cardWidth, cardHeight, zoom = 1, spawnFrom, exitTarget,
isSelected = false, isHighlighted = false, multiDragDelta, onCardSelect, onDragStart, onDragMove, onDragEnd,
+ onBranch, onMeasuredHeight, snapColumn, autoFocusInput,
}) => {
const c = useClaudeTokens();
const dispatch = useAppDispatch();
+ const scrollOverlayRef = useOverlayScrollPassthrough(isSelected);
+
+ const cardBoxRef = useRef(null);
+ useEffect(() => {
+ const el = cardBoxRef.current;
+ if (!el || !onMeasuredHeight) return;
+ const ro = new ResizeObserver((entries) => {
+ for (const entry of entries) {
+ onMeasuredHeight(session.id, entry.contentRect.height);
+ }
+ });
+ ro.observe(el);
+ return () => ro.disconnect();
+ }, [session.id, onMeasuredHeight]);
+
+ // ---- Glow state (for branched cards) ----
+ const glowEntry = useAppSelector((s) => s.dashboardLayout.glowingAgentCards[session.id]);
+ const isGlowingRedux = !!glowEntry;
+ const glowFading = glowEntry?.fading ?? false;
+ const glowFadeTimer = useRef | null>(null);
+
+ const dismissGlow = useCallback(() => {
+ if (!isGlowingRedux || glowFading) return;
+ dispatch(fadeGlowingAgentCard(session.id));
+ glowFadeTimer.current = setTimeout(() => {
+ dispatch(clearGlowingAgentCard(session.id));
+ }, GLOW_FADE_MS + 300);
+ }, [isGlowingRedux, glowFading, dispatch, session.id]);
+
+ useEffect(() => () => {
+ if (glowFadeTimer.current) clearTimeout(glowFadeTimer.current);
+ }, []);
+
+ const accentColor = c.accent.primary;
+ const accentHover = c.accent.hover;
const STATUS_COLORS: Record = {
running: { color: c.status.success, bg: c.status.successBg },
@@ -212,6 +262,7 @@ const AgentCard: React.FC = ({
const justDraggedRef = useRef(false);
const handleDragPointerDown = useCallback((e: React.PointerEvent) => {
+ if (e.button !== 0) return;
e.preventDefault();
e.stopPropagation();
dragState.current = { startX: e.clientX, startY: e.clientY, origX: cardX, origY: cardY };
@@ -241,11 +292,15 @@ const AgentCard: React.FC = ({
const dx = (e.clientX - dragState.current.startX) / zoom;
const dy = (e.clientY - dragState.current.startY) / zoom;
if (didDrag.current) {
- dispatch(setCardPosition({
- sessionId: session.id,
- x: dragState.current.origX + dx,
- y: dragState.current.origY + dy,
- }));
+ let finalX = dragState.current.origX + dx;
+ const finalY = dragState.current.origY + dy;
+
+ if (snapColumn && Math.abs(finalX - snapColumn.x) < SNAP_THRESHOLD) {
+ finalX = snapColumn.x;
+ dispatch(setCardSize({ sessionId: session.id, width: snapColumn.width, height: cardHeight }));
+ }
+
+ dispatch(setCardPosition({ sessionId: session.id, x: finalX, y: finalY }));
justDraggedRef.current = true;
requestAnimationFrame(() => { justDraggedRef.current = false; });
}
@@ -255,7 +310,7 @@ const AgentCard: React.FC = ({
setLocalDragPos(null);
setIsDragging(false);
(e.currentTarget as HTMLElement).releasePointerCapture(e.pointerId);
- }, [zoom, dispatch, session.id, onDragEnd]);
+ }, [zoom, dispatch, session.id, onDragEnd, snapColumn, cardHeight]);
// ---- Unified edge / corner resize ----
const resizeRef = useRef<{
@@ -272,6 +327,7 @@ const AgentCard: React.FC = ({
const handleResizeDown = useCallback(
(dir: ResizeDir) => (e: React.PointerEvent) => {
+ if (e.button !== 0) return;
e.preventDefault();
e.stopPropagation();
const effectiveW = Math.max(cardWidth, MIN_W);
@@ -337,14 +393,17 @@ const AgentCard: React.FC = ({
const handleRemove = (e: React.MouseEvent) => {
e.stopPropagation();
e.preventDefault();
- dispatch(closeSession({ sessionId: session.id }));
+ dispatch(collapseSession(session.id));
+ dispatch(removeCard(session.id));
+ if (glowEntry) {
+ setTimeout(() => {
+ dispatch(clearGlowingAgentCard(session.id));
+ }, 500);
+ } else {
+ dispatch(closeSession({ sessionId: session.id }));
+ }
};
- const handleCollapse = (e: React.MouseEvent) => {
- e.stopPropagation();
- e.preventDefault();
- dispatch(collapseSession(session.id));
- };
useEffect(() => {
if (session.status === 'running' || session.status === 'waiting_approval') {
@@ -376,33 +435,53 @@ const AgentCard: React.FC = ({
const activeW = localResize?.w ?? cardWidth;
const activeH = localResize?.h ?? cardHeight;
+ const isBranchSpawn = spawnFrom?.type === 'branch';
+ const spawnInitial = spawnFrom
+ ? isBranchSpawn
+ ? { opacity: 0.5, scale: 0.92, left: spawnFrom.x, top: spawnFrom.y }
+ : { opacity: 0, scale: 0.3, left: spawnFrom.x, top: spawnFrom.y }
+ : false;
+ const spawnTransition = noTransition || !spawnFrom
+ ? { duration: 0 }
+ : isBranchSpawn
+ ? { left: BRANCH_SPRING, top: BRANCH_SPRING, scale: BRANCH_SPRING, opacity: { duration: 0.25 } }
+ : { left: SPAWN_SPRING, top: SPAWN_SPRING, scale: SPAWN_SPRING, opacity: { duration: 0.12 } };
+
+ const exitAnimation = exitTarget
+ ? {
+ opacity: 0,
+ scale: 0.3,
+ left: exitTarget.x,
+ top: exitTarget.y,
+ transition: { left: EXIT_SPRING, top: EXIT_SPRING, scale: EXIT_SPRING, opacity: { duration: 0.2 } },
+ }
+ : { opacity: 0, scale: 0.85, transition: { duration: 0.2 } };
+
return (
{
if (justDraggedRef.current) return;
+ if (!isSelected && !e.shiftKey) {
+ dispatch(toggleExpandSession(session.id));
+ }
onCardSelect?.(session.id, 'agent', e.shiftKey);
}}
- onDoubleClick={() => dispatch(toggleExpandSession(session.id))}
sx={{
position: 'relative',
width: localResize ? activeW : Math.max(cardWidth, MIN_W),
@@ -410,26 +489,34 @@ const AgentCard: React.FC = ({
bgcolor: c.bg.surface,
border: isHighlighted
? `2px solid ${c.accent.primary}`
- : isSelected
- ? '2px solid #3b82f6'
- : hasPending && !expanded
- ? `1px solid ${c.status.warning}`
- : expanded
- ? `1px solid ${c.border.strong}`
- : `1px solid ${c.border.subtle}`,
+ : (isGlowingRedux && !glowFading)
+ ? `2px solid ${accentColor}`
+ : isSelected
+ ? '2px solid #3b82f6'
+ : hasPending && !expanded
+ ? `1px solid ${c.status.warning}`
+ : expanded
+ ? `1px solid ${c.border.strong}`
+ : `1px solid ${c.border.subtle}`,
borderRadius: 3,
p: 2,
cursor: expanded ? 'default' : 'pointer',
- transition: noTransition ? 'none' : c.transition,
+ transition: noTransition
+ ? 'none'
+ : glowFading
+ ? `border ${GLOW_FADE_MS}ms ease-out, box-shadow ${GLOW_FADE_MS}ms ease-out`
+ : c.transition,
boxShadow: isHighlighted
? `0 0 0 3px ${c.accent.primary}50, 0 0 20px ${c.accent.primary}35, 0 0 40px ${c.accent.primary}15`
- : isDragging
- ? c.shadow.lg
- : isSelected
- ? `0 0 0 1px #3b82f6, ${c.shadow.md}`
- : expanded
- ? c.shadow.md
- : c.shadow.sm,
+ : (isGlowingRedux && !glowFading)
+ ? `0 0 0 2px ${accentColor}40, 0 0 18px ${accentColor}30, 0 0 40px ${accentColor}15`
+ : isDragging
+ ? c.shadow.lg
+ : isSelected
+ ? `0 0 0 1px #3b82f6, ${c.shadow.md}`
+ : expanded
+ ? c.shadow.md
+ : c.shadow.sm,
display: 'flex',
flexDirection: 'column',
overflow: 'hidden',
@@ -454,7 +541,18 @@ const AgentCard: React.FC = ({
},
zIndex: 50,
}),
- ...(!isHighlighted && !expanded && !isDragging && !isSelected && {
+ ...(!isHighlighted && isGlowingRedux && !glowFading && {
+ animation: 'agent-card-glow-pulse 2s ease-in-out infinite',
+ '@keyframes agent-card-glow-pulse': {
+ '0%, 100%': {
+ boxShadow: `0 0 0 2px ${accentColor}40, 0 0 18px ${accentColor}30, 0 0 40px ${accentColor}15`,
+ },
+ '50%': {
+ boxShadow: `0 0 0 3px ${accentColor}60, 0 0 28px ${accentColor}45, 0 0 56px ${accentColor}25`,
+ },
+ },
+ }),
+ ...(!isHighlighted && !(isGlowingRedux && !glowFading) && !expanded && !isDragging && !isSelected && {
'&:hover': {
boxShadow: c.shadow.md,
borderColor: hasPending ? c.status.warning : c.border.strong,
@@ -462,6 +560,82 @@ const AgentCard: React.FC = ({
}),
}}
>
+ {/* Glow overlays for branched cards */}
+ {isGlowingRedux && (
+
+ {/* Rotating conic gradient border */}
+
+ {/* Top edge shimmer */}
+
+ {/* Inner shadow overlay */}
+
+
+ )}
+
{/* Resize handles: 4 edges + 4 corners */}
{HANDLE_DEFS.map(({ dir, sx }) => (
= ({
/>
))}
- {/* Selection overlay – blocks content interaction while selected, enabling drag from anywhere */}
+ {/* Selection overlay – blocks click interaction while selected, enabling drag from anywhere */}
{isSelected && (
= ({
if (justDraggedRef.current) return;
onCardSelect?.(session.id, 'agent', e.shiftKey);
}}
- onDoubleClick={() => dispatch(toggleExpandSession(session.id))}
sx={{
position: 'absolute',
inset: 0,
@@ -571,37 +745,20 @@ const AgentCard: React.FC = ({
onPointerDown={(e) => e.stopPropagation()}
sx={{ display: 'flex', alignItems: 'center', gap: 0.5, flexShrink: 0, ml: 0.5 }}
>
- {expanded ? (
-
- e.stopPropagation()}
- sx={{
- color: c.text.ghost,
- p: 0.5,
- '&:hover': { color: c.text.secondary, bgcolor: c.bg.secondary },
- }}
- >
-
-
-
- ) : (
-
- e.stopPropagation()}
- sx={{
- color: c.text.ghost,
- p: 0.5,
- '&:hover': { color: c.status.error, bgcolor: `${c.status.errorBg}` },
- }}
- >
-
-
-
- )}
+
+ e.stopPropagation()}
+ sx={{
+ color: c.text.ghost,
+ p: 0.5,
+ '&:hover': { color: c.status.error, bgcolor: `${c.status.errorBg}` },
+ }}
+ >
+
+
+
@@ -649,6 +806,10 @@ const AgentCard: React.FC = ({
sessionId={session.id}
onClose={() => dispatch(collapseSession(session.id))}
embedded
+ autoFocus={autoFocusInput}
+ isGlowing={isGlowingRedux && !glowFading}
+ onDismissGlow={dismissGlow}
+ onBranch={onBranch ? (newId: string) => onBranch(session.id, newId) : undefined}
/>
)}
diff --git a/frontend/src/app/pages/Dashboard/BrowserAgentOverlay.tsx b/frontend/src/app/pages/Dashboard/BrowserAgentOverlay.tsx
index e7a02858..7e25af27 100644
--- a/frontend/src/app/pages/Dashboard/BrowserAgentOverlay.tsx
+++ b/frontend/src/app/pages/Dashboard/BrowserAgentOverlay.tsx
@@ -58,8 +58,10 @@ const BrowserAgentOverlay: React.FC = ({ session, browserWidth, browserHe
const [expanded, setExpanded] = useState(false);
const [confirmStop, setConfirmStop] = useState(false);
const [fadeOut, setFadeOut] = useState(false);
+ const [hidden, setHidden] = useState(false);
const confirmTimer = useRef | null>(null);
const fadeTimer = useRef | null>(null);
+ const hideTimer = useRef | null>(null);
const isRunning = session.status === 'running';
const isDone = session.status === 'completed' || session.status === 'error' || session.status === 'stopped';
@@ -71,6 +73,13 @@ const BrowserAgentOverlay: React.FC = ({ session, browserWidth, browserHe
return () => { if (fadeTimer.current) clearTimeout(fadeTimer.current); };
}, [isDone]);
+ useEffect(() => {
+ if (fadeOut) {
+ hideTimer.current = setTimeout(() => setHidden(true), 400);
+ }
+ return () => { if (hideTimer.current) clearTimeout(hideTimer.current); };
+ }, [fadeOut]);
+
useEffect(() => {
if (scrollRef.current) {
scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
@@ -111,7 +120,7 @@ const BrowserAgentOverlay: React.FC = ({ session, browserWidth, browserHe
const panelW = expanded ? expandedW : collapsedW;
const panelH = expanded ? expandedH : collapsedH;
- if (fadeOut) return null;
+ if (hidden) return null;
return (
= ({ session, browserWidth, browserHe
flexDirection: 'column',
overflow: 'hidden',
transition: 'width 0.25s ease, height 0.25s ease, opacity 0.4s ease',
- opacity: isDone && !fadeOut ? 0.7 : 1,
+ opacity: fadeOut ? 0 : isDone ? 0.7 : 1,
animation: 'overlay-enter 0.3s ease-out',
'@keyframes overlay-enter': {
'0%': { opacity: 0, transform: 'translateY(8px) scale(0.95)' },
diff --git a/frontend/src/app/pages/Dashboard/BrowserCard.tsx b/frontend/src/app/pages/Dashboard/BrowserCard.tsx
index d7772294..9ed10122 100644
--- a/frontend/src/app/pages/Dashboard/BrowserCard.tsx
+++ b/frontend/src/app/pages/Dashboard/BrowserCard.tsx
@@ -40,6 +40,7 @@ import { useBrowserActivity } from '@/shared/useBrowserActivity';
import { getActionLabel } from '@/shared/browserCommandHandler';
import { resolveInput, isGoogleSearch } from '@/shared/resolveUrl';
import BrowserAgentOverlay from './BrowserAgentOverlay';
+import { useOverlayScrollPassthrough } from './useOverlayScrollPassthrough';
import { useElementSelection } from '@/app/components/ElementSelectionContext';
type ResizeDir = 'n' | 's' | 'e' | 'w' | 'ne' | 'nw' | 'se' | 'sw';
@@ -67,6 +68,14 @@ const HANDLE_DEFS: { dir: ResizeDir; sx: Record }[] = [
const isElectron = navigator.userAgent.includes('Electron');
+const chromeUserAgent = navigator.userAgent
+ .replace(/\s*Electron\/\S+/, '')
+ .replace(/\s*OpenSwarm\/\S+/, '');
+
+const webviewPreloadPath: string | undefined = isElectron
+ ? (window as any).openswarm?.getWebviewPreloadPath?.()
+ : undefined;
+
type WebviewElement = BrowserWebview;
interface TabLocalState {
@@ -84,6 +93,7 @@ interface Props {
cardWidth: number;
cardHeight: number;
zoom?: number;
+ cmdHeld?: boolean;
isSelected?: boolean;
isHighlighted?: boolean;
multiDragDelta?: { dx: number; dy: number } | null;
@@ -95,11 +105,12 @@ interface Props {
const BrowserCard: React.FC = ({
- browserId, tabs, activeTabId, cardX, cardY, cardWidth, cardHeight, zoom = 1,
+ browserId, tabs, activeTabId, cardX, cardY, cardWidth, cardHeight, zoom = 1, cmdHeld = false,
isSelected = false, isHighlighted = false, multiDragDelta, onCardSelect, onDragStart, onDragMove, onDragEnd,
}) => {
const c = useClaudeTokens();
const dispatch = useAppDispatch();
+ const scrollOverlayRef = useOverlayScrollPassthrough(isSelected);
const browserHomepage = useAppSelector((state) => state.settings.data.browser_homepage);
const elementSelectionCtx = useElementSelection();
const isElementSelectMode = elementSelectionCtx?.selectMode ?? false;
@@ -192,10 +203,6 @@ const BrowserCard: React.FC = ({
onTitleUpdate();
};
- const onNewWindow = (e: any) => {
- if (e.url) dispatch(addBrowserTab({ browserId, url: e.url, makeActive: true }));
- };
-
const onFaviconUpdate = (e: any) => {
const favicons = e.favicons || (e.detail && e.detail.favicons);
if (favicons?.[0]) {
@@ -208,7 +215,6 @@ const BrowserCard: React.FC = ({
wv.addEventListener('page-title-updated', onTitleUpdate);
wv.addEventListener('did-start-loading', onLoadStart);
wv.addEventListener('did-stop-loading', onLoadStop);
- wv.addEventListener('new-window', onNewWindow);
wv.addEventListener('page-favicon-updated', onFaviconUpdate);
cleanups.push(() => {
@@ -218,7 +224,6 @@ const BrowserCard: React.FC = ({
wv.removeEventListener('page-title-updated', onTitleUpdate);
wv.removeEventListener('did-start-loading', onLoadStart);
wv.removeEventListener('did-stop-loading', onLoadStop);
- wv.removeEventListener('new-window', onNewWindow);
wv.removeEventListener('page-favicon-updated', onFaviconUpdate);
});
}
@@ -371,6 +376,7 @@ const BrowserCard: React.FC = ({
const justDraggedRef = useRef(false);
const handleDragPointerDown = useCallback((e: React.PointerEvent) => {
+ if (e.button !== 0) return;
e.preventDefault();
e.stopPropagation();
dragState.current = { startX: e.clientX, startY: e.clientY, origX: cardX, origY: cardY };
@@ -426,6 +432,7 @@ const BrowserCard: React.FC = ({
const handleResizeDown = useCallback(
(dir: ResizeDir) => (e: React.PointerEvent) => {
+ if (e.button !== 0) return;
e.preventDefault();
e.stopPropagation();
resizeRef.current = {
@@ -491,20 +498,13 @@ const BrowserCard: React.FC = ({
const accentColor = c.accent.primary;
const accentHover = c.accent.hover;
+ const accentRgb = accentColor.replace('#', '').match(/.{2}/g)?.map(h => parseInt(h, 16)).join(',') || '189,100,57';
// ---- Glow state ----
const glowingBrowserCards = useAppSelector((s) => s.dashboardLayout.glowingBrowserCards);
const isGlowingFromRedux = !!glowingBrowserCards[browserId];
- const [hasBeenTouched, setHasBeenTouched] = useState(false);
- useEffect(() => {
- if (isGlowingFromRedux && agentActive) setHasBeenTouched(true);
- }, [isGlowingFromRedux, agentActive]);
- useEffect(() => {
- if (!isGlowingFromRedux) setHasBeenTouched(false);
- }, [isGlowingFromRedux]);
-
- const showGlow = isGlowingFromRedux && hasBeenTouched;
+ const showGlow = isGlowingFromRedux;
const agentBorder = isHighlighted
? `2px solid ${c.accent.primary}`
@@ -576,8 +576,8 @@ const BrowserCard: React.FC = ({
},
}),
...(!isHighlighted && (agentActive || showGlow) && {
- animation: 'agent-glow-pulse 2s ease-in-out infinite',
- '@keyframes agent-glow-pulse': {
+ animation: `agent-glow-${browserId} 2s ease-in-out infinite`,
+ [`@keyframes agent-glow-${browserId}`]: {
'0%, 100%': {
boxShadow: `0 0 0 2px ${accentColor}40, 0 0 18px ${accentColor}30, 0 0 40px ${accentColor}15${innerGlow}`,
},
@@ -588,9 +588,10 @@ const BrowserCard: React.FC = ({
}),
}}
>
- {/* Selection overlay – blocks content interaction while selected, enabling drag from anywhere */}
+ {/* Selection overlay – blocks click interaction while selected, enabling drag from anywhere */}
{isSelected && (
= ({
{isElementSelectMode && (
)}
+ {cmdHeld && !isSelected && (
+
+ )}
{isElectron ? (
tabs.map((tab) => (
= ({
data-tab-id={tab.id}
src="about:blank"
allowpopups="true"
+ useragent={chromeUserAgent}
+ {...(webviewPreloadPath ? { preload: webviewPreloadPath } : {})}
+ webpreferences="plugins=yes, autoplayPolicy=no-user-gesture-required"
style={{
position: 'absolute',
top: 0,
@@ -1035,6 +1042,7 @@ const BrowserCard: React.FC = ({
{/* Camera flash — screenshot */}
{(agentAction === 'screenshot' || lastAction === 'screenshot') && (
= ({
pointerEvents: 'none',
background: `linear-gradient(180deg, transparent, ${accentColor}90, transparent)`,
boxShadow: `0 0 12px ${accentColor}60`,
- animation: 'scan-sweep 1.5s ease-in-out infinite',
+ animation: 'scan-sweep 1.5s ease-in-out infinite alternate',
'@keyframes scan-sweep': {
'0%': { top: '0%' },
- '100%': { top: '100%' },
+ '100%': { top: 'calc(100% - 3px)' },
},
}}
/>
@@ -1074,10 +1082,11 @@ const BrowserCard: React.FC = ({
{/* Click ripple */}
{(agentAction === 'click' || lastAction === 'click') && (
= ({
)}
- {/* Orange inner shadow overlay for selection / streaming glow */}
+ {/* Accent inner shadow overlay for selection / streaming glow */}
{showGlow && !agentActive && (
= ({
zIndex: 14,
pointerEvents: 'none',
borderRadius: 'inherit',
- boxShadow: 'inset 0 0 40px rgba(255,140,0,0.35), inset 0 0 80px rgba(255,100,0,0.15)',
- animation: 'orange-glow-pulse 2s ease-in-out infinite',
- '@keyframes orange-glow-pulse': {
+ boxShadow: `inset 0 0 40px rgba(${accentRgb},0.35), inset 0 0 80px rgba(${accentRgb},0.15)`,
+ animation: `accent-glow-${browserId} 2s ease-in-out infinite`,
+ [`@keyframes accent-glow-${browserId}`]: {
'0%, 100%': {
- boxShadow: 'inset 0 0 40px rgba(255,140,0,0.35), inset 0 0 80px rgba(255,100,0,0.15)',
+ boxShadow: `inset 0 0 40px rgba(${accentRgb},0.35), inset 0 0 80px rgba(${accentRgb},0.15)`,
},
'50%': {
- boxShadow: 'inset 0 0 50px rgba(255,140,0,0.45), inset 0 0 100px rgba(255,100,0,0.22)',
+ boxShadow: `inset 0 0 50px rgba(${accentRgb},0.45), inset 0 0 100px rgba(${accentRgb},0.22)`,
},
},
}}
diff --git a/frontend/src/app/pages/Dashboard/Dashboard.tsx b/frontend/src/app/pages/Dashboard/Dashboard.tsx
index 2aa9393b..064e12b4 100644
--- a/frontend/src/app/pages/Dashboard/Dashboard.tsx
+++ b/frontend/src/app/pages/Dashboard/Dashboard.tsx
@@ -1,4 +1,5 @@
-import React, { useEffect, useCallback, useRef, useState } from 'react';
+import React, { useEffect, useCallback, useRef, useState, useMemo } from 'react';
+import { AnimatePresence, motion } from 'framer-motion';
import { useParams } from 'react-router-dom';
import Box from '@mui/material/Box';
import Typography from '@mui/material/Typography';
@@ -9,10 +10,14 @@ import {
fetchSessions,
fetchHistory,
collapseSession,
+ closeSession,
+ duplicateSession,
+ expandSession,
launchAndSendFirstMessage,
generateTitle,
resumeSession,
setExpandedSessionIds,
+ toggleExpandSession,
} from '@/shared/state/agentsSlice';
import type { AgentConfig } from '@/shared/state/agentsSlice';
import {
@@ -25,12 +30,23 @@ import {
moveCards,
resetLayout,
setGlowingBrowserCards,
+ removeViewCard,
+ removeBrowserCard,
+ pasteBrowserCard,
+ placeCard,
+ removeCard,
+ setGlowingAgentCard,
+ clearGlowingAgentCard,
+ DEFAULT_CARD_W,
+ DEFAULT_CARD_H,
EXPANDED_CARD_MIN_H,
+ GRID_GAP,
} from '@/shared/state/dashboardLayoutSlice';
import { fetchOutputs } from '@/shared/state/outputsSlice';
import { generateDashboardName, updateDashboardThumbnail } from '@/shared/state/dashboardsSlice';
import { dashboardWs } from '@/shared/ws/WebSocketManager';
import { initBrowserCommandHandler } from '@/shared/browserCommandHandler';
+import { clearPendingBrowserUrl, clearPendingFocusAgentId } from '@/shared/state/tempStateSlice';
import AgentCard from './AgentCard';
import DashboardViewCard from './DashboardViewCard';
import BrowserCard from './BrowserCard';
@@ -45,6 +61,7 @@ import type { ContextPath } from '@/app/components/DirectoryBrowser';
import { ElementSelectionProvider, useElementSelection } from '@/app/components/ElementSelectionContext';
import { useDomElementSelector } from '@/app/components/useDomElementSelector';
import SelectionOverlay from '@/app/components/SelectionOverlay';
+import { setClipboardCards, getClipboardCards, type ClipboardCard } from '@/shared/dashboardClipboard';
const SELECT_ATTR = 'data-select-type';
@@ -81,7 +98,10 @@ const DashboardInner: React.FC = () => {
const zoomSensitivity = useAppSelector((state) => state.settings.data.zoom_sensitivity);
const newAgentShortcut = useAppSelector((state) => state.settings.data.new_agent_shortcut);
const browserHomepage = useAppSelector((state) => state.settings.data.browser_homepage);
+ const expandNewChats = useAppSelector((state) => state.settings.data.expand_new_chats_in_dashboard);
+ const autoRevealSubAgents = useAppSelector((state) => state.settings.data.auto_reveal_sub_agents);
const outputs = useAppSelector((state) => state.outputs.items);
+ const glowingAgentCards = useAppSelector((state) => state.dashboardLayout.glowingAgentCards);
const sessionList = Object.values(sessions);
const canvas = useCanvasControls(zoomSensitivity);
@@ -96,6 +116,8 @@ const DashboardInner: React.FC = () => {
const [toolbarOpen, setToolbarOpen] = useState(false);
const [highlightedCardId, setHighlightedCardId] = useState(null);
const highlightTimerRef = useRef | null>(null);
+ const [autoFocusSessionId, setAutoFocusSessionId] = useState(null);
+ const [pendingSelectSessionId, setPendingSelectSessionId] = useState(null);
const handleHighlightCard = useCallback((cardId: string) => {
if (highlightTimerRef.current) clearTimeout(highlightTimerRef.current);
@@ -106,7 +128,35 @@ const DashboardInner: React.FC = () => {
}, 2000);
}, []);
- const spawnOriginsRef = useRef>({});
+ useEffect(() => {
+ if (autoFocusSessionId) {
+ const timer = setTimeout(() => setAutoFocusSessionId(null), 1500);
+ return () => clearTimeout(timer);
+ }
+ }, [autoFocusSessionId]);
+
+ useEffect(() => {
+ if (!pendingSelectSessionId) return;
+ if (!cards[pendingSelectSessionId]) return;
+ setPendingSelectSessionId(null);
+ selection.selectCard(pendingSelectSessionId, 'agent', false);
+ }, [pendingSelectSessionId, cards, selection]);
+
+ const spawnOriginsRef = useRef>({});
+ const measuredHeightsRef = useRef>({});
+ const [measuredHeightsTick, setMeasuredHeightsTick] = useState(0);
+ const handleMeasuredHeight = useCallback((sessionId: string, height: number) => {
+ if (measuredHeightsRef.current[sessionId] !== height) {
+ measuredHeightsRef.current[sessionId] = height;
+ setMeasuredHeightsTick((t) => t + 1);
+ }
+ }, []);
+ const revealSpawnedRef = useRef(new Set());
+ useEffect(() => {
+ revealSpawnedRef.current.forEach((id) => {
+ if (!cards[id]) revealSpawnedRef.current.delete(id);
+ });
+ }, [cards]);
const hasFittedRef = useRef(false);
const restoredExpandedRef = useRef(false);
const canvasStateRef = useRef({ panX: canvas.panX, panY: canvas.panY, zoom: canvas.zoom });
@@ -114,16 +164,16 @@ const DashboardInner: React.FC = () => {
// ---- Multi-drag coordination ----
const [multiDragDelta, setMultiDragDelta] = useState<{ dx: number; dy: number } | null>(null);
+ const [liveDragInfo, setLiveDragInfo] = useState<{ cardId: string; dx: number; dy: number } | null>(null);
const activeDragCardRef = useRef(null);
const isMultiDragRef = useRef(false);
const handleCardDragStart = useCallback((id: string, _type: CardType) => {
+ activeDragCardRef.current = id;
if (selection.isSelected(id)) {
- activeDragCardRef.current = id;
isMultiDragRef.current = true;
} else {
selection.deselectAll();
- activeDragCardRef.current = null;
isMultiDragRef.current = false;
}
}, [selection]);
@@ -132,6 +182,9 @@ const DashboardInner: React.FC = () => {
if (isMultiDragRef.current) {
setMultiDragDelta({ dx, dy });
}
+ if (activeDragCardRef.current) {
+ setLiveDragInfo({ cardId: activeDragCardRef.current, dx, dy });
+ }
}, []);
const handleCardDragEnd = useCallback((dx: number, dy: number, didDrag: boolean) => {
@@ -145,6 +198,7 @@ const DashboardInner: React.FC = () => {
activeDragCardRef.current = null;
isMultiDragRef.current = false;
setMultiDragDelta(null);
+ setLiveDragInfo(null);
}, [selection, dispatch]);
const handleCardSelect = useCallback((id: string, type: CardType, shiftKey: boolean) => {
@@ -157,11 +211,17 @@ const DashboardInner: React.FC = () => {
canvas.handlers.onMouseDown(e);
return;
}
+
+ if (e.button === 2) {
+ e.preventDefault();
+ canvas.handlers.onMouseDown(e);
+ return;
+ }
+
if (e.button !== 0) return;
if (isCardTarget(e.target, e.currentTarget)) return;
if (isElementSelectMode) {
- // Cmd/Ctrl held → allow panning even in element select mode
if (e.metaKey || e.ctrlKey) {
canvas.handlers.onMouseDown(e);
}
@@ -169,10 +229,10 @@ const DashboardInner: React.FC = () => {
}
if (e.metaKey || e.ctrlKey || canvas.spaceHeld) {
- selection.handleCanvasMouseDown(e.nativeEvent);
- } else {
selection.deselectAll();
canvas.handlers.onMouseDown(e);
+ } else {
+ selection.handleCanvasMouseDown(e.nativeEvent);
}
}, [canvas.handlers, canvas.spaceHeld, selection, isElementSelectMode]);
@@ -200,6 +260,20 @@ const DashboardInner: React.FC = () => {
return () => { cleanupBrowserHandler(); dashboardWs.disconnect(); };
}, [dispatch, dashboardId]);
+ const pendingBrowserUrl = useAppSelector((state) => state.tempState.pendingBrowserUrl);
+ const pendingFocusAgentId = useAppSelector((state) => state.tempState.pendingFocusAgentId);
+
+ useEffect(() => {
+ if (!dashboardId) return;
+ (window as any).__openswarm_last_dashboard_id = dashboardId;
+ }, [dashboardId]);
+
+ useEffect(() => {
+ if (!pendingBrowserUrl || !layoutInitialized) return;
+ dispatch(addBrowserCard({ url: pendingBrowserUrl, expandedSessionIds }));
+ dispatch(clearPendingBrowserUrl());
+ }, [pendingBrowserUrl, layoutInitialized, dispatch, expandedSessionIds]);
+
// Capture a thumbnail screenshot of the dashboard.
// Uses Electron's native capturePage for pixel-perfect results.
// Captures current viewport as-is (no DOM mutation) to avoid visual flashes.
@@ -247,10 +321,25 @@ const DashboardInner: React.FC = () => {
useEffect(() => {
if (!layoutInitialized || hasFittedRef.current) return;
+ if (pendingFocusAgentId) return;
hasFittedRef.current = true;
const timer = setTimeout(() => canvas.actions.fitToView(), 150);
return () => clearTimeout(timer);
- }, [layoutInitialized, canvas.actions]);
+ }, [layoutInitialized, canvas.actions, pendingFocusAgentId]);
+
+ useEffect(() => {
+ if (!pendingFocusAgentId || !layoutInitialized) return;
+ const agentId = pendingFocusAgentId;
+ dispatch(clearPendingFocusAgentId());
+ hasFittedRef.current = true;
+ setTimeout(() => {
+ const card = store.getState().dashboardLayout.cards[agentId];
+ if (card) {
+ canvas.actions.fitToCards([{ x: card.x, y: card.y, width: card.width, height: card.height }], 1.0, true);
+ handleHighlightCard(agentId);
+ }
+ }, 350);
+ }, [pendingFocusAgentId, layoutInitialized, dispatch, canvas.actions, handleHighlightCard]);
useEffect(() => {
if (!layoutInitialized || restoredExpandedRef.current) return;
@@ -263,7 +352,7 @@ const DashboardInner: React.FC = () => {
useEffect(() => {
if (!layoutInitialized) return;
const dashboardSessionIds = Object.values(sessions)
- .filter((s) => s.dashboard_id === dashboardId && s.mode !== 'browser-agent')
+ .filter((s) => s.dashboard_id === dashboardId && s.mode !== 'browser-agent' && s.mode !== 'invoked-agent' && s.mode !== 'sub-agent')
.map((s) => s.id);
const liveIds = dashboardSessionIds.sort().join(',');
if (liveIds === prevSessionIdsRef.current) return;
@@ -271,6 +360,100 @@ const DashboardInner: React.FC = () => {
dispatch(reconcileSessions({ sessionIds: dashboardSessionIds, expandedSessionIds }));
}, [sessions, layoutInitialized, dispatch, dashboardId, expandedSessionIds]);
+ // ---- Auto-reveal / collapse / unreveal sub-agent cards ----
+ const autoRevealedRef = useRef(new Set());
+ const prevSubStatusRef = useRef>({});
+ const prevParentStatusRef = useRef>({});
+
+ useEffect(() => {
+ if (!layoutInitialized || !autoRevealSubAgents) return;
+
+ const subSessions = Object.values(sessions).filter(
+ (s) => (s.mode === 'sub-agent' || s.mode === 'invoked-agent') && s.parent_session_id,
+ );
+
+ // 1) Auto-reveal newly spawned sub-agents (skip already-terminal ones on load)
+ for (const sub of subSessions) {
+ if (autoRevealedRef.current.has(sub.id)) continue;
+ if (cards[sub.id]) {
+ autoRevealedRef.current.add(sub.id);
+ continue;
+ }
+ const parentCard = cards[sub.parent_session_id!];
+ if (!parentCard) continue;
+
+ const isTerminal = sub.status === 'completed' || sub.status === 'error' || sub.status === 'stopped';
+ const parentSession = sessions[sub.parent_session_id!];
+ const parentTerminal = parentSession &&
+ (parentSession.status === 'completed' || parentSession.status === 'error' || parentSession.status === 'stopped');
+ if (isTerminal && parentTerminal) {
+ autoRevealedRef.current.add(sub.id);
+ continue;
+ }
+
+ autoRevealedRef.current.add(sub.id);
+
+ const targetX = parentCard.x + parentCard.width + GRID_GAP * 12;
+ let targetY = parentCard.y;
+ const columnCards = Object.values(cards).filter(
+ (c) => Math.abs(c.x - targetX) < 50 && c.session_id !== sub.id,
+ );
+ if (columnCards.length > 0) {
+ const lowestBottom = Math.max(
+ ...columnCards.map((c) => c.y + Math.max(EXPANDED_CARD_MIN_H, c.height)),
+ );
+ targetY = lowestBottom + GRID_GAP;
+ }
+
+ dispatch(placeCard({ sessionId: sub.id, x: targetX, y: targetY, width: DEFAULT_CARD_W, height: DEFAULT_CARD_H }));
+ dispatch(expandSession(sub.id));
+ const label = sub.mode === 'sub-agent' ? 'Create Agent' : 'Invoke Agent';
+ dispatch(setGlowingAgentCard({ sessionId: sub.id, sourceId: sub.parent_session_id!, label }));
+
+ if (sub.status === 'completed' || sub.status === 'error' || sub.status === 'stopped') {
+ const subId = sub.id;
+ setTimeout(() => dispatch(collapseSession(subId)), 2000);
+ }
+ }
+
+ // 2) Auto-collapse sub-agents when they complete
+ const TERMINAL = new Set(['completed', 'error', 'stopped']);
+ for (const sub of subSessions) {
+ const prev = prevSubStatusRef.current[sub.id];
+ if (prev !== sub.status && TERMINAL.has(sub.status) && cards[sub.id]) {
+ dispatch(collapseSession(sub.id));
+ }
+ }
+ const newSubStatuses: Record = {};
+ for (const sub of subSessions) { newSubStatuses[sub.id] = sub.status; }
+ prevSubStatusRef.current = newSubStatuses;
+
+ // 3) Unreveal all sub-agent cards when parent finishes output
+ const parentIds = new Set(subSessions.map((s) => s.parent_session_id!));
+ for (const pid of parentIds) {
+ const parent = sessions[pid];
+ if (!parent) continue;
+ const prev = prevParentStatusRef.current[pid];
+ if (prev !== parent.status && TERMINAL.has(parent.status)) {
+ const children = subSessions.filter((s) => s.parent_session_id === pid);
+ for (const child of children) {
+ if (!cards[child.id]) continue;
+ dispatch(collapseSession(child.id));
+ dispatch(removeCard(child.id));
+ setTimeout(() => {
+ dispatch(clearGlowingAgentCard(child.id));
+ }, 500);
+ }
+ }
+ }
+ const newParentStatuses: Record = {};
+ for (const pid of parentIds) {
+ const parent = sessions[pid];
+ if (parent) newParentStatuses[pid] = parent.status;
+ }
+ prevParentStatusRef.current = newParentStatuses;
+ }, [sessions, cards, layoutInitialized, autoRevealSubAgents, dispatch]);
+
const skipInitialSave = useRef(true);
const saveTimerRef = useRef | null>(null);
const pendingSaveRef = useRef[0] | null>(null);
@@ -326,6 +509,187 @@ const DashboardInner: React.FC = () => {
return () => window.removeEventListener('keydown', handleShortcut);
}, [newAgentShortcut]);
+ useEffect(() => {
+ const handleEnter = (e: KeyboardEvent) => {
+ if (e.key !== 'Enter') return;
+ const tag = (e.target as HTMLElement)?.tagName;
+ if (tag === 'INPUT' || tag === 'TEXTAREA' || (e.target as HTMLElement)?.isContentEditable) return;
+ if (selection.selectedIds.size !== 1) return;
+ const [id, type] = selection.selectedIds.entries().next().value!;
+ if (type !== 'agent') return;
+ e.preventDefault();
+ dispatch(toggleExpandSession(id));
+ };
+ window.addEventListener('keydown', handleEnter);
+ return () => window.removeEventListener('keydown', handleEnter);
+ }, [selection.selectedIds, dispatch]);
+
+ useEffect(() => {
+ const handleDelete = (e: KeyboardEvent) => {
+ if (e.key !== 'Backspace' && e.key !== 'Delete') return;
+ const tag = (e.target as HTMLElement)?.tagName;
+ if (tag === 'INPUT' || tag === 'TEXTAREA' || (e.target as HTMLElement)?.isContentEditable) return;
+ if (selection.selectedIds.size === 0) return;
+ e.preventDefault();
+ for (const [id, type] of selection.selectedIds) {
+ if (type === 'agent') {
+ dispatch(closeSession({ sessionId: id }));
+ } else if (type === 'view') {
+ dispatch(removeViewCard(id));
+ } else if (type === 'browser') {
+ dispatch(removeBrowserCard(id));
+ }
+ }
+ selection.deselectAll();
+ };
+ window.addEventListener('keydown', handleDelete);
+ return () => window.removeEventListener('keydown', handleDelete);
+ }, [selection, dispatch]);
+
+ useEffect(() => {
+ const handleCopy = (e: KeyboardEvent) => {
+ if (!(e.metaKey || e.ctrlKey) || e.key.toLowerCase() !== 'c') return;
+ const tag = (e.target as HTMLElement)?.tagName;
+ if (tag === 'INPUT' || tag === 'TEXTAREA' || (e.target as HTMLElement)?.isContentEditable) return;
+ if (selection.selectedIds.size === 0) return;
+
+ e.preventDefault();
+ const copied: ClipboardCard[] = [];
+ const names: string[] = [];
+ for (const [id, type] of selection.selectedIds) {
+ if (type === 'agent') {
+ const session = sessions[id];
+ const card = cards[id];
+ if (!session || !card) continue;
+ copied.push({
+ type, id, name: session.name || id,
+ meta: { name: session.name, status: session.status, model: session.model, mode: session.mode },
+ x: card.x, y: card.y, width: card.width, height: card.height,
+ expanded: expandedSessionIds.includes(id),
+ });
+ names.push(session.name || id);
+ } else if (type === 'view') {
+ const output = outputs[id];
+ const vc = viewCards[id];
+ if (!output || !vc) continue;
+ copied.push({
+ type, id, name: output.name,
+ meta: { name: output.name, description: output.description },
+ x: vc.x, y: vc.y, width: vc.width, height: vc.height,
+ });
+ names.push(output.name);
+ } else if (type === 'browser') {
+ const bc = browserCards[id];
+ if (!bc) continue;
+ const activeTab = bc.tabs.find((t) => t.id === bc.activeTabId);
+ const title = activeTab?.title || 'Browser';
+ copied.push({
+ type, id, name: title,
+ meta: { name: title, url: activeTab?.url || bc.url, tabs: bc.tabs },
+ x: bc.x, y: bc.y, width: bc.width, height: bc.height,
+ });
+ names.push(title);
+ }
+ }
+ setClipboardCards(copied);
+ navigator.clipboard.writeText(names.join(', ')).catch(() => {});
+ };
+ window.addEventListener('keydown', handleCopy);
+ return () => window.removeEventListener('keydown', handleCopy);
+ }, [selection.selectedIds, sessions, cards, viewCards, browserCards, outputs, expandedSessionIds]);
+
+ useEffect(() => {
+ const PASTE_OFFSET = 40;
+ const handlePaste = async (e: KeyboardEvent) => {
+ if (!(e.metaKey || e.ctrlKey) || e.key.toLowerCase() !== 'v') return;
+ const tag = (e.target as HTMLElement)?.tagName;
+ if (tag === 'INPUT' || tag === 'TEXTAREA' || (e.target as HTMLElement)?.isContentEditable) return;
+
+ const copied = getClipboardCards();
+ if (copied.length === 0) return;
+ e.preventDefault();
+
+ selection.deselectAll();
+ const newSelection = new Map();
+
+ for (const card of copied) {
+ const px = card.x + PASTE_OFFSET;
+ const py = card.y - PASTE_OFFSET;
+
+ if (card.type === 'agent') {
+ const action = await dispatch(duplicateSession({ sessionId: card.id, dashboardId }));
+ if (duplicateSession.fulfilled.match(action)) {
+ const newId = action.payload.id;
+ dispatch(placeCard({ sessionId: newId, x: px, y: py, width: card.width, height: card.height }));
+ if (card.expanded) {
+ dispatch(expandSession(newId));
+ }
+ newSelection.set(newId, 'agent');
+ }
+ } else if (card.type === 'view') {
+ dispatch(addViewCard({ outputId: card.id, expandedSessionIds, x: px, y: py, width: card.width, height: card.height }));
+ newSelection.set(card.id, 'view');
+ } else if (card.type === 'browser') {
+ const browserId = `browser-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 6)}`;
+ dispatch(pasteBrowserCard({
+ id: browserId, tabs: card.meta.tabs || [], url: card.meta.url || '',
+ x: px, y: py, width: card.width, height: card.height,
+ }));
+ newSelection.set(browserId, 'browser');
+ }
+ }
+
+ if (newSelection.size > 0) {
+ for (const [id, type] of newSelection) {
+ selection.selectCard(id, type, true);
+ }
+ }
+ };
+ window.addEventListener('keydown', handlePaste);
+ return () => window.removeEventListener('keydown', handlePaste);
+ }, [dispatch, dashboardId, expandedSessionIds, selection]);
+
+ const handleBranchFromCard = useCallback(
+ (sourceSessionId: string, newSessionId: string) => {
+ const sourceCard = cards[sourceSessionId];
+ if (!sourceCard) return;
+
+ const targetX = sourceCard.x + sourceCard.width + GRID_GAP * 12;
+ let targetY = sourceCard.y;
+
+ const columnCards = Object.values(cards).filter(
+ (c) => Math.abs(c.x - targetX) < 50 && c.session_id !== newSessionId,
+ );
+ if (columnCards.length > 0) {
+ const lowestBottom = Math.max(
+ ...columnCards.map((c) => c.y + Math.max(EXPANDED_CARD_MIN_H, c.height)),
+ );
+ targetY = lowestBottom + GRID_GAP;
+ }
+
+ spawnOriginsRef.current[newSessionId] = {
+ x: sourceCard.x,
+ y: sourceCard.y,
+ type: 'branch' as const,
+ };
+
+ dispatch(placeCard({
+ sessionId: newSessionId,
+ x: targetX,
+ y: targetY,
+ width: DEFAULT_CARD_W,
+ height: DEFAULT_CARD_H,
+ }));
+
+ if (expandedSessionIds.includes(sourceSessionId)) {
+ dispatch(expandSession(newSessionId));
+ }
+
+ dispatch(setGlowingAgentCard({ sessionId: newSessionId, sourceId: sourceSessionId, label: 'Branch' }));
+ },
+ [cards, dispatch, expandedSessionIds],
+ );
+
const handleNewAgent = useCallback(() => {
setToolbarOpen(true);
}, []);
@@ -376,7 +740,7 @@ const DashboardInner: React.FC = () => {
contextPaths: contextPaths?.map((cp) => ({ path: cp.path, type: cp.type })),
forcedTools,
attachedSkills,
- expand: false,
+ expand: expandNewChats,
}),
).then((action) => {
if (launchAndSendFirstMessage.fulfilled.match(action)) {
@@ -388,6 +752,22 @@ const DashboardInner: React.FC = () => {
spawnOriginsRef.current[realId] = spawnOriginsRef.current[draftId];
delete spawnOriginsRef.current[draftId];
+ if (expandNewChats) {
+ setAutoFocusSessionId(realId);
+ } else {
+ setPendingSelectSessionId(realId);
+ }
+
+ setTimeout(() => {
+ const card = store.getState().dashboardLayout.cards[realId];
+ if (card) {
+ const isExp = store.getState().agents.expandedSessionIds.includes(realId);
+ const height = isExp ? Math.max(EXPANDED_CARD_MIN_H, card.height) : card.height;
+ canvas.actions.fitToCards([{ x: card.x, y: card.y, width: card.width, height }], 1.0, true);
+ handleHighlightCard(realId);
+ }
+ }, 200);
+
if (dashboardId) {
const currentSessions = store.getState().agents.sessions;
const agentCount = Object.values(currentSessions).filter(
@@ -408,24 +788,49 @@ const DashboardInner: React.FC = () => {
}
});
},
- [canvas.viewportRef, dispatch, dashboardId],
+ [canvas.viewportRef, canvas.actions, dispatch, dashboardId, expandNewChats, handleHighlightCard],
);
const handleAddView = useCallback((outputId: string) => {
dispatch(addViewCard({ outputId, expandedSessionIds }));
- }, [dispatch, expandedSessionIds]);
+ setTimeout(() => {
+ const card = store.getState().dashboardLayout.viewCards[outputId];
+ if (card) {
+ canvas.actions.fitToCards([{ x: card.x, y: card.y, width: card.width, height: card.height }], 1.0, true);
+ handleHighlightCard(outputId);
+ }
+ }, 200);
+ }, [dispatch, expandedSessionIds, canvas.actions, handleHighlightCard]);
const handleAddBrowser = useCallback(() => {
+ const prevIds = new Set(Object.keys(store.getState().dashboardLayout.browserCards));
dispatch(addBrowserCard({ url: browserHomepage, expandedSessionIds }));
- }, [dispatch, browserHomepage, expandedSessionIds]);
+ setTimeout(() => {
+ const allBrowserCards = store.getState().dashboardLayout.browserCards;
+ const newId = Object.keys(allBrowserCards).find((id) => !prevIds.has(id));
+ if (newId) {
+ const card = allBrowserCards[newId];
+ canvas.actions.fitToCards([{ x: card.x, y: card.y, width: card.width, height: card.height }], 1.0, true);
+ handleHighlightCard(newId);
+ }
+ }, 200);
+ }, [dispatch, browserHomepage, expandedSessionIds, canvas.actions, handleHighlightCard]);
const handleHistoryResume = useCallback((sessionId: string) => {
dispatch(resumeSession({ sessionId })).then((action) => {
if (resumeSession.fulfilled.match(action)) {
- dispatch(collapseSession(sessionId));
+ dispatch(expandSession(sessionId));
+ setAutoFocusSessionId(sessionId);
+ setTimeout(() => {
+ const card = store.getState().dashboardLayout.cards[sessionId];
+ if (card) {
+ canvas.actions.fitToCards([{ x: card.x, y: card.y, width: card.width, height: card.height }], 1.0, true);
+ handleHighlightCard(sessionId);
+ }
+ }, 200);
}
});
- }, [dispatch]);
+ }, [dispatch, canvas.actions, handleHighlightCard, setAutoFocusSessionId]);
const handleTidy = useCallback(() => {
const currentExpanded = store.getState().agents.expandedSessionIds;
@@ -444,6 +849,112 @@ const DashboardInner: React.FC = () => {
canvas.actions.fitToCards(allRects);
}, [dispatch, canvas.actions]);
+ useEffect(() => {
+ const DRIFT_THRESHOLD = 60;
+
+ // Group tethered sub-agent cards by source, only including those still in the spawn column
+ const sourceToSiblings = new Map();
+ for (const [id, glow] of Object.entries(glowingAgentCards)) {
+ const card = cards[id];
+ if (!card) continue;
+ const sourceCard = cards[glow.sourceId];
+ if (!sourceCard) continue;
+ const expectedX = sourceCard.x + sourceCard.width + GRID_GAP * 12;
+ if (Math.abs(card.x - expectedX) > DRIFT_THRESHOLD) continue;
+ const list = sourceToSiblings.get(glow.sourceId) ?? [];
+ list.push(id);
+ sourceToSiblings.set(glow.sourceId, list);
+ }
+
+ for (const siblings of sourceToSiblings.values()) {
+ if (siblings.length < 2) continue;
+ siblings.sort((a, b) => cards[a].y - cards[b].y);
+
+ let cursor = cards[siblings[0]].y;
+ for (const id of siblings) {
+ const card = cards[id];
+ const dy = cursor - card.y;
+ if (Math.abs(dy) > 1) {
+ dispatch(moveCards({ items: [{ id, type: 'agent' as const }], dx: 0, dy }));
+ }
+ const isExpanded = expandedSessionIds.includes(id);
+ const h = isExpanded
+ ? Math.max(EXPANDED_CARD_MIN_H, card.height)
+ : (measuredHeightsRef.current[id] ?? card.height);
+ cursor += h + GRID_GAP * 2;
+ }
+ }
+ // measuredHeightsTick in deps ensures we re-run once ResizeObserver reports
+ // the new height after a collapse (avoids stale-height no-ops)
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [expandedSessionIds, glowingAgentCards, cards, dispatch, measuredHeightsTick]);
+
+ const TETHER_FADE_MS = 2500;
+
+ const tethers = useMemo(() => {
+ const ELBOW_RADIUS = 16;
+
+ function elbowPath(x1: number, y1: number, x2: number, y2: number): string {
+ const dx = x2 - x1;
+ const dy = y2 - y1;
+ const midX = x1 + dx / 2;
+ const r = (Math.abs(dy) < 1 || Math.abs(dx) < ELBOW_RADIUS * 2)
+ ? 0
+ : Math.min(ELBOW_RADIUS, Math.abs(dy) / 2, Math.abs(dx) / 4);
+ const sy = dy >= 0 ? 1 : -1;
+ const sx = dx >= 0 ? 1 : -1;
+
+ return [
+ `M ${x1},${y1}`,
+ `H ${midX - sx * r}`,
+ `Q ${midX},${y1} ${midX},${y1 + sy * r}`,
+ `V ${y2 - sy * r}`,
+ `Q ${midX},${y2} ${midX + sx * r},${y2}`,
+ `H ${x2}`,
+ ].join(' ');
+ }
+
+ return Object.entries(glowingAgentCards).map(([copyId, { sourceId, fading, sourceYRatio, label }]) => {
+ const src = cards[sourceId];
+ const dst = cards[copyId];
+ if (!src || !dst) return null;
+
+ let srcX = src.x, srcY = src.y;
+ let dstX = dst.x, dstY = dst.y;
+ if (liveDragInfo) {
+ if (liveDragInfo.cardId === sourceId) { srcX += liveDragInfo.dx; srcY += liveDragInfo.dy; }
+ if (liveDragInfo.cardId === copyId) { dstX += liveDragInfo.dx; dstY += liveDragInfo.dy; }
+ }
+
+ const srcMeasured = measuredHeightsRef.current[sourceId];
+ const srcH = srcMeasured ?? (expandedSessionIds.includes(sourceId)
+ ? Math.max(EXPANDED_CARD_MIN_H, src.height)
+ : src.height);
+ const dstMeasured = measuredHeightsRef.current[copyId];
+ const dstH = dstMeasured ?? (expandedSessionIds.includes(copyId)
+ ? Math.max(EXPANDED_CARD_MIN_H, dst.height)
+ : dst.height);
+
+ const x1 = srcX + src.width;
+ const y1 = srcY + srcH * 0.54;
+ const x2 = dstX;
+ const y2 = dstY + dstH * (expandedSessionIds.includes(copyId) ? 0.54 : 0.79);
+ const midX = x1 + (x2 - x1) / 2;
+ const labelX = midX + (x2 - midX) * 0.15;
+ const labelY = y2;
+
+ return {
+ key: copyId,
+ path: elbowPath(x1, y1, x2, y2),
+ labelX,
+ labelY,
+ label: label || '',
+ fading,
+ };
+ }).filter(Boolean) as Array<{ key: string; path: string; labelX: number; labelY: number; label: string; fading: boolean }>;
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [glowingAgentCards, cards, expandedSessionIds, liveDragInfo, measuredHeightsTick]);
+
const dotSize = Math.max(1, 1.5 * canvas.zoom);
const dotSpacing = 24 * canvas.zoom;
@@ -486,6 +997,7 @@ const DashboardInner: React.FC = () => {
onMouseDown={handleViewportMouseDown}
onMouseMove={handleViewportMouseMove}
onMouseUp={handleViewportMouseUp}
+ onContextMenu={(e) => e.preventDefault()}
sx={{
position: 'absolute',
inset: 0,
@@ -493,7 +1005,7 @@ const DashboardInner: React.FC = () => {
cursor: canvas.isPanning
? 'grabbing'
: (canvas.spaceHeld || canvas.cmdHeld)
- ? 'crosshair'
+ ? 'grab'
: selection.marquee
? 'crosshair'
: 'default',
@@ -540,11 +1052,178 @@ const DashboardInner: React.FC = () => {
position: 'relative',
}}
>
+ {/* Tether lines between branched cards */}
+ {tethers.length > 0 && (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {tethers.map((t) => (
+
+
+
+
+ {t.label && (
+
+
+
+ {t.label}
+
+
+ )}
+
+ ))}
+
+ )}
+
{Object.values(cards).map((card) => {
const session = sessions[card.session_id];
if (!session) return null;
- const origin = spawnOriginsRef.current[session.id];
- if (origin) delete spawnOriginsRef.current[session.id];
+
+ let origin = spawnOriginsRef.current[session.id];
+ if (origin) {
+ delete spawnOriginsRef.current[session.id];
+ } else {
+ const glow = glowingAgentCards[session.id];
+ if (glow && !revealSpawnedRef.current.has(session.id)) {
+ revealSpawnedRef.current.add(session.id);
+ const srcCard = cards[glow.sourceId];
+ if (srcCard) {
+ const srcH = measuredHeightsRef.current[glow.sourceId]
+ ?? (expandedSessionIds.includes(glow.sourceId)
+ ? Math.max(EXPANDED_CARD_MIN_H, srcCard.height)
+ : srcCard.height);
+ origin = {
+ x: srcCard.x + srcCard.width,
+ y: srcCard.y + srcH / 2,
+ type: 'branch' as const,
+ };
+ }
+ }
+ }
+
+ let exitTarget: { x: number; y: number } | undefined;
+ const glow = glowingAgentCards[session.id];
+ if (glow) {
+ const srcCard = cards[glow.sourceId];
+ if (srcCard) {
+ const srcH = measuredHeightsRef.current[glow.sourceId]
+ ?? (expandedSessionIds.includes(glow.sourceId)
+ ? Math.max(EXPANDED_CARD_MIN_H, srcCard.height)
+ : srcCard.height);
+ exitTarget = {
+ x: srcCard.x + srcCard.width,
+ y: srcCard.y + srcH / 2,
+ };
+ }
+ }
+
+ let snapColumn: { x: number; width: number } | undefined;
+ if (glow) {
+ const srcCard = cards[glow.sourceId];
+ if (srcCard) {
+ snapColumn = {
+ x: srcCard.x + srcCard.width + GRID_GAP * 12,
+ width: DEFAULT_CARD_W,
+ };
+ }
+ }
+
return (
{
cardHeight={card.height}
zoom={canvas.zoom}
spawnFrom={origin}
+ exitTarget={exitTarget}
isSelected={selection.isSelected(session.id)}
isHighlighted={highlightedCardId === session.id}
multiDragDelta={multiDragDelta}
@@ -563,9 +1243,14 @@ const DashboardInner: React.FC = () => {
onDragStart={handleCardDragStart}
onDragMove={handleCardDragMove}
onDragEnd={handleCardDragEnd}
+ onBranch={handleBranchFromCard}
+ onMeasuredHeight={handleMeasuredHeight}
+ snapColumn={snapColumn}
+ autoFocusInput={autoFocusSessionId === session.id}
/>
);
})}
+
{Object.values(viewCards).map((vc) => {
const output = outputs[vc.output_id];
if (!output) return null;
@@ -578,6 +1263,7 @@ const DashboardInner: React.FC = () => {
cardWidth={vc.width}
cardHeight={vc.height}
zoom={canvas.zoom}
+ cmdHeld={canvas.cmdHeld}
isSelected={selection.isSelected(vc.output_id)}
isHighlighted={highlightedCardId === vc.output_id}
multiDragDelta={multiDragDelta}
@@ -599,6 +1285,7 @@ const DashboardInner: React.FC = () => {
cardWidth={bc.width}
cardHeight={bc.height}
zoom={canvas.zoom}
+ cmdHeld={canvas.cmdHeld}
isSelected={selection.isSelected(bc.browser_id)}
isHighlighted={highlightedCardId === bc.browser_id}
multiDragDelta={multiDragDelta}
diff --git a/frontend/src/app/pages/Dashboard/DashboardHeader.tsx b/frontend/src/app/pages/Dashboard/DashboardHeader.tsx
index 417b6315..b6429b9f 100644
--- a/frontend/src/app/pages/Dashboard/DashboardHeader.tsx
+++ b/frontend/src/app/pages/Dashboard/DashboardHeader.tsx
@@ -92,7 +92,7 @@ const DashboardHeader: React.FC = ({
const handleFocus = useCallback(
(cardId: string, card: { x: number; y: number; width: number; height: number }) => {
- canvasActions.fitToCards([card], 1.0);
+ canvasActions.fitToCards([card], 1.0, true);
onHighlightCard?.(cardId);
setExpanded(false);
},
diff --git a/frontend/src/app/pages/Dashboard/DashboardToolbar.tsx b/frontend/src/app/pages/Dashboard/DashboardToolbar.tsx
index 38b000b0..9dad9329 100644
--- a/frontend/src/app/pages/Dashboard/DashboardToolbar.tsx
+++ b/frontend/src/app/pages/Dashboard/DashboardToolbar.tsx
@@ -42,6 +42,7 @@ interface Props {
dashboardId?: string;
}
+const TOOLBAR_OWNER_ID = '__toolbar__';
const BTN = 40;
const WarmTooltip = styled(
@@ -90,8 +91,18 @@ const DashboardToolbar = React.forwardRef(
const searchInputRef = useRef(null);
const historyInputRef = useRef(null);
const historyListRef = useRef(null);
- const [mode, setMode] = useState('agent');
- const [model, setModel] = useState('sonnet');
+ const defaultMode = useAppSelector((s) => s.settings.data.default_mode);
+ const defaultModel = useAppSelector((s) => s.settings.data.default_model);
+ const [mode, setMode] = useState(defaultMode || 'agent');
+ const [model, setModel] = useState(defaultModel || 'sonnet');
+ const settingsApplied = useRef(false);
+ useEffect(() => {
+ if (!settingsApplied.current) {
+ setMode(defaultMode || 'agent');
+ setModel(defaultModel || 'sonnet');
+ settingsApplied.current = true;
+ }
+ }, [defaultMode, defaultModel]);
const [viewPickerOpen, setViewPickerOpen] = useState(false);
const [viewSearch, setViewSearch] = useState('');
const [historyOpen, setHistoryOpen] = useState(false);
@@ -204,13 +215,23 @@ const DashboardToolbar = React.forwardRef(
const isExpanded = inputOpen || viewPickerOpen || historyOpen;
+ const autoSelectOnNew = useAppSelector((s) => s.settings.data.auto_select_mode_on_new_agent);
const prevInputOpenRef = useRef(inputOpen);
useEffect(() => {
- if (prevInputOpenRef.current && !inputOpen && elementSelection?.selectMode) {
- elementSelection.setSelectMode(false);
+ if (prevInputOpenRef.current && !inputOpen && elementSelection) {
+ elementSelection.clearOwnerElements(TOOLBAR_OWNER_ID);
+ if (elementSelection.selectMode && elementSelection.activeOwnerId === TOOLBAR_OWNER_ID) {
+ elementSelection.setSelectMode(false);
+ }
+ }
+ if (!prevInputOpenRef.current && inputOpen && autoSelectOnNew && elementSelection) {
+ elementSelection.clearOwnerElements(TOOLBAR_OWNER_ID);
+ elementSelection.setActiveOwnerId(TOOLBAR_OWNER_ID);
+ elementSelection.setExcludeSelectId(null);
+ elementSelection.setSelectMode(true);
}
prevInputOpenRef.current = inputOpen;
- }, [inputOpen, elementSelection]);
+ }, [inputOpen, elementSelection, autoSelectOnNew]);
useEffect(() => {
if (!isExpanded) return;
@@ -226,21 +247,44 @@ const DashboardToolbar = React.forwardRef(
useEffect(() => {
if (!isExpanded) return;
- const handleClick = (e: MouseEvent) => {
- if (elementSelection?.selectMode) return;
+ let downPos: { x: number; y: number; target: Node } | null = null;
+ const DRAG_THRESHOLD = 5;
+
+ const handleDown = (e: MouseEvent) => {
const target = e.target as Node;
if (containerRef.current && !containerRef.current.contains(target)) {
- const el = target instanceof Element ? target : target.parentElement;
- if (el?.closest('[role="dialog"], [role="presentation"], .MuiModal-root, .MuiPopover-root')) {
- return;
- }
- handleDismiss();
+ downPos = { x: e.clientX, y: e.clientY, target };
+ } else {
+ downPos = null;
}
};
- const t = setTimeout(() => document.addEventListener('mousedown', handleClick), 50);
+
+ const handleUp = (e: MouseEvent) => {
+ if (!downPos) return;
+ const dx = e.clientX - downPos.x;
+ const dy = e.clientY - downPos.y;
+ const target = downPos.target;
+ downPos = null;
+ if (Math.abs(dx) > DRAG_THRESHOLD || Math.abs(dy) > DRAG_THRESHOLD) return;
+
+ const el = target instanceof Element ? target : (target as Node).parentElement;
+ if (el?.closest('[role="dialog"], [role="presentation"], .MuiModal-root, .MuiPopover-root')) {
+ return;
+ }
+ if (elementSelection?.selectMode && el?.closest('[data-select-type]')) {
+ return;
+ }
+ handleDismiss();
+ };
+
+ const t = setTimeout(() => {
+ document.addEventListener('mousedown', handleDown, true);
+ document.addEventListener('mouseup', handleUp, true);
+ }, 50);
return () => {
clearTimeout(t);
- document.removeEventListener('mousedown', handleClick);
+ document.removeEventListener('mousedown', handleDown, true);
+ document.removeEventListener('mouseup', handleUp, true);
};
}, [isExpanded, handleDismiss, elementSelection?.selectMode]);
@@ -266,10 +310,14 @@ const DashboardToolbar = React.forwardRef(
e.preventDefault();
handleOpenHistory();
}
+ if (e.metaKey && e.key.toLowerCase() === 'n' && !e.ctrlKey && !e.shiftKey && !e.altKey) {
+ e.preventDefault();
+ onAddBrowser();
+ }
};
window.addEventListener('keydown', handleKey);
return () => window.removeEventListener('keydown', handleKey);
- }, [handleOpenViewPicker, handleOpenHistory]);
+ }, [handleOpenViewPicker, handleOpenHistory, onAddBrowser]);
useEffect(() => {
if (!historyOpen) return;
@@ -319,6 +367,7 @@ const DashboardToolbar = React.forwardRef(
onModelChange={setModel}
embedded
autoFocus
+ sessionId={TOOLBAR_OWNER_ID}
/>
) : historyOpen ? (
@@ -596,6 +645,39 @@ const DashboardToolbar = React.forwardRef(
+
+ Browser ⌘N
+
+ }
+ >
+
+
+
+
+
(
-
- Browser
-
- }
- >
-
-
-
-
-
{placeholderItems.map(({ icon: PlaceholderIcon, label, sub }) => (
= ({
- output, cardX, cardY, cardWidth, cardHeight, zoom = 1,
+ output, cardX, cardY, cardWidth, cardHeight, zoom = 1, cmdHeld = false,
isSelected = false, isHighlighted = false, multiDragDelta, onCardSelect, onDragStart, onDragMove, onDragEnd,
}) => {
const c = useClaudeTokens();
const dispatch = useAppDispatch();
+ const scrollOverlayRef = useOverlayScrollPassthrough(isSelected);
const previewRef = useRef(null);
const [inputData, setInputData] = useState>(() => getDefault(output.input_schema));
@@ -77,6 +80,7 @@ const DashboardViewCard: React.FC = ({
const justDraggedRef = useRef(false);
const handleDragPointerDown = useCallback((e: React.PointerEvent) => {
+ if (e.button !== 0) return;
e.preventDefault();
e.stopPropagation();
dragState.current = { startX: e.clientX, startY: e.clientY, origX: cardX, origY: cardY };
@@ -132,6 +136,7 @@ const DashboardViewCard: React.FC = ({
const handleResizeDown = useCallback(
(dir: ResizeDir) => (e: React.PointerEvent) => {
+ if (e.button !== 0) return;
e.preventDefault();
e.stopPropagation();
resizeRef.current = {
@@ -304,9 +309,10 @@ const DashboardViewCard: React.FC = ({
}),
}}
>
- {/* Selection overlay – blocks content interaction while selected, enabling drag from anywhere */}
+ {/* Selection overlay – blocks click interaction while selected, enabling drag from anywhere */}
{isSelected && (
= ({
{/* Preview body */}
+ {cmdHeld && !isSelected && (
+
+ )}
(null);
// Wheel zoom centered on cursor
useEffect(() => {
@@ -207,6 +208,10 @@ export function useCanvasControls(zoomSensitivity: number = 50) {
return () => window.removeEventListener('mouseup', onUp);
}, []);
+ useEffect(() => {
+ return () => { if (animFrameRef.current) cancelAnimationFrame(animFrameRef.current); };
+ }, []);
+
const zoomIn = useCallback(() => {
setState((prev) => {
const newZoom = clamp(prev.zoom * ZOOM_IN_FACTOR, MIN_ZOOM, MAX_ZOOM);
@@ -276,7 +281,9 @@ export function useCanvasControls(zoomSensitivity: number = 50) {
});
}, []);
- const fitToCards = useCallback((cardRects: Array<{ x: number; y: number; width: number; height: number }>, maxZoom?: number) => {
+ const fitToCards = useCallback((cardRects: Array<{ x: number; y: number; width: number; height: number }>, maxZoom?: number, animate?: boolean) => {
+ if (animFrameRef.current) { cancelAnimationFrame(animFrameRef.current); animFrameRef.current = null; }
+
const viewport = viewportRef.current;
if (!viewport || cardRects.length === 0) {
setState({ panX: 0, panY: 0, zoom: 1 });
@@ -303,11 +310,34 @@ export function useCanvasControls(zoomSensitivity: number = 50) {
const availW = vRect.width - FIT_PADDING * 2;
const availH = vRect.height - FIT_PADDING * 2;
const ceiling = maxZoom ?? MAX_ZOOM;
- const newZoom = clamp(Math.min(availW / contentWidth, availH / contentHeight), MIN_ZOOM, ceiling);
- const newPanX = (vRect.width - contentWidth * newZoom) / 2 - minX * newZoom;
- const newPanY = (vRect.height - contentHeight * newZoom) / 2 - minY * newZoom;
+ const targetZoom = clamp(Math.min(availW / contentWidth, availH / contentHeight), MIN_ZOOM, ceiling);
+ const targetPanX = (vRect.width - contentWidth * targetZoom) / 2 - minX * targetZoom;
+ const targetPanY = (vRect.height - contentHeight * targetZoom) / 2 - minY * targetZoom;
- setState({ panX: newPanX, panY: newPanY, zoom: newZoom });
+ if (!animate) {
+ setState({ panX: targetPanX, panY: targetPanY, zoom: targetZoom });
+ return;
+ }
+
+ const start = { ...stateRef.current };
+ const startTime = performance.now();
+ const duration = 320;
+
+ const step = (now: number) => {
+ const t = Math.min((now - startTime) / duration, 1);
+ const ease = 1 - Math.pow(1 - t, 3);
+ setState({
+ panX: start.panX + (targetPanX - start.panX) * ease,
+ panY: start.panY + (targetPanY - start.panY) * ease,
+ zoom: start.zoom + (targetZoom - start.zoom) * ease,
+ });
+ if (t < 1) {
+ animFrameRef.current = requestAnimationFrame(step);
+ } else {
+ animFrameRef.current = null;
+ }
+ };
+ animFrameRef.current = requestAnimationFrame(step);
}, []);
const handlers = useMemo(() => ({
diff --git a/frontend/src/app/pages/Dashboard/useDashboardSelection.ts b/frontend/src/app/pages/Dashboard/useDashboardSelection.ts
index 6344d975..aa84f6e2 100644
--- a/frontend/src/app/pages/Dashboard/useDashboardSelection.ts
+++ b/frontend/src/app/pages/Dashboard/useDashboardSelection.ts
@@ -79,7 +79,10 @@ export function useDashboardSelection(
}
return next;
}
- return new Map([[id, type]]);
+ if (prev.has(id)) {
+ return new Map();
+ }
+ return prev;
});
},
[],
@@ -152,7 +155,7 @@ export function useDashboardSelection(
const handleCanvasMouseDown = useCallback(
(e: MouseEvent) => {
- if (e.button !== 0) return;
+ if (e.button !== 0 && e.button !== 2) return;
marqueeOriginRef.current = { screenX: e.clientX, screenY: e.clientY };
isDraggingMarqueeRef.current = false;
diff --git a/frontend/src/app/pages/Dashboard/useOverlayScrollPassthrough.ts b/frontend/src/app/pages/Dashboard/useOverlayScrollPassthrough.ts
new file mode 100644
index 00000000..9107b8f5
--- /dev/null
+++ b/frontend/src/app/pages/Dashboard/useOverlayScrollPassthrough.ts
@@ -0,0 +1,80 @@
+import { useRef, useEffect } from 'react';
+
+/**
+ * Attaches a native wheel listener to an overlay element that forwards scroll
+ * events to whatever scrollable content sits beneath it, while still letting
+ * the overlay capture pointer events (click / drag). Pinch-zoom (ctrl/meta +
+ * wheel) is left alone so the canvas zoom still works.
+ *
+ * Handles two cases:
+ * 1. Regular DOM scrollable containers — uses `scrollBy` directly.
+ * 2. Electron `` elements — executes JS inside the webview to scroll
+ * the element at the cursor position.
+ */
+export function useOverlayScrollPassthrough(active: boolean) {
+ const ref = useRef(null);
+
+ useEffect(() => {
+ const el = ref.current;
+ if (!active || !el) return;
+
+ const handleWheel = (e: WheelEvent) => {
+ if (e.ctrlKey || e.metaKey) return;
+
+ el.style.pointerEvents = 'none';
+ const underneath = document.elementFromPoint(e.clientX, e.clientY);
+ el.style.pointerEvents = '';
+
+ let dx = e.deltaX;
+ let dy = e.deltaY;
+ if (e.deltaMode === 1) {
+ dx *= 20;
+ dy *= 20;
+ }
+
+ let node = underneath as HTMLElement | null;
+ while (node) {
+ if (node.tagName === 'WEBVIEW') {
+ e.stopPropagation();
+ e.preventDefault();
+ const rect = node.getBoundingClientRect();
+ const relX = Math.round(e.clientX - rect.left);
+ const relY = Math.round(e.clientY - rect.top);
+ (node as any).executeJavaScript?.(
+ `(function(){` +
+ `var el=document.elementFromPoint(${relX},${relY});` +
+ `while(el){` +
+ `var s=getComputedStyle(el);` +
+ `if((s.overflowY==='auto'||s.overflowY==='scroll')&&el.scrollHeight>el.clientHeight){el.scrollBy(${dx},${dy});return}` +
+ `if((s.overflowX==='auto'||s.overflowX==='scroll')&&el.scrollWidth>el.clientWidth){el.scrollBy(${dx},${dy});return}` +
+ `el=el.parentElement}` +
+ `window.scrollBy(${dx},${dy})` +
+ `})()`
+ ).catch(() => {});
+ return;
+ }
+
+ const cs = getComputedStyle(node);
+ const canScrollY =
+ node.scrollHeight > node.clientHeight &&
+ (cs.overflowY === 'auto' || cs.overflowY === 'scroll');
+ const canScrollX =
+ node.scrollWidth > node.clientWidth &&
+ (cs.overflowX === 'auto' || cs.overflowX === 'scroll');
+
+ if (canScrollY || canScrollX) {
+ e.stopPropagation();
+ e.preventDefault();
+ node.scrollBy(dx, dy);
+ return;
+ }
+ node = node.parentElement;
+ }
+ };
+
+ el.addEventListener('wheel', handleWheel, { passive: false });
+ return () => el.removeEventListener('wheel', handleWheel);
+ }, [active]);
+
+ return ref;
+}
diff --git a/frontend/src/app/pages/Modes/Modes.tsx b/frontend/src/app/pages/Modes/Modes.tsx
index e7e75627..2b024b81 100644
--- a/frontend/src/app/pages/Modes/Modes.tsx
+++ b/frontend/src/app/pages/Modes/Modes.tsx
@@ -27,6 +27,7 @@ import DeleteIcon from '@mui/icons-material/Delete';
import TuneIcon from '@mui/icons-material/Tune';
import LockIcon from '@mui/icons-material/Lock';
import ArrowForwardIcon from '@mui/icons-material/ArrowForward';
+import RestoreIcon from '@mui/icons-material/Restore';
import SmartToyOutlinedIcon from '@mui/icons-material/SmartToyOutlined';
import QuestionAnswerOutlinedIcon from '@mui/icons-material/QuestionAnswerOutlined';
import MapOutlinedIcon from '@mui/icons-material/MapOutlined';
@@ -37,6 +38,7 @@ import {
createMode,
updateMode,
deleteMode,
+ resetMode,
Mode,
} from '@/shared/state/modesSlice';
import { fetchBuiltinTools, fetchTools } from '@/shared/state/toolsSlice';
@@ -105,7 +107,7 @@ const ALL_BUILTIN_TOOL_NAMES = ['Read', 'Edit', 'Write', 'Bash', 'Glob', 'Grep',
const Modes: React.FC = () => {
const c = useClaudeTokens();
const dispatch = useAppDispatch();
- const { items, loading } = useAppSelector((s) => s.modes);
+ const { items, builtinDefaults, loading } = useAppSelector((s) => s.modes);
const toolItems = useAppSelector((s) => s.tools.items);
const modes = useMemo(() => Object.values(items), [items]);
@@ -174,6 +176,45 @@ const Modes: React.FC = () => {
await dispatch(deleteMode(id));
};
+ const editingIsBuiltin = editingId ? items[editingId]?.is_builtin ?? false : false;
+
+ const hasDiverged = useMemo(() => {
+ if (!editingId || !editingIsBuiltin) return false;
+ const defaults = builtinDefaults[editingId];
+ if (!defaults) return false;
+ const current = items[editingId];
+ if (!current) return false;
+ return (
+ current.name !== defaults.name ||
+ current.description !== defaults.description ||
+ (current.system_prompt ?? '') !== (defaults.system_prompt ?? '') ||
+ JSON.stringify(current.tools) !== JSON.stringify(defaults.tools) ||
+ (current.default_next_mode ?? '') !== (defaults.default_next_mode ?? '') ||
+ current.icon !== defaults.icon ||
+ current.color !== defaults.color ||
+ (current.default_folder ?? '') !== (defaults.default_folder ?? '')
+ );
+ }, [editingId, editingIsBuiltin, items, builtinDefaults]);
+
+ const handleReset = async () => {
+ if (!editingId) return;
+ const action = await dispatch(resetMode(editingId));
+ if (resetMode.fulfilled.match(action)) {
+ const m = action.payload;
+ setForm({
+ name: m.name,
+ description: m.description,
+ system_prompt: m.system_prompt ?? '',
+ tools: m.tools ?? [],
+ toolsEnabled: m.tools !== null,
+ default_next_mode: m.default_next_mode ?? '',
+ icon: m.icon,
+ color: m.color,
+ default_folder: m.default_folder ?? '',
+ });
+ }
+ };
+
const otherModes = modes.filter((m) => m.id !== editingId);
return (
@@ -505,23 +546,46 @@ const Modes: React.FC = () => {
-
- setDialogOpen(false)} sx={{ color: c.text.tertiary, textTransform: 'none' }}>
- Cancel
-
-
- {editingId ? 'Save Changes' : 'Create Mode'}
-
+
+
+ {editingIsBuiltin && (
+
+
+ }
+ onClick={handleReset}
+ disabled={!hasDiverged}
+ sx={{
+ color: hasDiverged ? c.text.muted : c.text.ghost,
+ textTransform: 'none',
+ fontSize: '0.82rem',
+ '&:hover': hasDiverged ? { color: c.status.error, bgcolor: `${c.status.error}10` } : {},
+ }}
+ >
+ Reset to Default
+
+
+
+ )}
+
+
+ setDialogOpen(false)} sx={{ color: c.text.tertiary, textTransform: 'none' }}>
+ Cancel
+
+
+ {editingId ? 'Save Changes' : 'Create Mode'}
+
+
diff --git a/frontend/src/app/pages/Settings/Settings.tsx b/frontend/src/app/pages/Settings/Settings.tsx
index 70a14a8d..79f743bc 100644
--- a/frontend/src/app/pages/Settings/Settings.tsx
+++ b/frontend/src/app/pages/Settings/Settings.tsx
@@ -11,6 +11,7 @@ import InputAdornment from '@mui/material/InputAdornment';
import ToggleButton from '@mui/material/ToggleButton';
import ToggleButtonGroup from '@mui/material/ToggleButtonGroup';
import Slider from '@mui/material/Slider';
+import Switch from '@mui/material/Switch';
import Snackbar from '@mui/material/Snackbar';
import Alert from '@mui/material/Alert';
import Tab from '@mui/material/Tab';
@@ -495,7 +496,7 @@ const Settings: React.FC = () => {
-
+
New agent shortcut
Keyboard shortcut to create an agent.
@@ -553,6 +554,51 @@ const Settings: React.FC = () => {
+
+
+ Auto-enable element selection
+ Automatically enter element selection mode when creating a new agent.
+
+ setForm({ ...form, auto_select_mode_on_new_agent: e.target.checked })}
+ sx={{
+ '& .MuiSwitch-switchBase.Mui-checked': { color: c.accent.primary },
+ '& .MuiSwitch-switchBase.Mui-checked + .MuiSwitch-track': { bgcolor: c.accent.primary },
+ }}
+ />
+
+
+
+
+ Default agent spawn state in dashboard
+ When enabled, new agents spawn expanded instead of collapsed.
+
+ setForm({ ...form, expand_new_chats_in_dashboard: e.target.checked })}
+ sx={{
+ '& .MuiSwitch-switchBase.Mui-checked': { color: c.accent.primary },
+ '& .MuiSwitch-switchBase.Mui-checked + .MuiSwitch-track': { bgcolor: c.accent.primary },
+ }}
+ />
+
+
+
+
+ Auto-reveal sub-agents on dashboard
+ Automatically show sub-agent cards (from CreateAgent / InvokeAgent) tethered to their parent on the dashboard.
+
+ setForm({ ...form, auto_reveal_sub_agents: e.target.checked })}
+ sx={{
+ '& .MuiSwitch-switchBase.Mui-checked': { color: c.accent.primary },
+ '& .MuiSwitch-switchBase.Mui-checked + .MuiSwitch-track': { bgcolor: c.accent.primary },
+ }}
+ />
+
+
{/* ── Browser ── */}
Browser
@@ -639,15 +685,8 @@ const Settings: React.FC = () => {
{step.title}
{step.link && (
{
- const w = window as any;
- if (w.openswarm?.openExternal) {
- w.openswarm.openExternal(step.link);
- } else {
- window.open(step.link, '_blank', 'noopener');
- }
- }}
+ component="a"
+ href={step.link}
sx={{
color: c.accent.primary,
fontSize: '0.75rem',
@@ -657,6 +696,7 @@ const Settings: React.FC = () => {
alignItems: 'center',
gap: 0.3,
verticalAlign: 'middle',
+ textDecoration: 'none',
'&:hover': { textDecoration: 'underline' },
}}
>
@@ -705,6 +745,24 @@ const Settings: React.FC = () => {
/>
+ {/* ── Advanced ── */}
+ Advanced
+
+
+
+ Developer mode
+ Show transport details, environment variables, raw configs, and other technical metadata throughout the app.
+
+ setForm({ ...form, dev_mode: e.target.checked })}
+ sx={{
+ '& .MuiSwitch-switchBase.Mui-checked': { color: c.accent.primary },
+ '& .MuiSwitch-switchBase.Mui-checked + .MuiSwitch-track': { bgcolor: c.accent.primary },
+ }}
+ />
+
+
{/* ── About ── */}
About
diff --git a/frontend/src/app/pages/Skills/Skills.tsx b/frontend/src/app/pages/Skills/Skills.tsx
index 7424cac5..89b1feaa 100644
--- a/frontend/src/app/pages/Skills/Skills.tsx
+++ b/frontend/src/app/pages/Skills/Skills.tsx
@@ -579,8 +579,6 @@ const Skills: React.FC = () => {
size="small"
component="a"
href={selectedReg.repositoryUrl}
- target="_blank"
- rel="noopener"
sx={{ color: c.text.tertiary, '&:hover': { color: c.text.primary } }}
>
diff --git a/frontend/src/app/pages/Tools/Tools.tsx b/frontend/src/app/pages/Tools/Tools.tsx
index a6e05224..272b7688 100644
--- a/frontend/src/app/pages/Tools/Tools.tsx
+++ b/frontend/src/app/pages/Tools/Tools.tsx
@@ -56,6 +56,7 @@ import BlockIcon from '@mui/icons-material/Block';
import VisibilityIcon from '@mui/icons-material/Visibility';
import SecurityIcon from '@mui/icons-material/Security';
import PanToolIcon from '@mui/icons-material/PanTool';
+import CallSplitIcon from '@mui/icons-material/CallSplit';
import RefreshIcon from '@mui/icons-material/Refresh';
import {
fetchTools,
@@ -74,6 +75,8 @@ import {
import {
searchRegistry,
fetchRegistryStats,
+ fetchServerDetail,
+ clearDetail,
McpServer,
} from '@/shared/state/mcpRegistrySlice';
import {
@@ -156,7 +159,7 @@ const INTEGRATIONS: Integration[] = [
},
];
-const CATEGORY_ORDER = ['filesystem', 'system', 'search', 'interaction', 'planning', 'scheduling'];
+const CATEGORY_ORDER = ['filesystem', 'system', 'search', 'interaction', 'agents', 'planning', 'scheduling'];
interface ToolForm {
name: string;
@@ -235,6 +238,7 @@ const ToolSection: React.FC = ({
interaction: { label: 'Interaction', color: '#a855f7', icon: },
planning: { label: 'Planning', color: '#ec4899', icon: },
scheduling: { label: 'Scheduling', color: '#14b8a6', icon: },
+ agents: { label: 'Agents', color: '#f97316', icon: },
};
const PermToggle = ({ value, onChange, size = 16 }: { value: string; onChange: (v: string) => void; size?: number }) => (
@@ -343,7 +347,7 @@ const ToolSection: React.FC = ({
return (
- {bt.name}
+ {bt.display_name || bt.name}
{bt.description && {firstSentence(bt.description)} }
onPermissionChange(bt.name, v)} size={14} />
@@ -370,7 +374,8 @@ const Tools: React.FC = () => {
const c = useClaudeTokens();
const dispatch = useAppDispatch();
const { items, builtinTools, builtinPermissions, loading } = useAppSelector((s) => s.tools);
- const { servers: regServers, total: regTotal, loading: regLoading, stats: regStats } = useAppSelector((s) => s.mcpRegistry);
+ const { servers: regServers, total: regTotal, loading: regLoading, stats: regStats, detail: regDetail, detailLoading: regDetailLoading } = useAppSelector((s) => s.mcpRegistry);
+ const devMode = useAppSelector((s) => s.settings.data.dev_mode);
const outputItems = useAppSelector((s) => s.outputs.items);
const outputs = useMemo(() => Object.values(outputItems), [outputItems]);
const allTools = Object.values(items);
@@ -488,7 +493,8 @@ const Tools: React.FC = () => {
if (discoverTools.fulfilled.match(result)) {
setSnackbar({ open: true, message: 'Actions discovered successfully' });
} else {
- setSnackbar({ open: true, message: 'Discovery failed — is the MCP server running?', severity: 'error' });
+ const detail = (result as any).error?.message || 'Discovery failed — is the MCP server running?';
+ setSnackbar({ open: true, message: detail, severity: 'error' });
}
} finally {
setDiscovering(false);
@@ -530,8 +536,11 @@ const Tools: React.FC = () => {
};
const [expandedServices, setExpandedServices] = useState>({});
+ const [expandedSchema, setExpandedSchema] = useState(null);
const [viewsSectionOpen, setViewsSectionOpen] = useState(false);
+ const [browserSectionOpen, setBrowserSectionOpen] = useState(false);
+ const [browserCollapsed, setBrowserCollapsed] = useState>({ browser_delegation: true, browser_action: true });
const [builtinSectionOpen, setBuiltinSectionOpen] = useState(true);
useEffect(() => {
@@ -556,8 +565,12 @@ const Tools: React.FC = () => {
};
// Built-in tool grouping
- const coreTools = useMemo(() => builtinTools.filter((bt) => !bt.deferred), [builtinTools]);
- const deferredTools = useMemo(() => builtinTools.filter((bt) => bt.deferred), [builtinTools]);
+ const BROWSER_CATEGORIES = new Set(['browser_delegation', 'browser_action']);
+ const coreTools = useMemo(() => builtinTools.filter((bt) => !bt.deferred && !BROWSER_CATEGORIES.has(bt.category)), [builtinTools]);
+ const deferredTools = useMemo(() => builtinTools.filter((bt) => bt.deferred && !BROWSER_CATEGORIES.has(bt.category)), [builtinTools]);
+ const browserTools = useMemo(() => builtinTools.filter((bt) => BROWSER_CATEGORIES.has(bt.category)), [builtinTools]);
+ const browserDelegationTools = useMemo(() => browserTools.filter((bt) => bt.category === 'browser_delegation'), [browserTools]);
+ const browserActionTools = useMemo(() => browserTools.filter((bt) => bt.category === 'browser_action'), [browserTools]);
const groupTools = (list: BuiltinTool[]) => {
const g: Record = {};
for (const bt of list) { if (!g[bt.category]) g[bt.category] = []; g[bt.category].push(bt); }
@@ -578,10 +591,14 @@ const Tools: React.FC = () => {
() => !outputs.every((o) => o.permission === 'deny'),
[outputs],
);
+ const browserSectionEnabled = useMemo(
+ () => browserTools.length > 0 && !browserTools.every((t) => builtinPermissions[t.name] === 'deny'),
+ [browserTools, builtinPermissions],
+ );
const handleSectionEnabledChange = async (tools: BuiltinTool[], enabled: boolean) => {
const perms: Record = {};
- for (const t of tools) perms[t.name] = enabled ? 'ask' : 'deny';
+ for (const t of tools) perms[t.name] = enabled ? 'always_allow' : 'deny';
await dispatch(updateBuiltinPermissions(perms));
};
@@ -894,7 +911,7 @@ const Tools: React.FC = () => {
{builtinSectionOpen ? : }
Built-in Action Sets
-
+
@@ -992,6 +1009,156 @@ const Tools: React.FC = () => {
)}
+ {/* Browser */}
+ {browserTools.length > 0 && (
+
+
+ browserSectionEnabled && setBrowserSectionOpen((v) => !v)}
+ sx={{ display: 'flex', alignItems: 'center', gap: 2, cursor: browserSectionEnabled ? 'pointer' : 'default' }}
+ >
+
+
+
+
+
+ Browser
+
+
+ Browser automation delegation and individual browser actions
+
+ e.stopPropagation()}>
+ handleSectionEnabledChange(browserTools, checked)}
+ sx={{
+ '& .MuiSwitch-switchBase.Mui-checked': { color: c.accent.primary },
+ '& .MuiSwitch-switchBase.Mui-checked + .MuiSwitch-track': { bgcolor: c.accent.primary },
+ }}
+ />
+
+ {browserSectionEnabled && (
+
+
+
+ )}
+
+
+
+
+
+
+
+ Action Permissions
+
+
+
+
+ {/* Delegation group */}
+ {browserDelegationTools.length > 0 && (() => {
+ const delegationPolicies = browserDelegationTools.map((t) => builtinPermissions[t.name] || 'always_allow');
+ const groupPolicy = delegationPolicies.every((p) => p === 'always_allow') ? 'always_allow'
+ : delegationPolicies.every((p) => p === 'deny') ? 'deny'
+ : delegationPolicies.every((p) => p === 'ask') ? 'ask' : 'ask';
+ const isOpen = !browserCollapsed.browser_delegation;
+ return (
+
+ setBrowserCollapsed((p) => ({ ...p, browser_delegation: !p.browser_delegation }))}
+ >
+
+
+ Delegation
+
+
+ e.stopPropagation()}>
+ handleBuiltinCategoryPermissionChange(browserDelegationTools.map((t) => t.name), 'always_allow')} sx={{ p: 0.4, borderRadius: 1, bgcolor: groupPolicy === 'always_allow' ? `${c.status.success}20` : 'transparent', color: groupPolicy === 'always_allow' ? c.status.success : c.text.ghost, '&:hover': { bgcolor: `${c.status.success}15`, color: c.status.success } }}>
+ handleBuiltinCategoryPermissionChange(browserDelegationTools.map((t) => t.name), 'ask')} sx={{ p: 0.4, borderRadius: 1, bgcolor: groupPolicy === 'ask' ? `${c.status.warning}20` : 'transparent', color: groupPolicy === 'ask' ? c.status.warning : c.text.ghost, '&:hover': { bgcolor: `${c.status.warning}15`, color: c.status.warning } }}>
+ handleBuiltinCategoryPermissionChange(browserDelegationTools.map((t) => t.name), 'deny')} sx={{ p: 0.4, borderRadius: 1, bgcolor: groupPolicy === 'deny' ? `${c.status.error}20` : 'transparent', color: groupPolicy === 'deny' ? c.status.error : c.text.ghost, '&:hover': { bgcolor: `${c.status.error}15`, color: c.status.error } }}>
+
+
+
+
+ {browserDelegationTools.map((bt) => {
+ const toolPolicy = builtinPermissions[bt.name] || 'always_allow';
+ return (
+
+
+ {bt.display_name || bt.name}
+ {bt.description && {bt.description} }
+
+ e.stopPropagation()}>
+ handleBuiltinPermissionChange(bt.name, 'always_allow')} sx={{ p: 0.4, borderRadius: 1, bgcolor: toolPolicy === 'always_allow' ? `${c.status.success}20` : 'transparent', color: toolPolicy === 'always_allow' ? c.status.success : c.text.ghost, '&:hover': { bgcolor: `${c.status.success}15`, color: c.status.success } }}>
+ handleBuiltinPermissionChange(bt.name, 'ask')} sx={{ p: 0.4, borderRadius: 1, bgcolor: toolPolicy === 'ask' ? `${c.status.warning}20` : 'transparent', color: toolPolicy === 'ask' ? c.status.warning : c.text.ghost, '&:hover': { bgcolor: `${c.status.warning}15`, color: c.status.warning } }}>
+ handleBuiltinPermissionChange(bt.name, 'deny')} sx={{ p: 0.4, borderRadius: 1, bgcolor: toolPolicy === 'deny' ? `${c.status.error}20` : 'transparent', color: toolPolicy === 'deny' ? c.status.error : c.text.ghost, '&:hover': { bgcolor: `${c.status.error}15`, color: c.status.error } }}>
+
+
+ );
+ })}
+
+
+
+ );
+ })()}
+
+ {/* Browser Actions group */}
+ {browserActionTools.length > 0 && (() => {
+ const actionPolicies = browserActionTools.map((t) => builtinPermissions[t.name] || 'always_allow');
+ const groupPolicy = actionPolicies.every((p) => p === 'always_allow') ? 'always_allow'
+ : actionPolicies.every((p) => p === 'deny') ? 'deny'
+ : actionPolicies.every((p) => p === 'ask') ? 'ask' : 'ask';
+ const isOpen = !browserCollapsed.browser_action;
+ return (
+
+ setBrowserCollapsed((p) => ({ ...p, browser_action: !p.browser_action }))}
+ >
+
+
+ Browser Actions
+
+
+ e.stopPropagation()}>
+ handleBuiltinCategoryPermissionChange(browserActionTools.map((t) => t.name), 'always_allow')} sx={{ p: 0.4, borderRadius: 1, bgcolor: groupPolicy === 'always_allow' ? `${c.status.success}20` : 'transparent', color: groupPolicy === 'always_allow' ? c.status.success : c.text.ghost, '&:hover': { bgcolor: `${c.status.success}15`, color: c.status.success } }}>
+ handleBuiltinCategoryPermissionChange(browserActionTools.map((t) => t.name), 'ask')} sx={{ p: 0.4, borderRadius: 1, bgcolor: groupPolicy === 'ask' ? `${c.status.warning}20` : 'transparent', color: groupPolicy === 'ask' ? c.status.warning : c.text.ghost, '&:hover': { bgcolor: `${c.status.warning}15`, color: c.status.warning } }}>
+ handleBuiltinCategoryPermissionChange(browserActionTools.map((t) => t.name), 'deny')} sx={{ p: 0.4, borderRadius: 1, bgcolor: groupPolicy === 'deny' ? `${c.status.error}20` : 'transparent', color: groupPolicy === 'deny' ? c.status.error : c.text.ghost, '&:hover': { bgcolor: `${c.status.error}15`, color: c.status.error } }}>
+
+
+
+
+ {browserActionTools.map((bt) => {
+ const toolPolicy = builtinPermissions[bt.name] || 'always_allow';
+ return (
+
+
+ {bt.display_name || bt.name}
+ {bt.description && {bt.description} }
+
+ e.stopPropagation()}>
+ handleBuiltinPermissionChange(bt.name, 'always_allow')} sx={{ p: 0.4, borderRadius: 1, bgcolor: toolPolicy === 'always_allow' ? `${c.status.success}20` : 'transparent', color: toolPolicy === 'always_allow' ? c.status.success : c.text.ghost, '&:hover': { bgcolor: `${c.status.success}15`, color: c.status.success } }}>
+ handleBuiltinPermissionChange(bt.name, 'ask')} sx={{ p: 0.4, borderRadius: 1, bgcolor: toolPolicy === 'ask' ? `${c.status.warning}20` : 'transparent', color: toolPolicy === 'ask' ? c.status.warning : c.text.ghost, '&:hover': { bgcolor: `${c.status.warning}15`, color: c.status.warning } }}>
+ handleBuiltinPermissionChange(bt.name, 'deny')} sx={{ p: 0.4, borderRadius: 1, bgcolor: toolPolicy === 'deny' ? `${c.status.error}20` : 'transparent', color: toolPolicy === 'deny' ? c.status.error : c.text.ghost, '&:hover': { bgcolor: `${c.status.error}15`, color: c.status.error } }}>
+
+
+ );
+ })}
+
+
+
+ );
+ })()}
+
+
+
+
+ )}
+
@@ -1029,7 +1196,7 @@ const Tools: React.FC = () => {
{ig.name}
- } label="docs" size="small" sx={{ bgcolor: c.bg.secondary, color: c.text.ghost, fontSize: '0.65rem', height: 18, '& .MuiChip-label': { px: 0.4 }, '& .MuiChip-icon': { ml: 0.4, fontSize: 10 } }} />
+ } label="docs" size="small" sx={{ bgcolor: c.bg.secondary, color: c.text.ghost, fontSize: '0.65rem', height: 18, '& .MuiChip-label': { px: 0.4 }, '& .MuiChip-icon': { ml: 0.4, fontSize: 10 } }} />
{ig.description}
@@ -1059,6 +1226,7 @@ const Tools: React.FC = () => {
const perms = tool.tool_permissions || {};
const services = perms._services as Record | undefined;
const descriptions = (perms._tool_descriptions || {}) as Record;
+ const schemas = (perms._tool_schemas || {}) as Record;
const serviceNames = services ? Object.keys(services) : [];
const hasPerms = serviceNames.length > 0;
const totalToolCount = serviceNames.reduce((acc, s) => acc + (services![s].read?.length || 0) + (services![s].write?.length || 0), 0);
@@ -1131,15 +1299,36 @@ const Tools: React.FC = () => {
handleGroupPermissionChange(tool.id, data.read!, v)} size={14} />
- {data.read!.map((name) => (
-
-
- {toDisplayName(name, serviceName)}
- {descriptions[name] && {firstSentence(descriptions[name])} }
+ {data.read!.map((name) => {
+ const schemaKey = `${tool.id}:${name}`;
+ const schema = schemas[name];
+ const schemaProps = schema?.properties as Record | undefined;
+ const schemaRequired = (schema?.required || []) as string[];
+ return (
+
+ devMode && schema && setExpandedSchema((p) => p === schemaKey ? null : schemaKey)}>
+
+ {toDisplayName(name, serviceName)}
+ {descriptions[name] && {firstSentence(descriptions[name])} }
+
+ handlePermissionChange(tool.id, name, v)} size={14} />
+
+ {devMode && expandedSchema === schemaKey && schemaProps && (
+
+ Input Parameters
+ {Object.entries(schemaProps).map(([pName, pDef]: [string, any]) => (
+
+ {pName}
+ {pDef?.type || 'any'}
+ {schemaRequired.includes(pName) && }
+ {pDef?.description && {pDef.description} }
+
+ ))}
+
+ )}
- handlePermissionChange(tool.id, name, v)} size={14} />
-
- ))}
+ );
+ })}
)}
{(data.write?.length || 0) > 0 && (
@@ -1152,15 +1341,36 @@ const Tools: React.FC = () => {
handleGroupPermissionChange(tool.id, data.write!, v)} size={14} />
- {data.write!.map((name) => (
-
-
- {toDisplayName(name, serviceName)}
- {descriptions[name] && {firstSentence(descriptions[name])} }
+ {data.write!.map((name) => {
+ const schemaKey = `${tool.id}:${name}`;
+ const schema = schemas[name];
+ const schemaProps = schema?.properties as Record | undefined;
+ const schemaRequired = (schema?.required || []) as string[];
+ return (
+
+ devMode && schema && setExpandedSchema((p) => p === schemaKey ? null : schemaKey)}>
+
+ {toDisplayName(name, serviceName)}
+ {descriptions[name] && {firstSentence(descriptions[name])} }
+
+ handlePermissionChange(tool.id, name, v)} size={14} />
+
+ {devMode && expandedSchema === schemaKey && schemaProps && (
+
+ Input Parameters
+ {Object.entries(schemaProps).map(([pName, pDef]: [string, any]) => (
+
+ {pName}
+ {pDef?.type || 'any'}
+ {schemaRequired.includes(pName) && }
+ {pDef?.description && {pDef.description} }
+
+ ))}
+
+ )}
- handlePermissionChange(tool.id, name, v)} size={14} />
-
- ))}
+ );
+ })}
)}
@@ -1202,7 +1412,7 @@ const Tools: React.FC = () => {
)}
{ig && (
- } label="docs" size="small" sx={{ bgcolor: c.bg.secondary, color: c.text.ghost, fontSize: '0.65rem', height: 18, '& .MuiChip-label': { px: 0.4 }, '& .MuiChip-icon': { ml: 0.4, fontSize: 10 } }} />
+ } label="docs" size="small" sx={{ bgcolor: c.bg.secondary, color: c.text.ghost, fontSize: '0.65rem', height: 18, '& .MuiChip-label': { px: 0.4 }, '& .MuiChip-icon': { ml: 0.4, fontSize: 10 } }} />
)}
{tool.description && {tool.description} }
@@ -1330,6 +1540,46 @@ const Tools: React.FC = () => {
))}
)}
+
+ {devMode && isMcp && (
+
+
+ Developer Info
+
+
+
+ MCP Config
+
+
+ {JSON.stringify(tool.mcp_config, null, 2)}
+
+
+
+
+ Auth type:
+ {tool.auth_type || 'none'}
+
+
+ Status:
+ {tool.auth_status || 'none'}
+
+ {tool.connected_account_email && (
+
+ Account:
+ {tool.connected_account_email}
+
+ )}
+
+ {tool.credentials && Object.keys(tool.credentials).length > 0 && (
+
+ Credentials:
+ {Object.keys(tool.credentials).map((key) => (
+
+ ))}
+
+ )}
+
+ )}
@@ -1366,17 +1616,24 @@ const Tools: React.FC = () => {
MCP Registry
{regStats && (
-
+ <>
+
+ {devMode && regStats.lastUpdated > 0 && (
+
+ Synced {Math.round((Date.now() / 1000 - regStats.lastUpdated) / 60)}m ago
+
+ )}
+ >
)}
{
{regServers.map((srv) => {
const isExpanded = expandedServer === srv.name;
+ const isInstalled = allTools.some((t) => t.name === (srv.title || cleanServerName(srv.name)));
return (
setExpandedServer(isExpanded ? null : srv.name)}
+ onClick={() => {
+ const next = isExpanded ? null : srv.name;
+ setExpandedServer(next);
+ if (next && devMode) {
+ dispatch(clearDetail());
+ dispatch(fetchServerDetail(srv.name));
+ }
+ }}
sx={{
display: 'flex', alignItems: 'center', gap: 1.5,
px: 1.5, py: 1, borderRadius: 1.5, cursor: 'pointer',
@@ -1504,6 +1769,12 @@ const Tools: React.FC = () => {
)}
+ {devMode && !srv.remoteType && (
+
+ )}
+ {isInstalled && (
+ } label="Installed" size="small" sx={{ bgcolor: `${c.status.success}15`, color: c.status.success, fontSize: '0.65rem', height: 18, '& .MuiChip-label': { px: 0.4 }, '& .MuiChip-icon': { ml: 0.4, color: c.status.success } }} />
+ )}
{srv.description}
@@ -1533,8 +1804,6 @@ const Tools: React.FC = () => {
}
label="Website"
@@ -1546,8 +1815,6 @@ const Tools: React.FC = () => {
}
label="Repository"
@@ -1558,6 +1825,46 @@ const Tools: React.FC = () => {
+ {devMode && (
+
+ {regDetailLoading && expandedServer === srv.name ? (
+
+ ) : regDetail && regDetail.name === srv.name ? (
+
+ {(regDetail.keywords?.length > 0 || regDetail.license) && (
+
+ {regDetail.license && (
+
+ )}
+ {regDetail.keywords?.map((kw) => (
+
+ ))}
+
+ )}
+ {regDetail.environmentVariables?.length > 0 && (
+
+
+ Required Environment Variables
+
+ {regDetail.environmentVariables.map((ev) => (
+
+
+ {ev.name}
+
+ {ev.description && (
+
+ {ev.description}
+
+ )}
+
+ ))}
+
+ )}
+
+ ) : null}
+
+ )}
+
;
}
-const PROTECTED_FILES = new Set(['index.html', 'schema.json', 'meta.json']);
+const PROTECTED_FILES = new Set(['index.html', 'schema.json', 'meta.json', 'SKILL.md']);
const FileTreeItem: React.FC = ({ node, depth, activeFile, onSelect, onDelete, c }) => {
const [open, setOpen] = useState(true);
@@ -733,6 +732,7 @@ const ViewEditor: React.FC = ({ output, onClose }) => {
const outputFiles = { ...files };
delete outputFiles['meta.json'];
delete outputFiles['schema.json'];
+ delete outputFiles['SKILL.md'];
return {
name: name || 'Untitled App',
@@ -795,27 +795,6 @@ const ViewEditor: React.FC = ({ output, onClose }) => {
await performSaveRef.current?.(close);
};
- const handleClose = async () => {
- if (autoSaveTimerRef.current) clearTimeout(autoSaveTimerRef.current);
- if (savedStatusTimerRef.current) clearTimeout(savedStatusTimerRef.current);
- const eid = output?.id ?? createdIdRef.current;
- if (!savedRef.current && (files['index.html'] ?? '').trim()) {
- try {
- const body = buildBody();
- let savedId: string;
- if (eid) {
- await dispatch(updateOutput({ id: eid, ...body })).unwrap();
- savedId = eid;
- } else {
- const created = await dispatch(createOutput(body)).unwrap();
- savedId = created.id;
- }
- captureThumbnailAsync(savedId);
- } catch {}
- }
- onClose();
- };
-
const handleRunPreview = async () => {
const eid = output?.id ?? createdIdRef.current;
if (!eid) {
@@ -970,7 +949,7 @@ const ViewEditor: React.FC = ({ output, onClose }) => {
? `${SERVE_BASE}/workspace/${workspaceId}/serve/index.html`
: undefined;
- const filePaths = useMemo(() => Object.keys(files).filter(p => p !== 'meta.json').sort(), [files]);
+ const filePaths = useMemo(() => Object.keys(files).filter(p => p !== 'meta.json' && p !== 'SKILL.md').sort(), [files]);
const fileTree = useMemo(() => buildFileTree(filePaths), [filePaths]);
const updateFile = useCallback((path: string, content: string) => {
@@ -1136,10 +1115,6 @@ const ViewEditor: React.FC = ({ output, onClose }) => {
minHeight: 44,
}}
>
-
-
-
-
setName(e.target.value)}
diff --git a/frontend/src/app/pages/Views/Views.tsx b/frontend/src/app/pages/Views/Views.tsx
index 110562d8..7de1b83a 100644
--- a/frontend/src/app/pages/Views/Views.tsx
+++ b/frontend/src/app/pages/Views/Views.tsx
@@ -39,6 +39,9 @@ const Views: React.FC = () => {
setEditorOpen(true);
} else if (routeId && routeId !== 'new') {
navigate('/apps', { replace: true });
+ } else if (!routeId) {
+ setEditorOpen(false);
+ setEditingOutput(null);
}
}, [routeId, loaded, items, navigate]);
@@ -62,7 +65,7 @@ const Views: React.FC = () => {
};
if (editorOpen) {
- return ;
+ return ;
}
return (
diff --git a/frontend/src/shared/browserCommandHandler.ts b/frontend/src/shared/browserCommandHandler.ts
index b9ddd233..5227ad41 100644
--- a/frontend/src/shared/browserCommandHandler.ts
+++ b/frontend/src/shared/browserCommandHandler.ts
@@ -4,11 +4,12 @@ import { resolveInput } from './resolveUrl';
let initialized = false;
-export type BrowserAction = 'screenshot' | 'get_text' | 'navigate' | 'click' | 'type' | 'evaluate' | 'get_elements';
+export type BrowserAction = 'screenshot' | 'get_text' | 'navigate' | 'click' | 'type' | 'evaluate' | 'get_elements' | 'scroll' | 'wait';
export interface BrowserActivity {
action: BrowserAction;
detail?: string;
+ coords?: { xPercent: number; yPercent: number };
}
type ActivityListener = (browserId: string, activity: BrowserActivity | null) => void;
@@ -42,6 +43,8 @@ const ACTION_LABELS: Record = {
type: 'Typing...',
evaluate: 'Evaluating...',
get_elements: 'Inspecting...',
+ scroll: 'Scrolling...',
+ wait: 'Waiting...',
};
export function getActionLabel(action: string): string {
@@ -94,6 +97,8 @@ async function handleClick(wv: BrowserWebview, params: Record): Pro
return {
text: 'Clicked element: ' + el.tagName.toLowerCase() + (el.id ? '#' + el.id : ''),
url: location.href,
+ clickX: window.innerWidth > 0 ? x / window.innerWidth : 0.5,
+ clickY: window.innerHeight > 0 ? y / window.innerHeight : 0.5,
};
})()`;
const result = await wv.executeJavaScript(code);
@@ -128,6 +133,84 @@ async function handleType(wv: BrowserWebview, params: Record): Prom
return result;
}
+async function handleScroll(wv: BrowserWebview, params: Record): Promise> {
+ const direction = (params.direction as string) || 'down';
+ const amount = (params.amount as number) || 500;
+ const code = `(() => {
+ function findScrollable() {
+ const candidates = document.querySelectorAll(
+ '[class*="scroller"], [class*="scroll-container"], [class*="content"], '
+ + 'main, [role="main"], article, .notion-scroller, .notion-frame'
+ );
+ for (const el of candidates) {
+ const s = window.getComputedStyle(el);
+ const isScrollable = (s.overflow === 'auto' || s.overflow === 'scroll'
+ || s.overflowY === 'auto' || s.overflowY === 'scroll');
+ if (isScrollable && el.scrollHeight > el.clientHeight + 10) return el;
+ }
+ const all = document.querySelectorAll('*');
+ for (const el of all) {
+ if (el === document.body || el === document.documentElement) continue;
+ const s = window.getComputedStyle(el);
+ const isScrollable = (s.overflow === 'auto' || s.overflow === 'scroll'
+ || s.overflowY === 'auto' || s.overflowY === 'scroll');
+ if (isScrollable && el.scrollHeight > el.clientHeight + 50
+ && el.clientHeight > 200) return el;
+ }
+ return null;
+ }
+ const dy = ${JSON.stringify(direction)} === 'up' ? -${amount} : ${amount};
+ const container = findScrollable();
+ if (container) {
+ const before = container.scrollTop;
+ container.scrollBy({ top: dy, behavior: 'instant' });
+ const after = container.scrollTop;
+ return {
+ scrolled: Math.abs(after - before),
+ scrollTop: after,
+ scrollHeight: container.scrollHeight,
+ clientHeight: container.clientHeight,
+ atTop: after <= 0,
+ atBottom: after + container.clientHeight >= container.scrollHeight - 5,
+ target: 'container',
+ };
+ }
+ const before = window.scrollY;
+ window.scrollBy({ top: dy, behavior: 'instant' });
+ const after = window.scrollY;
+ return {
+ scrolled: Math.abs(after - before),
+ scrollTop: after,
+ scrollHeight: document.documentElement.scrollHeight,
+ clientHeight: window.innerHeight,
+ atTop: after <= 0,
+ atBottom: after + window.innerHeight >= document.documentElement.scrollHeight - 5,
+ target: 'window',
+ };
+ })()`;
+ try {
+ const result = await wv.executeJavaScript(code);
+ const status = result.atBottom ? ' (reached bottom)' : result.atTop ? ' (reached top)' : '';
+ return {
+ text: `Scrolled ${direction} by ${result.scrolled}px${status}. Position: ${result.scrollTop}/${result.scrollHeight - result.clientHeight}px`,
+ ...result,
+ url: wv.getURL(),
+ };
+ } catch (err: any) {
+ return { error: `Scroll failed: ${err?.message || String(err)}` };
+ }
+}
+
+async function handleWait(wv: BrowserWebview, params: Record): Promise> {
+ const ms = Math.min(Math.max((params.milliseconds as number) || 1000, 100), 10000);
+ await new Promise((resolve) => setTimeout(resolve, ms));
+ return {
+ text: `Waited ${ms}ms. Current URL: ${wv.getURL()}`,
+ url: wv.getURL(),
+ title: wv.getTitle(),
+ };
+}
+
async function handleGetElements(wv: BrowserWebview, params: Record): Promise> {
const scope = (params.selector as string) || 'body';
const safeScope = JSON.stringify(scope);
@@ -135,51 +218,57 @@ async function handleGetElements(wv: BrowserWebview, params: Record
const scope = document.querySelector(${safeScope}) || document.body;
const interactive = scope.querySelectorAll(
'a[href], button, input, textarea, select, [role="button"], [role="link"], '
- + '[role="textbox"], [role="searchbox"], [onclick], [tabindex]:not([tabindex="-1"])'
+ + '[role="textbox"], [role="searchbox"], [role="menuitem"], [role="tab"], '
+ + '[role="checkbox"], [role="switch"], [role="option"], '
+ + '[onclick], [tabindex]:not([tabindex="-1"]), '
+ + '[data-block-id], [contenteditable="true"]'
);
+ const seen = new Set();
const results = [];
for (const el of interactive) {
- if (results.length >= 60) break;
+ if (results.length >= 80) break;
const rect = el.getBoundingClientRect();
if (rect.width === 0 && rect.height === 0) continue;
- if (window.getComputedStyle(el).visibility === 'hidden') continue;
+ const style = window.getComputedStyle(el);
+ if (style.visibility === 'hidden' || style.display === 'none') continue;
+ if (style.opacity === '0') continue;
let selector = el.tagName.toLowerCase();
if (el.id) {
- selector = '#' + el.id;
+ selector = '#' + CSS.escape(el.id);
+ } else if (el.getAttribute('data-block-id')) {
+ selector = '[data-block-id="' + el.getAttribute('data-block-id') + '"]';
} else if (el.getAttribute('name')) {
- selector = el.tagName.toLowerCase() + '[name="' + el.getAttribute('name') + '"]';
+ selector = el.tagName.toLowerCase() + '[name="' + CSS.escape(el.getAttribute('name')) + '"]';
} else if (el.getAttribute('aria-label')) {
- selector = el.tagName.toLowerCase() + '[aria-label="' + el.getAttribute('aria-label') + '"]';
+ selector = el.tagName.toLowerCase() + '[aria-label="' + CSS.escape(el.getAttribute('aria-label')) + '"]';
} else if (el.getAttribute('type') && el.tagName === 'INPUT') {
selector = 'input[type="' + el.getAttribute('type') + '"]';
if (el.getAttribute('placeholder'))
- selector += '[placeholder="' + el.getAttribute('placeholder') + '"]';
+ selector += '[placeholder="' + CSS.escape(el.getAttribute('placeholder')) + '"]';
} else if (el.className && typeof el.className === 'string') {
const cls = el.className.trim().split(/\\s+/)[0];
- if (cls && cls.length < 40)
+ if (cls && cls.length < 60)
selector = el.tagName.toLowerCase() + '.' + CSS.escape(cls);
}
- const verify = document.querySelectorAll(selector);
- if (verify.length > 1) {
+ if (seen.has(selector)) {
const parent = el.parentElement;
if (parent && parent.id) {
- selector = '#' + parent.id + ' > ' + selector;
+ selector = '#' + CSS.escape(parent.id) + ' > ' + selector;
} else {
- const siblings = parent ? Array.from(parent.querySelectorAll(':scope > ' + el.tagName.toLowerCase())) : [];
+ const siblings = parent ? Array.from(parent.children) : [];
const idx = siblings.indexOf(el);
- if (idx >= 0 && parent)
- selector = (parent.tagName.toLowerCase() + (parent.className ? '.' + CSS.escape(parent.className.trim().split(/\\s+/)[0]) : ''))
- + ' > ' + el.tagName.toLowerCase() + ':nth-child(' + (idx + 1) + ')';
+ if (idx >= 0) selector += ':nth-child(' + (idx + 1) + ')';
}
}
+ seen.add(selector);
results.push({
selector,
tag: el.tagName.toLowerCase(),
type: el.type || null,
- text: (el.textContent || '').trim().substring(0, 80) || null,
+ text: (el.textContent || '').trim().substring(0, 120) || null,
placeholder: el.placeholder || null,
ariaLabel: el.getAttribute('aria-label') || null,
role: el.getAttribute('role') || null,
@@ -238,6 +327,13 @@ async function handleBrowserCommand(data: Record) {
break;
case 'click':
result = await handleClick(wv, params);
+ if (result.clickX != null && result.clickY != null) {
+ setActivity(browser_id, {
+ action: 'click',
+ detail,
+ coords: { xPercent: result.clickX, yPercent: result.clickY },
+ });
+ }
break;
case 'type':
result = await handleType(wv, params);
@@ -248,6 +344,12 @@ async function handleBrowserCommand(data: Record) {
case 'get_elements':
result = await handleGetElements(wv, params);
break;
+ case 'scroll':
+ result = await handleScroll(wv, params);
+ break;
+ case 'wait':
+ result = await handleWait(wv, params);
+ break;
default:
result = { error: `Unknown browser action: ${action}` };
}
diff --git a/frontend/src/shared/browserRegistry.ts b/frontend/src/shared/browserRegistry.ts
index 09e79f52..a8eba9a5 100644
--- a/frontend/src/shared/browserRegistry.ts
+++ b/frontend/src/shared/browserRegistry.ts
@@ -51,6 +51,15 @@ export function getAllWebviews(): Map {
return new Map(registry);
}
+export function findBrowserByWebContentsId(wcId: number): string | undefined {
+ for (const [key, wv] of registry.entries()) {
+ if ((wv as any).getWebContentsId?.() === wcId) {
+ return key.split(':')[0];
+ }
+ }
+ return undefined;
+}
+
export function unregisterAllForBrowser(browserId: string): void {
const prefix = `${browserId}:`;
for (const key of registry.keys()) {
diff --git a/frontend/src/shared/dashboardClipboard.ts b/frontend/src/shared/dashboardClipboard.ts
new file mode 100644
index 00000000..a3b4af88
--- /dev/null
+++ b/frontend/src/shared/dashboardClipboard.ts
@@ -0,0 +1,34 @@
+import type { CardType } from '@/app/pages/Dashboard/useDashboardSelection';
+
+export interface ClipboardCard {
+ type: CardType;
+ id: string;
+ name: string;
+ meta: Record;
+ x: number;
+ y: number;
+ width: number;
+ height: number;
+ expanded?: boolean;
+}
+
+let clipboardCards: ClipboardCard[] = [];
+let clipboardTimestamp = 0;
+
+export function setClipboardCards(cards: ClipboardCard[]): void {
+ clipboardCards = cards;
+ clipboardTimestamp = Date.now();
+}
+
+export function getClipboardCards(): ClipboardCard[] {
+ return clipboardCards;
+}
+
+export function getClipboardTimestamp(): number {
+ return clipboardTimestamp;
+}
+
+export function clearClipboard(): void {
+ clipboardCards = [];
+ clipboardTimestamp = 0;
+}
diff --git a/frontend/src/shared/state/agentsSlice.ts b/frontend/src/shared/state/agentsSlice.ts
index 4fb21107..8173c487 100644
--- a/frontend/src/shared/state/agentsSlice.ts
+++ b/frontend/src/shared/state/agentsSlice.ts
@@ -14,6 +14,7 @@ export interface AgentMessage {
attached_skills?: Array<{ id: string; name: string }>;
forced_tools?: string[];
images?: Array<{ data: string; media_type: string }>;
+ hidden?: boolean;
}
export interface ApprovalRequest {
@@ -69,6 +70,7 @@ export interface AgentSession {
tool_group_meta: Record;
dashboard_id?: string;
browser_id?: string | null;
+ parent_session_id?: string | null;
}
export interface AgentConfig {
@@ -109,6 +111,7 @@ interface AgentsState {
expandedSessionIds: string[];
loading: boolean;
historySearch: HistorySearchState;
+ trackedNotificationIds: string[];
}
const initialState: AgentsState = {
@@ -118,6 +121,7 @@ const initialState: AgentsState = {
expandedSessionIds: [],
loading: false,
historySearch: { results: [], total: 0, hasMore: false, query: '', loading: false },
+ trackedNotificationIds: [],
};
export const fetchSessions = createAsyncThunk(
@@ -151,15 +155,17 @@ export interface SendMessagePayload {
contextPaths?: Array<{ path: string; type: 'file' | 'directory' }>;
forcedTools?: string[];
attachedSkills?: Array<{ id: string; name: string; content: string }>;
+ hidden?: boolean;
+ selectedBrowserIds?: string[];
}
export const sendMessage = createAsyncThunk(
'agents/sendMessage',
- async ({ sessionId, prompt, mode, model, images, contextPaths, forcedTools, attachedSkills }: SendMessagePayload) => {
+ async ({ sessionId, prompt, mode, model, images, contextPaths, forcedTools, attachedSkills, hidden, selectedBrowserIds }: SendMessagePayload) => {
await fetch(`${AGENTS_API}/sessions/${sessionId}/message`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify({ prompt, mode, model, images, context_paths: contextPaths, forced_tools: forcedTools, attached_skills: attachedSkills }),
+ body: JSON.stringify({ prompt, mode, model, images, context_paths: contextPaths, forced_tools: forcedTools, attached_skills: attachedSkills, hidden, selected_browser_ids: selectedBrowserIds }),
});
return { sessionId, prompt };
}
@@ -212,6 +218,7 @@ export interface LaunchAndSendPayload {
forcedTools?: string[];
attachedSkills?: Array<{ id: string; name: string; content: string }>;
expand?: boolean;
+ selectedBrowserIds?: string[];
}
export const fetchSession = createAsyncThunk(
@@ -225,7 +232,7 @@ export const fetchSession = createAsyncThunk(
export const launchAndSendFirstMessage = createAsyncThunk(
'agents/launchAndSendFirstMessage',
- async ({ draftId, config, prompt, mode, model, images, contextPaths, forcedTools, attachedSkills }: LaunchAndSendPayload) => {
+ async ({ draftId, config, prompt, mode, model, images, contextPaths, forcedTools, attachedSkills, selectedBrowserIds }: LaunchAndSendPayload) => {
const launchRes = await fetch(`${AGENTS_API}/launch`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
@@ -237,7 +244,7 @@ export const launchAndSendFirstMessage = createAsyncThunk(
await fetch(`${AGENTS_API}/sessions/${session.id}/message`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify({ prompt, mode, model, images, context_paths: contextPaths, forced_tools: forcedTools, attached_skills: attachedSkills }),
+ body: JSON.stringify({ prompt, mode, model, images, context_paths: contextPaths, forced_tools: forcedTools, attached_skills: attachedSkills, selected_browser_ids: selectedBrowserIds }),
});
const refreshRes = await fetch(`${AGENTS_API}/sessions/${session.id}`);
@@ -328,6 +335,20 @@ export const closeSession = createAsyncThunk(
}
);
+export const duplicateSession = createAsyncThunk(
+ 'agents/duplicateSession',
+ async ({ sessionId, dashboardId, upToMessageId }: { sessionId: string; dashboardId?: string; upToMessageId?: string }) => {
+ const res = await fetch(`${AGENTS_API}/sessions/${sessionId}/duplicate`, {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ dashboard_id: dashboardId, up_to_message_id: upToMessageId }),
+ });
+ if (!res.ok) throw new Error('Failed to duplicate session');
+ const data = await res.json();
+ return data.session as AgentSession;
+ }
+);
+
export const deleteSession = createAsyncThunk(
'agents/deleteSession',
async ({ sessionId }: { sessionId: string }) => {
@@ -380,6 +401,15 @@ export const resumeSession = createAsyncThunk(
}
);
+export const fetchBrowserAgentChildren = createAsyncThunk(
+ 'agents/fetchBrowserAgentChildren',
+ async (parentSessionId: string) => {
+ const res = await fetch(`${AGENTS_API}/sessions/${parentSessionId}/browser-agents`);
+ const data = await res.json();
+ return data.sessions as AgentSession[];
+ }
+);
+
const agentsSlice = createSlice({
name: 'agents',
initialState,
@@ -497,6 +527,9 @@ const agentsSlice = createSlice({
streamingMessage: existing?.streamingMessage ?? action.payload.streamingMessage ?? null,
tool_group_meta: { ...existing?.tool_group_meta, ...action.payload.tool_group_meta },
};
+ if (action.payload.status === 'running' && !state.trackedNotificationIds.includes(action.payload.id)) {
+ state.trackedNotificationIds.push(action.payload.id);
+ }
},
updateSessionStatus(
@@ -507,6 +540,9 @@ const agentsSlice = createSlice({
if (session) {
session.status = action.payload.status;
}
+ if (action.payload.status === 'running' && !state.trackedNotificationIds.includes(action.payload.sessionId)) {
+ state.trackedNotificationIds.push(action.payload.sessionId);
+ }
},
addMessage(state, action: PayloadAction<{ sessionId: string; message: AgentMessage }>) {
@@ -629,7 +665,19 @@ const agentsSlice = createSlice({
closeSessionFromWs(state, action: PayloadAction) {
const entry = action.payload;
state.history[entry.id] = entry;
- delete state.sessions[entry.id];
+
+ const session = state.sessions[entry.id];
+ if (session?.mode === 'browser-agent' && session.parent_session_id) {
+ session.status = (entry.status as AgentSession['status']) || 'completed';
+ } else {
+ delete state.sessions[entry.id];
+ for (const [id, s] of Object.entries(state.sessions)) {
+ if (s.mode === 'browser-agent' && s.parent_session_id === entry.id) {
+ delete state.sessions[id];
+ }
+ }
+ }
+
if (state.activeSessionId === entry.id) {
state.activeSessionId = null;
}
@@ -651,6 +699,18 @@ const agentsSlice = createSlice({
clearHistorySearch(state) {
state.historySearch = { results: [], total: 0, hasMore: false, query: '', loading: false };
},
+
+ trackAgentNotification(state, action: PayloadAction) {
+ if (!state.trackedNotificationIds.includes(action.payload)) {
+ state.trackedNotificationIds.push(action.payload);
+ }
+ },
+
+ dismissAgentNotification(state, action: PayloadAction) {
+ state.trackedNotificationIds = state.trackedNotificationIds.filter(
+ (id) => id !== action.payload,
+ );
+ },
},
extraReducers: (builder) => {
builder
@@ -682,6 +742,9 @@ const agentsSlice = createSlice({
if (!state.expandedSessionIds.includes(action.payload.id)) {
state.expandedSessionIds.push(action.payload.id);
}
+ if (!state.trackedNotificationIds.includes(action.payload.id)) {
+ state.trackedNotificationIds.push(action.payload.id);
+ }
})
.addCase(launchAndSendFirstMessage.fulfilled, (state, action) => {
const { draftId, session } = action.payload;
@@ -693,6 +756,9 @@ const agentsSlice = createSlice({
if (shouldExpand && !state.expandedSessionIds.includes(session.id)) {
state.expandedSessionIds.push(session.id);
}
+ if (!state.trackedNotificationIds.includes(session.id)) {
+ state.trackedNotificationIds.push(session.id);
+ }
})
.addCase(generateTitle.fulfilled, (state, action) => {
const session = state.sessions[action.payload.sessionId];
@@ -721,6 +787,8 @@ const agentsSlice = createSlice({
const session = state.sessions[action.payload];
if (session) {
session.status = 'stopped';
+ session.streamingMessage = null;
+ session.pending_approvals = [];
}
})
.addCase(handleApproval.fulfilled, (state, action) => {
@@ -736,6 +804,10 @@ const agentsSlice = createSlice({
session.active_branch_id = action.payload.branchId;
}
})
+ .addCase(duplicateSession.fulfilled, (state, action) => {
+ const session = action.payload;
+ state.sessions[session.id] = session;
+ })
.addCase(closeSession.fulfilled, (state, action) => {
const sessionId = action.payload;
const session = state.sessions[sessionId];
@@ -788,6 +860,7 @@ const agentsSlice = createSlice({
state.activeSessionId = null;
}
state.expandedSessionIds = state.expandedSessionIds.filter((id) => id !== sessionId);
+ state.trackedNotificationIds = state.trackedNotificationIds.filter((id) => id !== sessionId);
})
.addCase(fetchHistory.fulfilled, (state, action) => {
const history: Record = {};
@@ -808,12 +881,22 @@ const agentsSlice = createSlice({
.addCase(fetchSession.fulfilled, (state, action) => {
const session = action.payload;
const existing = state.sessions[session.id];
- if (existing) {
- state.sessions[session.id] = {
- ...session,
- streamingMessage: existing.streamingMessage ?? null,
- tool_group_meta: session.tool_group_meta ?? existing.tool_group_meta ?? {},
- };
+ state.sessions[session.id] = {
+ ...session,
+ pending_approvals: session.pending_approvals ?? existing?.pending_approvals ?? [],
+ streamingMessage: existing?.streamingMessage ?? null,
+ tool_group_meta: session.tool_group_meta ?? existing?.tool_group_meta ?? {},
+ };
+ })
+ .addCase(fetchBrowserAgentChildren.fulfilled, (state, action) => {
+ for (const session of action.payload) {
+ if (!state.sessions[session.id]) {
+ state.sessions[session.id] = {
+ ...session,
+ streamingMessage: null,
+ tool_group_meta: session.tool_group_meta ?? {},
+ };
+ }
}
})
.addCase(searchHistory.pending, (state) => {
@@ -864,6 +947,8 @@ export const {
closeSessionFromWs,
removeDraftSession,
clearHistorySearch,
+ trackAgentNotification,
+ dismissAgentNotification,
} = agentsSlice.actions;
export default agentsSlice.reducer;
diff --git a/frontend/src/shared/state/dashboardLayoutSlice.ts b/frontend/src/shared/state/dashboardLayoutSlice.ts
index 721aef6c..45d32318 100644
--- a/frontend/src/shared/state/dashboardLayoutSlice.ts
+++ b/frontend/src/shared/state/dashboardLayoutSlice.ts
@@ -11,7 +11,7 @@ export const DEFAULT_VIEW_CARD_H = 800;
export const DEFAULT_BROWSER_CARD_W = 1280;
export const DEFAULT_BROWSER_CARD_H = 800;
export const EXPANDED_CARD_MIN_H = 620;
-const GRID_GAP = 24;
+export const GRID_GAP = 24;
const GRID_ORIGIN = { x: 40, y: 100 };
const GRID_COLS_FALLBACK = 4;
@@ -53,7 +53,9 @@ export interface DashboardLayoutState {
cards: Record;
viewCards: Record;
browserCards: Record;
+ closedCardPositions: Record;
glowingBrowserCards: Record;
+ glowingAgentCards: Record;
persistedExpandedSessionIds: string[];
loading: boolean;
initialized: boolean;
@@ -63,7 +65,9 @@ const initialState: DashboardLayoutState = {
cards: {},
viewCards: {},
browserCards: {},
+ closedCardPositions: {},
glowingBrowserCards: {},
+ glowingAgentCards: {},
persistedExpandedSessionIds: [],
loading: false,
initialized: false,
@@ -214,6 +218,14 @@ const dashboardLayoutSlice = createSlice({
}
},
+ placeCard(
+ state,
+ action: PayloadAction<{ sessionId: string; x: number; y: number; width: number; height: number }>
+ ) {
+ const { sessionId, x, y, width, height } = action.payload;
+ state.cards[sessionId] = { session_id: sessionId, x, y, width, height };
+ },
+
removeCard(state, action: PayloadAction) {
delete state.cards[action.payload];
},
@@ -227,6 +239,7 @@ const dashboardLayoutSlice = createSlice({
for (const id of Object.keys(state.cards)) {
if (!liveIds.has(id)) {
+ state.closedCardPositions[id] = { ...state.cards[id] };
delete state.cards[id];
}
}
@@ -235,15 +248,21 @@ const dashboardLayoutSlice = createSlice({
const newIds = sessionIds.filter((id) => !state.cards[id]);
for (const id of newIds) {
if (hasDraftCard && !id.startsWith('draft-')) continue;
- const rects = collectOccupiedRects(state, expandedSessionIds);
- const pos = findOpenGridCell(rects, DEFAULT_CARD_W, DEFAULT_CARD_H);
- state.cards[id] = {
- session_id: id,
- x: pos.x,
- y: pos.y,
- width: DEFAULT_CARD_W,
- height: DEFAULT_CARD_H,
- };
+ const savedPos = state.closedCardPositions[id];
+ if (savedPos) {
+ state.cards[id] = { ...savedPos, session_id: id };
+ delete state.closedCardPositions[id];
+ } else {
+ const rects = collectOccupiedRects(state, expandedSessionIds);
+ const pos = findOpenGridCell(rects, DEFAULT_CARD_W, DEFAULT_CARD_H);
+ state.cards[id] = {
+ session_id: id,
+ x: pos.x,
+ y: pos.y,
+ width: DEFAULT_CARD_W,
+ height: DEFAULT_CARD_H,
+ };
+ }
}
},
@@ -259,9 +278,9 @@ const dashboardLayoutSlice = createSlice({
if (total === 0) return;
const allItems = [
- ...agentCards.map((c) => ({ kind: 'agent' as const, id: c.session_id, x: c.x, y: c.y, storedH: c.height })),
- ...viewCards.map((c) => ({ kind: 'view' as const, id: c.output_id, x: c.x, y: c.y, storedH: c.height })),
- ...bCards.map((c) => ({ kind: 'browser' as const, id: c.browser_id, x: c.x, y: c.y, storedH: c.height })),
+ ...agentCards.map((c) => ({ kind: 'agent' as const, id: c.session_id, x: c.x, y: c.y, storedW: c.width, storedH: c.height })),
+ ...viewCards.map((c) => ({ kind: 'view' as const, id: c.output_id, x: c.x, y: c.y, storedW: c.width, storedH: c.height })),
+ ...bCards.map((c) => ({ kind: 'browser' as const, id: c.browser_id, x: c.x, y: c.y, storedW: c.width, storedH: c.height })),
];
allItems.sort((a, b) => a.y - b.y || a.x - b.x);
@@ -270,12 +289,11 @@ const dashboardLayoutSlice = createSlice({
for (const item of allItems) {
let w: number, h: number;
if (item.kind === 'agent') {
- w = DEFAULT_CARD_W;
- h = expanded.has(item.id) ? Math.max(EXPANDED_CARD_MIN_H, item.storedH) : DEFAULT_CARD_H;
- } else if (item.kind === 'view') {
- w = DEFAULT_VIEW_CARD_W; h = DEFAULT_VIEW_CARD_H;
+ w = item.storedW;
+ h = expanded.has(item.id) ? Math.max(EXPANDED_CARD_MIN_H, item.storedH) : item.storedH;
} else {
- w = DEFAULT_BROWSER_CARD_W; h = DEFAULT_BROWSER_CARD_H;
+ w = item.storedW;
+ h = item.storedH;
}
const pos = findOpenGridCell(placedRects, w, h);
@@ -283,28 +301,39 @@ const dashboardLayoutSlice = createSlice({
if (item.kind === 'agent') {
const card = state.cards[item.id];
- if (card) { card.x = pos.x; card.y = pos.y; card.width = w; card.height = h; }
+ if (card) { card.x = pos.x; card.y = pos.y; }
} else if (item.kind === 'view') {
const card = state.viewCards[item.id];
- if (card) { card.x = pos.x; card.y = pos.y; card.width = w; card.height = h; }
+ if (card) { card.x = pos.x; card.y = pos.y; }
} else {
const card = state.browserCards[item.id];
- if (card) { card.x = pos.x; card.y = pos.y; card.width = w; card.height = h; }
+ if (card) { card.x = pos.x; card.y = pos.y; }
}
}
},
- addViewCard(state, action: PayloadAction<{ outputId: string; expandedSessionIds?: string[] }>) {
- const { outputId, expandedSessionIds } = action.payload;
+ addViewCard(state, action: PayloadAction<{
+ outputId: string; expandedSessionIds?: string[];
+ x?: number; y?: number; width?: number; height?: number;
+ }>) {
+ const { outputId, expandedSessionIds, x, y, width, height } = action.payload;
if (state.viewCards[outputId]) return;
- const rects = collectOccupiedRects(state, expandedSessionIds);
- const pos = findOpenGridCell(rects, DEFAULT_VIEW_CARD_W, DEFAULT_VIEW_CARD_H);
+ let posX: number, posY: number;
+ if (x != null && y != null) {
+ posX = x;
+ posY = y;
+ } else {
+ const rects = collectOccupiedRects(state, expandedSessionIds);
+ const pos = findOpenGridCell(rects, DEFAULT_VIEW_CARD_W, DEFAULT_VIEW_CARD_H);
+ posX = pos.x;
+ posY = pos.y;
+ }
state.viewCards[outputId] = {
output_id: outputId,
- x: pos.x,
- y: pos.y,
- width: DEFAULT_VIEW_CARD_W,
- height: DEFAULT_VIEW_CARD_H,
+ x: posX,
+ y: posY,
+ width: width || DEFAULT_VIEW_CARD_W,
+ height: height || DEFAULT_VIEW_CARD_H,
};
},
@@ -385,6 +414,44 @@ const dashboardLayoutSlice = createSlice({
delete state.browserCards[action.payload];
},
+ pasteBrowserCard(
+ state,
+ action: PayloadAction<{
+ tabs: BrowserTab[]; url: string; expandedSessionIds?: string[];
+ id?: string; x?: number; y?: number; width?: number; height?: number;
+ }>
+ ) {
+ const { x, y, width, height } = action.payload;
+ const id = action.payload.id || `browser-${Date.now().toString(36)}`;
+ const newTabs = action.payload.tabs.map((t) => ({
+ id: generateTabId(),
+ url: t.url,
+ title: '',
+ favicon: undefined,
+ }));
+ const activeTab = newTabs[0];
+ let posX: number, posY: number;
+ if (x != null && y != null) {
+ posX = x;
+ posY = y;
+ } else {
+ const rects = collectOccupiedRects(state, action.payload.expandedSessionIds);
+ const pos = findOpenGridCell(rects, DEFAULT_BROWSER_CARD_W, DEFAULT_BROWSER_CARD_H);
+ posX = pos.x;
+ posY = pos.y;
+ }
+ state.browserCards[id] = {
+ browser_id: id,
+ url: activeTab?.url || action.payload.url,
+ tabs: newTabs.length > 0 ? newTabs : [{ id: generateTabId(), url: action.payload.url, title: '' }],
+ activeTabId: activeTab?.id || generateTabId(),
+ x: posX,
+ y: posY,
+ width: width || DEFAULT_BROWSER_CARD_W,
+ height: height || DEFAULT_BROWSER_CARD_H,
+ };
+ },
+
updateBrowserCardUrl(
state,
action: PayloadAction<{ browserId: string; url: string }>
@@ -556,11 +623,27 @@ const dashboardLayoutSlice = createSlice({
state.glowingBrowserCards = {};
},
+ setGlowingAgentCard(state, action: PayloadAction<{ sessionId: string; sourceId: string; sourceYRatio?: number; label?: string }>) {
+ const { sessionId, sourceId, sourceYRatio, label } = action.payload;
+ state.glowingAgentCards[sessionId] = { sourceId, fading: false, sourceYRatio, label };
+ },
+
+ fadeGlowingAgentCard(state, action: PayloadAction) {
+ const entry = state.glowingAgentCards[action.payload];
+ if (entry) entry.fading = true;
+ },
+
+ clearGlowingAgentCard(state, action: PayloadAction) {
+ delete state.glowingAgentCards[action.payload];
+ },
+
resetLayout(state) {
state.cards = {};
state.viewCards = {};
state.browserCards = {};
+ state.closedCardPositions = {};
state.glowingBrowserCards = {};
+ state.glowingAgentCards = {};
state.persistedExpandedSessionIds = [];
state.initialized = false;
},
@@ -596,6 +679,7 @@ const dashboardLayoutSlice = createSlice({
export const {
setCardPosition,
+ placeCard,
setCardSize,
removeCard,
reconcileSessions,
@@ -610,6 +694,7 @@ export const {
setBrowserCardPosition,
setBrowserCardSize,
removeBrowserCard,
+ pasteBrowserCard,
updateBrowserCardUrl,
addBrowserTab,
removeBrowserTab,
@@ -622,6 +707,9 @@ export const {
setGlowingBrowserCards,
clearGlowingBrowserCards,
clearAllGlowingBrowserCards,
+ setGlowingAgentCard,
+ fadeGlowingAgentCard,
+ clearGlowingAgentCard,
resetLayout,
} = dashboardLayoutSlice.actions;
diff --git a/frontend/src/shared/state/modesSlice.ts b/frontend/src/shared/state/modesSlice.ts
index e002ff10..9a294d64 100644
--- a/frontend/src/shared/state/modesSlice.ts
+++ b/frontend/src/shared/state/modesSlice.ts
@@ -18,18 +18,19 @@ export interface Mode {
interface ModesState {
items: Record;
+ builtinDefaults: Record;
loading: boolean;
loaded: boolean;
}
-const initialState: ModesState = { items: {}, loading: false, loaded: false };
+const initialState: ModesState = { items: {}, builtinDefaults: {}, loading: false, loaded: false };
export const fetchModes = createAsyncThunk(
'modes/fetch',
async () => {
const res = await fetch(`${MODES_API}/list`);
const data = await res.json();
- return data.modes as Mode[];
+ return { modes: data.modes as Mode[], builtinDefaults: (data.builtin_defaults ?? {}) as Record };
},
{ condition: (_, { getState }) => !(getState() as { modes: ModesState }).modes.loading },
);
@@ -60,6 +61,15 @@ export const updateMode = createAsyncThunk(
}
);
+export const resetMode = createAsyncThunk(
+ 'modes/reset',
+ async (id: string) => {
+ const res = await fetch(`${MODES_API}/${id}/reset`, { method: 'POST' });
+ const data = await res.json();
+ return data.mode as Mode;
+ }
+);
+
export const deleteMode = createAsyncThunk('modes/delete', async (id: string) => {
await fetch(`${MODES_API}/${id}`, { method: 'DELETE' });
return id;
@@ -76,11 +86,13 @@ const modesSlice = createSlice({
state.loading = false;
state.loaded = true;
state.items = {};
- for (const m of action.payload) state.items[m.id] = m;
+ for (const m of action.payload.modes) state.items[m.id] = m;
+ state.builtinDefaults = action.payload.builtinDefaults;
})
.addCase(fetchModes.rejected, (state) => { state.loading = false; state.loaded = true; })
.addCase(createMode.fulfilled, (state, action) => { state.items[action.payload.id] = action.payload; })
.addCase(updateMode.fulfilled, (state, action) => { state.items[action.payload.id] = action.payload; })
+ .addCase(resetMode.fulfilled, (state, action) => { state.items[action.payload.id] = action.payload; })
.addCase(deleteMode.fulfilled, (state, action) => { delete state.items[action.payload]; });
},
});
diff --git a/frontend/src/shared/state/settingsSlice.ts b/frontend/src/shared/state/settingsSlice.ts
index 58961793..1f5921cf 100644
--- a/frontend/src/shared/state/settingsSlice.ts
+++ b/frontend/src/shared/state/settingsSlice.ts
@@ -22,6 +22,10 @@ export interface AppSettings {
new_agent_shortcut: string;
anthropic_api_key: string | null;
browser_homepage: string;
+ auto_select_mode_on_new_agent: boolean;
+ expand_new_chats_in_dashboard: boolean;
+ auto_reveal_sub_agents: boolean;
+ dev_mode: boolean;
}
export interface BrowseResult {
@@ -50,6 +54,10 @@ const initialState: SettingsState = {
new_agent_shortcut: 'Meta+l',
anthropic_api_key: null,
browser_homepage: 'https://www.google.com',
+ auto_select_mode_on_new_agent: false,
+ expand_new_chats_in_dashboard: false,
+ auto_reveal_sub_agents: true,
+ dev_mode: false,
},
loading: false,
loaded: false,
diff --git a/frontend/src/shared/state/tempStateSlice.ts b/frontend/src/shared/state/tempStateSlice.ts
index 2a9a8727..c8294ed0 100644
--- a/frontend/src/shared/state/tempStateSlice.ts
+++ b/frontend/src/shared/state/tempStateSlice.ts
@@ -3,10 +3,16 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit';
interface TempState {
temp_state: string | null;
+ pendingBrowserUrl: string | null;
+ pendingFocusAgentId: string | null;
+ lastDashboardId: string | null;
}
const initialState: TempState = {
temp_state: null,
+ pendingBrowserUrl: null,
+ pendingFocusAgentId: null,
+ lastDashboardId: null,
};
const tempStateSlice = createSlice({
@@ -19,12 +25,32 @@ const tempStateSlice = createSlice({
resetTempState(state) {
state.temp_state = null;
},
+ setPendingBrowserUrl(state, action: PayloadAction) {
+ state.pendingBrowserUrl = action.payload;
+ },
+ clearPendingBrowserUrl(state) {
+ state.pendingBrowserUrl = null;
+ },
+ setLastDashboardId(state, action: PayloadAction) {
+ state.lastDashboardId = action.payload;
+ },
+ setPendingFocusAgentId(state, action: PayloadAction) {
+ state.pendingFocusAgentId = action.payload;
+ },
+ clearPendingFocusAgentId(state) {
+ state.pendingFocusAgentId = null;
+ },
},
});
export const {
setTempState,
resetTempState,
+ setPendingBrowserUrl,
+ clearPendingBrowserUrl,
+ setLastDashboardId,
+ setPendingFocusAgentId,
+ clearPendingFocusAgentId,
} = tempStateSlice.actions;
export default tempStateSlice.reducer;
diff --git a/frontend/src/shared/state/toolsSlice.ts b/frontend/src/shared/state/toolsSlice.ts
index 6ef5fd61..eb159c5a 100644
--- a/frontend/src/shared/state/toolsSlice.ts
+++ b/frontend/src/shared/state/toolsSlice.ts
@@ -20,6 +20,7 @@ export interface ToolDefinition {
export interface BuiltinTool {
name: string;
+ display_name?: string;
description: string;
category: string;
deferred: boolean;
diff --git a/frontend/src/shared/useBrowserActivity.ts b/frontend/src/shared/useBrowserActivity.ts
index 14a19f78..c4bc9316 100644
--- a/frontend/src/shared/useBrowserActivity.ts
+++ b/frontend/src/shared/useBrowserActivity.ts
@@ -12,15 +12,19 @@ export interface BrowserActivityState {
detail: string | null;
/** The action that just completed — stays set briefly for exit animations */
lastAction: BrowserAction | null;
+ /** Increments on each new action — use as React key to restart CSS animations */
+ actionSeq: number;
+ /** Viewport-relative click coordinates (0-1 range) for positioning the click ripple */
+ coords: { xPercent: number; yPercent: number } | null;
}
-const EMPTY: BrowserActivityState = { active: false, action: null, detail: null, lastAction: null };
+const EMPTY: BrowserActivityState = { active: false, action: null, detail: null, lastAction: null, actionSeq: 0, coords: null };
export function useBrowserActivity(browserId: string): BrowserActivityState {
const [state, setState] = useState(() => {
const current = getActivity(browserId);
return current
- ? { active: true, action: current.action, detail: current.detail ?? null, lastAction: null }
+ ? { active: true, action: current.action, detail: current.detail ?? null, lastAction: null, actionSeq: 0, coords: current.coords ?? null }
: EMPTY;
});
@@ -31,21 +35,25 @@ export function useBrowserActivity(browserId: string): BrowserActivityState {
if (changedId !== browserId) return;
if (activity) {
if (lastActionTimer.current) clearTimeout(lastActionTimer.current);
- setState({
+ setState((prev) => ({
active: true,
action: activity.action,
detail: activity.detail ?? null,
lastAction: null,
- });
+ actionSeq: prev.actionSeq + 1,
+ coords: activity.coords ?? prev.coords,
+ }));
} else {
setState((prev) => ({
active: false,
action: null,
detail: null,
lastAction: prev.action,
+ actionSeq: prev.actionSeq,
+ coords: prev.coords,
}));
lastActionTimer.current = setTimeout(() => {
- setState((prev) => (prev.active ? prev : { ...prev, lastAction: null }));
+ setState((prev) => (prev.active ? prev : { ...prev, lastAction: null, coords: null }));
}, 600);
}
},
diff --git a/frontend/src/shared/ws/WebSocketManager.ts b/frontend/src/shared/ws/WebSocketManager.ts
index 71b5dce4..e9bd13d6 100644
--- a/frontend/src/shared/ws/WebSocketManager.ts
+++ b/frontend/src/shared/ws/WebSocketManager.ts
@@ -14,6 +14,7 @@ import {
addBranch,
setActiveBranch,
closeSessionFromWs,
+ trackAgentNotification,
} from '../state/agentsSlice';
import { addBrowserCardFromBackend } from '../state/dashboardLayoutSlice';
@@ -125,6 +126,9 @@ class WebSocketManager {
} else if (session_id) {
store.dispatch(updateSessionStatus({ sessionId: session_id, status: data.status }));
}
+ if (data.status === 'running' && session_id) {
+ store.dispatch(trackAgentNotification(session_id));
+ }
break;
case 'agent:message':
diff --git a/frontend/src/types/electron.d.ts b/frontend/src/types/electron.d.ts
index a9f3557b..ddc99fb7 100644
--- a/frontend/src/types/electron.d.ts
+++ b/frontend/src/types/electron.d.ts
@@ -10,6 +10,8 @@ declare global {
partition?: string;
allowpopups?: string;
nodeintegration?: string;
+ webpreferences?: string;
+ useragent?: string;
},
HTMLElement
>;
@@ -31,7 +33,9 @@ declare global {
interface OpenSwarmAPI {
getBackendPort: () => number;
+ getWebviewPreloadPath: () => string;
getAppVersion: () => Promise;
+ getUpdateStatus: () => Promise<{ status: string; info: any; error: string | null }>;
checkForUpdates: () => Promise<{ success: boolean; version?: string; error?: string }>;
downloadUpdate: () => Promise<{ success: boolean; error?: string }>;
installUpdate: () => Promise;
@@ -40,6 +44,7 @@ declare global {
onDownloadProgress: (cb: (progress: OpenSwarmDownloadProgress) => void) => () => void;
onUpdateDownloaded: (cb: (info: OpenSwarmUpdateInfo) => void) => () => void;
onUpdateError: (cb: (message: string) => void) => () => void;
+ onWebviewNewWindow: (cb: (url: string, webContentsId: number) => void) => () => void;
}
interface Window {
diff --git a/frontend/tsconfig.tsbuildinfo b/frontend/tsconfig.tsbuildinfo
index eaab7c19..3a977688 100644
--- a/frontend/tsconfig.tsbuildinfo
+++ b/frontend/tsconfig.tsbuildinfo
@@ -1 +1 @@
-{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/typescript/lib/lib.es2024.d.ts","./node_modules/typescript/lib/lib.esnext.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/typescript/lib/lib.es2023.intl.d.ts","./node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2024.collection.d.ts","./node_modules/typescript/lib/lib.es2024.object.d.ts","./node_modules/typescript/lib/lib.es2024.promise.d.ts","./node_modules/typescript/lib/lib.es2024.regexp.d.ts","./node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2024.string.d.ts","./node_modules/typescript/lib/lib.esnext.array.d.ts","./node_modules/typescript/lib/lib.esnext.collection.d.ts","./node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.promise.d.ts","./node_modules/typescript/lib/lib.esnext.decorators.d.ts","./node_modules/typescript/lib/lib.esnext.iterator.d.ts","./node_modules/typescript/lib/lib.esnext.float16.d.ts","./node_modules/typescript/lib/lib.esnext.error.d.ts","./node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./src/app/components/richeditorutils.ts","./node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/prop-types/index.d.ts","./node_modules/@types/react/index.d.ts","./src/app/components/elementselectioncontext.tsx","./src/app/components/usedomelementselector.ts","./src/app/pages/dashboard/usecanvascontrols.ts","./node_modules/redux/dist/redux.d.ts","./node_modules/immer/dist/immer.d.ts","./node_modules/reselect/dist/reselect.d.ts","./node_modules/redux-thunk/dist/redux-thunk.d.ts","./node_modules/@reduxjs/toolkit/dist/uncheckedindexed.ts","./node_modules/@reduxjs/toolkit/dist/index.d.mts","./src/shared/config.ts","./src/shared/state/agentsslice.ts","./src/shared/state/dashboardlayoutslice.ts","./src/app/pages/dashboard/usedashboardselection.ts","./node_modules/html-to-image/lib/types.d.ts","./node_modules/html-to-image/lib/index.d.ts","./src/app/pages/views/captureviewthumbnail.ts","./src/app/pages/views/useiframeelementselector.ts","./src/shared/browserregistry.ts","./src/shared/state/tempstateslice.ts","./src/shared/state/templatesslice.ts","./src/shared/state/skillsslice.ts","./src/shared/state/toolsslice.ts","./src/shared/state/modesslice.ts","./src/shared/state/settingsslice.ts","./src/shared/state/mcpregistryslice.ts","./src/shared/state/skillregistryslice.ts","./src/shared/state/outputsslice.ts","./src/shared/state/dashboardsslice.ts","./src/shared/state/updateslice.ts","./src/shared/state/store.ts","./src/shared/ws/websocketmanager.ts","./src/shared/resolveurl.ts","./src/shared/browsercommandhandler.ts","./node_modules/react-redux/dist/react-redux.d.ts","./src/shared/hooks.ts","./src/shared/sanitizesvg.ts","./src/shared/usebrowseractivity.ts","./node_modules/react-router/dist/development/router-clsu7khk.d.mts","./node_modules/react-router/dist/development/browser-dzsjabdq.d.mts","./node_modules/react-router/dist/development/dom-export.d.mts","./node_modules/react-router/dist/development/register-cryj3cjg.d.mts","./node_modules/react-router/dist/development/index-react-server-client-ezwjgpn_.d.mts","./node_modules/react-router/node_modules/cookie/dist/index.d.ts","./node_modules/react-router/dist/development/index.d.mts","./node_modules/react-router-dom/dist/index.d.mts","./src/shared/hooks/usekeyboardshortcuts.ts","./src/shared/styles/claudetokens.ts","./src/types/css-modules.d.ts","./src/types/electron.d.ts","./node_modules/@types/react-dom/client.d.ts","./node_modules/@mui/material/esm/colors/amber.d.ts","./node_modules/@mui/material/esm/colors/blue.d.ts","./node_modules/@mui/material/esm/colors/bluegrey.d.ts","./node_modules/@mui/material/esm/colors/brown.d.ts","./node_modules/@mui/material/esm/colors/common.d.ts","./node_modules/@mui/material/esm/colors/cyan.d.ts","./node_modules/@mui/material/esm/colors/deeporange.d.ts","./node_modules/@mui/material/esm/colors/deeppurple.d.ts","./node_modules/@mui/material/esm/colors/green.d.ts","./node_modules/@mui/material/esm/colors/grey.d.ts","./node_modules/@mui/material/esm/colors/indigo.d.ts","./node_modules/@mui/material/esm/colors/lightblue.d.ts","./node_modules/@mui/material/esm/colors/lightgreen.d.ts","./node_modules/@mui/material/esm/colors/lime.d.ts","./node_modules/@mui/material/esm/colors/orange.d.ts","./node_modules/@mui/material/esm/colors/pink.d.ts","./node_modules/@mui/material/esm/colors/purple.d.ts","./node_modules/@mui/material/esm/colors/red.d.ts","./node_modules/@mui/material/esm/colors/teal.d.ts","./node_modules/@mui/material/esm/colors/yellow.d.ts","./node_modules/@mui/material/esm/colors/index.d.ts","./node_modules/@mui/types/esm/index.d.ts","./node_modules/@mui/material/esm/styles/identifier.d.ts","./node_modules/@mui/material/esm/styles/createpalette.d.ts","./node_modules/@emotion/sheet/dist/declarations/src/index.d.ts","./node_modules/@emotion/sheet/dist/emotion-sheet.cjs.d.mts","./node_modules/@emotion/utils/dist/declarations/src/types.d.ts","./node_modules/@emotion/utils/dist/declarations/src/index.d.ts","./node_modules/@emotion/utils/dist/emotion-utils.cjs.d.mts","./node_modules/@emotion/cache/dist/declarations/src/types.d.ts","./node_modules/@emotion/cache/dist/declarations/src/index.d.ts","./node_modules/@emotion/cache/dist/emotion-cache.cjs.default.d.ts","./node_modules/@emotion/cache/dist/emotion-cache.cjs.d.mts","./node_modules/@emotion/serialize/dist/declarations/src/index.d.ts","./node_modules/@emotion/serialize/dist/emotion-serialize.cjs.d.mts","./node_modules/@emotion/react/dist/declarations/src/context.d.ts","./node_modules/@emotion/react/dist/declarations/src/types.d.ts","./node_modules/@emotion/react/dist/declarations/src/theming.d.ts","./node_modules/@emotion/react/dist/declarations/src/jsx-namespace.d.ts","./node_modules/@emotion/react/dist/declarations/src/jsx.d.ts","./node_modules/@emotion/react/dist/declarations/src/global.d.ts","./node_modules/@emotion/react/dist/declarations/src/keyframes.d.ts","./node_modules/@emotion/react/dist/declarations/src/class-names.d.ts","./node_modules/@emotion/react/dist/declarations/src/css.d.ts","./node_modules/@emotion/react/dist/declarations/src/index.d.ts","./node_modules/@emotion/react/dist/emotion-react.cjs.d.mts","./node_modules/@emotion/styled/dist/declarations/src/jsx-namespace.d.ts","./node_modules/@emotion/styled/dist/declarations/src/types.d.ts","./node_modules/@emotion/styled/dist/declarations/src/index.d.ts","./node_modules/@emotion/styled/dist/emotion-styled.cjs.default.d.ts","./node_modules/@emotion/styled/dist/emotion-styled.cjs.d.mts","./node_modules/@mui/styled-engine/esm/styledengineprovider/styledengineprovider.d.ts","./node_modules/@mui/styled-engine/esm/styledengineprovider/index.d.ts","./node_modules/@mui/styled-engine/esm/globalstyles/globalstyles.d.ts","./node_modules/@mui/styled-engine/esm/globalstyles/index.d.ts","./node_modules/@mui/styled-engine/esm/index.d.ts","./node_modules/@mui/system/esm/style/style.d.ts","./node_modules/@mui/system/esm/style/index.d.ts","./node_modules/@mui/system/esm/borders/borders.d.ts","./node_modules/@mui/system/esm/borders/index.d.ts","./node_modules/@mui/system/esm/createbreakpoints/createbreakpoints.d.ts","./node_modules/@mui/system/esm/createtheme/shape.d.ts","./node_modules/@mui/system/esm/createtheme/createspacing.d.ts","./node_modules/@mui/system/esm/stylefunctionsx/standardcssproperties.d.ts","./node_modules/@mui/system/esm/stylefunctionsx/aliasescssproperties.d.ts","./node_modules/@mui/system/esm/stylefunctionsx/overwritecssproperties.d.ts","./node_modules/@mui/system/esm/stylefunctionsx/stylefunctionsx.d.ts","./node_modules/@mui/system/esm/stylefunctionsx/extendsxprop.d.ts","./node_modules/@mui/system/esm/stylefunctionsx/defaultsxconfig.d.ts","./node_modules/@mui/system/esm/stylefunctionsx/index.d.ts","./node_modules/@mui/system/esm/createtheme/applystyles.d.ts","./node_modules/@mui/system/esm/csscontainerqueries/csscontainerqueries.d.ts","./node_modules/@mui/system/esm/csscontainerqueries/index.d.ts","./node_modules/@mui/system/esm/createtheme/createtheme.d.ts","./node_modules/@mui/system/esm/createtheme/index.d.ts","./node_modules/@mui/system/esm/breakpoints/breakpoints.d.ts","./node_modules/@mui/system/esm/breakpoints/index.d.ts","./node_modules/@mui/system/esm/compose/compose.d.ts","./node_modules/@mui/system/esm/compose/index.d.ts","./node_modules/@mui/system/esm/display/display.d.ts","./node_modules/@mui/system/esm/display/index.d.ts","./node_modules/@mui/system/esm/flexbox/flexbox.d.ts","./node_modules/@mui/system/esm/flexbox/index.d.ts","./node_modules/@mui/system/esm/cssgrid/cssgrid.d.ts","./node_modules/@mui/system/esm/cssgrid/index.d.ts","./node_modules/@mui/system/esm/palette/palette.d.ts","./node_modules/@mui/system/esm/palette/index.d.ts","./node_modules/@mui/system/esm/positions/positions.d.ts","./node_modules/@mui/system/esm/positions/index.d.ts","./node_modules/@mui/system/esm/shadows/shadows.d.ts","./node_modules/@mui/system/esm/shadows/index.d.ts","./node_modules/@mui/system/esm/sizing/sizing.d.ts","./node_modules/@mui/system/esm/sizing/index.d.ts","./node_modules/@mui/system/esm/typography/typography.d.ts","./node_modules/@mui/system/esm/typography/index.d.ts","./node_modules/@mui/system/esm/getthemevalue/getthemevalue.d.ts","./node_modules/@mui/system/esm/getthemevalue/index.d.ts","./node_modules/@mui/private-theming/esm/defaulttheme/index.d.ts","./node_modules/@mui/private-theming/esm/themeprovider/themeprovider.d.ts","./node_modules/@mui/private-theming/esm/themeprovider/index.d.ts","./node_modules/@mui/private-theming/esm/usetheme/usetheme.d.ts","./node_modules/@mui/private-theming/esm/usetheme/index.d.ts","./node_modules/@mui/private-theming/esm/index.d.ts","./node_modules/@types/react/jsx-runtime.d.ts","./node_modules/@mui/system/esm/globalstyles/globalstyles.d.ts","./node_modules/@mui/system/esm/globalstyles/index.d.ts","./node_modules/@mui/system/esm/spacing/spacing.d.ts","./node_modules/@mui/system/esm/spacing/index.d.ts","./node_modules/@mui/system/esm/box/box.d.ts","./node_modules/@mui/system/esm/box/boxclasses.d.ts","./node_modules/@mui/system/esm/box/index.d.ts","./node_modules/@mui/system/esm/createbox/createbox.d.ts","./node_modules/@mui/system/esm/createbox/index.d.ts","./node_modules/@mui/system/esm/createstyled/createstyled.d.ts","./node_modules/@mui/system/esm/createstyled/index.d.ts","./node_modules/@mui/system/esm/styled/styled.d.ts","./node_modules/@mui/system/esm/styled/index.d.ts","./node_modules/@mui/system/esm/usethemeprops/usethemeprops.d.ts","./node_modules/@mui/system/esm/usethemeprops/getthemeprops.d.ts","./node_modules/@mui/system/esm/usethemeprops/index.d.ts","./node_modules/@mui/system/esm/usetheme/usetheme.d.ts","./node_modules/@mui/system/esm/usetheme/index.d.ts","./node_modules/@mui/system/esm/usethemewithoutdefault/usethemewithoutdefault.d.ts","./node_modules/@mui/system/esm/usethemewithoutdefault/index.d.ts","./node_modules/@mui/system/esm/usemediaquery/usemediaquery.d.ts","./node_modules/@mui/system/esm/usemediaquery/index.d.ts","./node_modules/@mui/system/esm/colormanipulator/colormanipulator.d.ts","./node_modules/@mui/system/esm/colormanipulator/index.d.ts","./node_modules/@mui/system/esm/themeprovider/themeprovider.d.ts","./node_modules/@mui/system/esm/themeprovider/index.d.ts","./node_modules/@mui/system/esm/memotheme.d.ts","./node_modules/@mui/system/esm/initcolorschemescript/initcolorschemescript.d.ts","./node_modules/@mui/system/esm/initcolorschemescript/index.d.ts","./node_modules/@mui/system/esm/cssvars/localstoragemanager.d.ts","./node_modules/@mui/system/esm/cssvars/usecurrentcolorscheme.d.ts","./node_modules/@mui/system/esm/cssvars/createcssvarsprovider.d.ts","./node_modules/@mui/system/esm/cssvars/preparecssvars.d.ts","./node_modules/@mui/system/esm/cssvars/preparetypographyvars.d.ts","./node_modules/@mui/system/esm/cssvars/createcssvarstheme.d.ts","./node_modules/@mui/system/esm/cssvars/getcolorschemeselector.d.ts","./node_modules/@mui/system/esm/cssvars/index.d.ts","./node_modules/@mui/system/esm/cssvars/creategetcssvar.d.ts","./node_modules/@mui/system/esm/cssvars/cssvarsparser.d.ts","./node_modules/@mui/system/esm/responsiveproptype/responsiveproptype.d.ts","./node_modules/@mui/system/esm/responsiveproptype/index.d.ts","./node_modules/@mui/system/esm/container/containerclasses.d.ts","./node_modules/@mui/system/esm/container/containerprops.d.ts","./node_modules/@mui/system/esm/container/createcontainer.d.ts","./node_modules/@mui/system/esm/container/container.d.ts","./node_modules/@mui/system/esm/container/index.d.ts","./node_modules/@mui/system/esm/grid/gridprops.d.ts","./node_modules/@mui/system/esm/grid/grid.d.ts","./node_modules/@mui/system/esm/grid/creategrid.d.ts","./node_modules/@mui/system/esm/grid/gridclasses.d.ts","./node_modules/@mui/system/esm/grid/traversebreakpoints.d.ts","./node_modules/@mui/system/esm/grid/gridgenerator.d.ts","./node_modules/@mui/system/esm/grid/index.d.ts","./node_modules/@mui/system/esm/stack/stackprops.d.ts","./node_modules/@mui/system/esm/stack/stack.d.ts","./node_modules/@mui/system/esm/stack/createstack.d.ts","./node_modules/@mui/system/esm/stack/stackclasses.d.ts","./node_modules/@mui/system/esm/stack/index.d.ts","./node_modules/@mui/system/esm/version/index.d.ts","./node_modules/@mui/system/esm/index.d.ts","./node_modules/@mui/material/esm/styles/shadows.d.ts","./node_modules/@mui/material/esm/styles/createtransitions.d.ts","./node_modules/@mui/material/esm/styles/createmixins.d.ts","./node_modules/@mui/material/esm/styles/createtypography.d.ts","./node_modules/@mui/material/esm/styles/zindex.d.ts","./node_modules/@mui/material/esm/styles/createthemefoundation.d.ts","./node_modules/@mui/material/esm/overridablecomponent/index.d.ts","./node_modules/@mui/material/esm/svgicon/svgiconclasses.d.ts","./node_modules/@mui/material/esm/svgicon/svgicon.d.ts","./node_modules/@mui/material/esm/svgicon/index.d.ts","./node_modules/@mui/material/esm/internal/index.d.ts","./node_modules/@mui/material/esm/buttonbase/touchrippleclasses.d.ts","./node_modules/@mui/material/esm/buttonbase/touchripple.d.ts","./node_modules/@mui/material/esm/buttonbase/buttonbaseclasses.d.ts","./node_modules/@mui/material/esm/buttonbase/buttonbase.d.ts","./node_modules/@mui/material/esm/buttonbase/index.d.ts","./node_modules/@mui/material/esm/iconbutton/iconbuttonclasses.d.ts","./node_modules/@mui/material/esm/iconbutton/iconbutton.d.ts","./node_modules/@mui/material/esm/iconbutton/index.d.ts","./node_modules/@mui/material/esm/paper/paperclasses.d.ts","./node_modules/@mui/material/esm/paper/paper.d.ts","./node_modules/@mui/material/esm/paper/index.d.ts","./node_modules/@mui/material/esm/alert/alertclasses.d.ts","./node_modules/@mui/utils/esm/types/index.d.ts","./node_modules/@mui/material/esm/utils/types.d.ts","./node_modules/@mui/material/esm/alert/alert.d.ts","./node_modules/@mui/material/esm/alert/index.d.ts","./node_modules/@mui/material/esm/typography/typographyclasses.d.ts","./node_modules/@mui/material/esm/typography/typography.d.ts","./node_modules/@mui/material/esm/typography/index.d.ts","./node_modules/@mui/material/esm/alerttitle/alerttitleclasses.d.ts","./node_modules/@mui/material/esm/alerttitle/alerttitle.d.ts","./node_modules/@mui/material/esm/alerttitle/index.d.ts","./node_modules/@mui/material/esm/appbar/appbarclasses.d.ts","./node_modules/@mui/material/esm/appbar/appbar.d.ts","./node_modules/@mui/material/esm/appbar/index.d.ts","./node_modules/@mui/material/esm/chip/chipclasses.d.ts","./node_modules/@mui/material/esm/chip/chip.d.ts","./node_modules/@mui/material/esm/chip/index.d.ts","./node_modules/@popperjs/core/lib/enums.d.ts","./node_modules/@popperjs/core/lib/modifiers/popperoffsets.d.ts","./node_modules/@popperjs/core/lib/modifiers/flip.d.ts","./node_modules/@popperjs/core/lib/modifiers/hide.d.ts","./node_modules/@popperjs/core/lib/modifiers/offset.d.ts","./node_modules/@popperjs/core/lib/modifiers/eventlisteners.d.ts","./node_modules/@popperjs/core/lib/modifiers/computestyles.d.ts","./node_modules/@popperjs/core/lib/modifiers/arrow.d.ts","./node_modules/@popperjs/core/lib/modifiers/preventoverflow.d.ts","./node_modules/@popperjs/core/lib/modifiers/applystyles.d.ts","./node_modules/@popperjs/core/lib/types.d.ts","./node_modules/@popperjs/core/lib/modifiers/index.d.ts","./node_modules/@popperjs/core/lib/utils/detectoverflow.d.ts","./node_modules/@popperjs/core/lib/createpopper.d.ts","./node_modules/@popperjs/core/lib/popper-lite.d.ts","./node_modules/@popperjs/core/lib/popper.d.ts","./node_modules/@popperjs/core/lib/index.d.ts","./node_modules/@popperjs/core/index.d.ts","./node_modules/@mui/material/esm/portal/portal.types.d.ts","./node_modules/@mui/material/esm/portal/portal.d.ts","./node_modules/@mui/material/esm/portal/index.d.ts","./node_modules/@mui/material/esm/utils/polymorphiccomponent.d.ts","./node_modules/@mui/material/esm/popper/basepopper.types.d.ts","./node_modules/@mui/material/esm/popper/popper.d.ts","./node_modules/@mui/material/esm/popper/popperclasses.d.ts","./node_modules/@mui/material/esm/popper/index.d.ts","./node_modules/@mui/material/esm/useautocomplete/useautocomplete.d.ts","./node_modules/@mui/material/esm/useautocomplete/index.d.ts","./node_modules/@mui/material/esm/autocomplete/autocompleteclasses.d.ts","./node_modules/@mui/material/esm/autocomplete/autocomplete.d.ts","./node_modules/@mui/material/esm/autocomplete/index.d.ts","./node_modules/@mui/material/esm/avatar/avatarclasses.d.ts","./node_modules/@mui/material/esm/avatar/avatar.d.ts","./node_modules/@mui/material/esm/avatar/index.d.ts","./node_modules/@mui/material/esm/avatargroup/avatargroupclasses.d.ts","./node_modules/@mui/material/esm/avatargroup/avatargroup.d.ts","./node_modules/@mui/material/esm/avatargroup/index.d.ts","./node_modules/@types/react-transition-group/transition.d.ts","./node_modules/@mui/material/esm/transitions/transition.d.ts","./node_modules/@mui/material/esm/fade/fade.d.ts","./node_modules/@mui/material/esm/fade/index.d.ts","./node_modules/@mui/material/esm/backdrop/backdropclasses.d.ts","./node_modules/@mui/material/esm/backdrop/backdrop.d.ts","./node_modules/@mui/material/esm/backdrop/index.d.ts","./node_modules/@mui/material/esm/badge/badgeclasses.d.ts","./node_modules/@mui/material/esm/badge/badge.d.ts","./node_modules/@mui/material/esm/badge/index.d.ts","./node_modules/@mui/material/esm/bottomnavigationaction/bottomnavigationactionclasses.d.ts","./node_modules/@mui/material/esm/bottomnavigationaction/bottomnavigationaction.d.ts","./node_modules/@mui/material/esm/bottomnavigationaction/index.d.ts","./node_modules/@mui/material/esm/bottomnavigation/bottomnavigationclasses.d.ts","./node_modules/@mui/material/esm/bottomnavigation/bottomnavigation.d.ts","./node_modules/@mui/material/esm/bottomnavigation/index.d.ts","./node_modules/@mui/material/esm/breadcrumbs/breadcrumbsclasses.d.ts","./node_modules/@mui/material/esm/breadcrumbs/breadcrumbs.d.ts","./node_modules/@mui/material/esm/breadcrumbs/index.d.ts","./node_modules/@mui/material/esm/buttongroup/buttongroupclasses.d.ts","./node_modules/@mui/material/esm/buttongroup/buttongroup.d.ts","./node_modules/@mui/material/esm/buttongroup/buttongroupcontext.d.ts","./node_modules/@mui/material/esm/buttongroup/buttongroupbuttoncontext.d.ts","./node_modules/@mui/material/esm/buttongroup/index.d.ts","./node_modules/@mui/material/esm/button/buttonclasses.d.ts","./node_modules/@mui/material/esm/button/button.d.ts","./node_modules/@mui/material/esm/button/index.d.ts","./node_modules/@mui/material/esm/cardactionarea/cardactionareaclasses.d.ts","./node_modules/@mui/material/esm/cardactionarea/cardactionarea.d.ts","./node_modules/@mui/material/esm/cardactionarea/index.d.ts","./node_modules/@mui/material/esm/cardactions/cardactionsclasses.d.ts","./node_modules/@mui/material/esm/cardactions/cardactions.d.ts","./node_modules/@mui/material/esm/cardactions/index.d.ts","./node_modules/@mui/material/esm/cardcontent/cardcontentclasses.d.ts","./node_modules/@mui/material/esm/cardcontent/cardcontent.d.ts","./node_modules/@mui/material/esm/cardcontent/index.d.ts","./node_modules/@mui/material/esm/cardheader/cardheaderclasses.d.ts","./node_modules/@mui/material/esm/cardheader/cardheader.d.ts","./node_modules/@mui/material/esm/cardheader/index.d.ts","./node_modules/@mui/material/esm/cardmedia/cardmediaclasses.d.ts","./node_modules/@mui/material/esm/cardmedia/cardmedia.d.ts","./node_modules/@mui/material/esm/cardmedia/index.d.ts","./node_modules/@mui/material/esm/card/cardclasses.d.ts","./node_modules/@mui/material/esm/card/card.d.ts","./node_modules/@mui/material/esm/card/index.d.ts","./node_modules/@mui/material/esm/internal/switchbaseclasses.d.ts","./node_modules/@mui/material/esm/internal/switchbase.d.ts","./node_modules/@mui/material/esm/checkbox/checkboxclasses.d.ts","./node_modules/@mui/material/esm/checkbox/checkbox.d.ts","./node_modules/@mui/material/esm/checkbox/index.d.ts","./node_modules/@mui/material/esm/circularprogress/circularprogressclasses.d.ts","./node_modules/@mui/material/esm/circularprogress/circularprogress.d.ts","./node_modules/@mui/material/esm/circularprogress/index.d.ts","./node_modules/@types/react-transition-group/config.d.ts","./node_modules/@types/react-transition-group/csstransition.d.ts","./node_modules/@types/react-transition-group/switchtransition.d.ts","./node_modules/@types/react-transition-group/transitiongroup.d.ts","./node_modules/@types/react-transition-group/index.d.ts","./node_modules/@mui/material/esm/collapse/collapseclasses.d.ts","./node_modules/@mui/material/esm/collapse/collapse.d.ts","./node_modules/@mui/material/esm/collapse/index.d.ts","./node_modules/@mui/material/esm/container/containerclasses.d.ts","./node_modules/@mui/material/esm/container/container.d.ts","./node_modules/@mui/material/esm/container/index.d.ts","./node_modules/@mui/material/esm/cssbaseline/cssbaseline.d.ts","./node_modules/@mui/material/esm/cssbaseline/index.d.ts","./node_modules/@mui/material/esm/dialogactions/dialogactionsclasses.d.ts","./node_modules/@mui/material/esm/dialogactions/dialogactions.d.ts","./node_modules/@mui/material/esm/dialogactions/index.d.ts","./node_modules/@mui/material/esm/dialogcontent/dialogcontentclasses.d.ts","./node_modules/@mui/material/esm/dialogcontent/dialogcontent.d.ts","./node_modules/@mui/material/esm/dialogcontent/index.d.ts","./node_modules/@mui/material/esm/dialogcontenttext/dialogcontenttextclasses.d.ts","./node_modules/@mui/material/esm/dialogcontenttext/dialogcontenttext.d.ts","./node_modules/@mui/material/esm/dialogcontenttext/index.d.ts","./node_modules/@mui/material/esm/modal/modalmanager.d.ts","./node_modules/@mui/material/esm/modal/modalclasses.d.ts","./node_modules/@mui/material/esm/modal/modal.d.ts","./node_modules/@mui/material/esm/modal/index.d.ts","./node_modules/@mui/material/esm/dialog/dialogclasses.d.ts","./node_modules/@mui/material/esm/dialog/dialog.d.ts","./node_modules/@mui/material/esm/dialog/index.d.ts","./node_modules/@mui/material/esm/dialogtitle/dialogtitleclasses.d.ts","./node_modules/@mui/material/esm/dialogtitle/dialogtitle.d.ts","./node_modules/@mui/material/esm/dialogtitle/index.d.ts","./node_modules/@mui/material/esm/divider/dividerclasses.d.ts","./node_modules/@mui/material/esm/divider/divider.d.ts","./node_modules/@mui/material/esm/divider/index.d.ts","./node_modules/@mui/material/esm/slide/slide.d.ts","./node_modules/@mui/material/esm/slide/index.d.ts","./node_modules/@mui/material/esm/drawer/drawerclasses.d.ts","./node_modules/@mui/material/esm/drawer/drawer.d.ts","./node_modules/@mui/material/esm/drawer/index.d.ts","./node_modules/@mui/material/esm/accordionactions/accordionactionsclasses.d.ts","./node_modules/@mui/material/esm/accordionactions/accordionactions.d.ts","./node_modules/@mui/material/esm/accordionactions/index.d.ts","./node_modules/@mui/material/esm/accordiondetails/accordiondetailsclasses.d.ts","./node_modules/@mui/material/esm/accordiondetails/accordiondetails.d.ts","./node_modules/@mui/material/esm/accordiondetails/index.d.ts","./node_modules/@mui/material/esm/accordion/accordionclasses.d.ts","./node_modules/@mui/material/esm/accordion/accordion.d.ts","./node_modules/@mui/material/esm/accordion/index.d.ts","./node_modules/@mui/material/esm/accordionsummary/accordionsummaryclasses.d.ts","./node_modules/@mui/material/esm/accordionsummary/accordionsummary.d.ts","./node_modules/@mui/material/esm/accordionsummary/index.d.ts","./node_modules/@mui/material/esm/fab/fabclasses.d.ts","./node_modules/@mui/material/esm/fab/fab.d.ts","./node_modules/@mui/material/esm/fab/index.d.ts","./node_modules/@mui/material/esm/inputbase/inputbaseclasses.d.ts","./node_modules/@mui/material/esm/inputbase/inputbase.d.ts","./node_modules/@mui/material/esm/inputbase/index.d.ts","./node_modules/@mui/material/esm/filledinput/filledinputclasses.d.ts","./node_modules/@mui/material/esm/filledinput/filledinput.d.ts","./node_modules/@mui/material/esm/filledinput/index.d.ts","./node_modules/@mui/material/esm/formcontrollabel/formcontrollabelclasses.d.ts","./node_modules/@mui/material/esm/formcontrollabel/formcontrollabel.d.ts","./node_modules/@mui/material/esm/formcontrollabel/index.d.ts","./node_modules/@mui/material/esm/formcontrol/formcontrolclasses.d.ts","./node_modules/@mui/material/esm/formcontrol/formcontrol.d.ts","./node_modules/@mui/material/esm/formcontrol/formcontrolcontext.d.ts","./node_modules/@mui/material/esm/formcontrol/useformcontrol.d.ts","./node_modules/@mui/material/esm/formcontrol/index.d.ts","./node_modules/@mui/material/esm/formgroup/formgroupclasses.d.ts","./node_modules/@mui/material/esm/formgroup/formgroup.d.ts","./node_modules/@mui/material/esm/formgroup/index.d.ts","./node_modules/@mui/material/esm/formhelpertext/formhelpertextclasses.d.ts","./node_modules/@mui/material/esm/formhelpertext/formhelpertext.d.ts","./node_modules/@mui/material/esm/formhelpertext/index.d.ts","./node_modules/@mui/material/esm/formlabel/formlabelclasses.d.ts","./node_modules/@mui/material/esm/formlabel/formlabel.d.ts","./node_modules/@mui/material/esm/formlabel/index.d.ts","./node_modules/@mui/material/esm/gridlegacy/gridlegacyclasses.d.ts","./node_modules/@mui/material/esm/gridlegacy/gridlegacy.d.ts","./node_modules/@mui/material/esm/gridlegacy/index.d.ts","./node_modules/@mui/material/esm/grid/grid.d.ts","./node_modules/@mui/material/esm/grid/gridclasses.d.ts","./node_modules/@mui/material/esm/grid/index.d.ts","./node_modules/@mui/material/esm/icon/iconclasses.d.ts","./node_modules/@mui/material/esm/icon/icon.d.ts","./node_modules/@mui/material/esm/icon/index.d.ts","./node_modules/@mui/material/esm/imagelist/imagelistclasses.d.ts","./node_modules/@mui/material/esm/imagelist/imagelist.d.ts","./node_modules/@mui/material/esm/imagelist/index.d.ts","./node_modules/@mui/material/esm/imagelistitembar/imagelistitembarclasses.d.ts","./node_modules/@mui/material/esm/imagelistitembar/imagelistitembar.d.ts","./node_modules/@mui/material/esm/imagelistitembar/index.d.ts","./node_modules/@mui/material/esm/imagelistitem/imagelistitemclasses.d.ts","./node_modules/@mui/material/esm/imagelistitem/imagelistitem.d.ts","./node_modules/@mui/material/esm/imagelistitem/index.d.ts","./node_modules/@mui/material/esm/inputadornment/inputadornmentclasses.d.ts","./node_modules/@mui/material/esm/inputadornment/inputadornment.d.ts","./node_modules/@mui/material/esm/inputadornment/index.d.ts","./node_modules/@mui/material/esm/inputlabel/inputlabelclasses.d.ts","./node_modules/@mui/material/esm/inputlabel/inputlabel.d.ts","./node_modules/@mui/material/esm/inputlabel/index.d.ts","./node_modules/@mui/material/esm/input/inputclasses.d.ts","./node_modules/@mui/material/esm/input/input.d.ts","./node_modules/@mui/material/esm/input/index.d.ts","./node_modules/@mui/material/esm/linearprogress/linearprogressclasses.d.ts","./node_modules/@mui/material/esm/linearprogress/linearprogress.d.ts","./node_modules/@mui/material/esm/linearprogress/index.d.ts","./node_modules/@mui/material/esm/link/linkclasses.d.ts","./node_modules/@mui/material/esm/link/link.d.ts","./node_modules/@mui/material/esm/link/index.d.ts","./node_modules/@mui/material/esm/listitemavatar/listitemavatarclasses.d.ts","./node_modules/@mui/material/esm/listitemavatar/listitemavatar.d.ts","./node_modules/@mui/material/esm/listitemavatar/index.d.ts","./node_modules/@mui/material/esm/listitemicon/listitemiconclasses.d.ts","./node_modules/@mui/material/esm/listitemicon/listitemicon.d.ts","./node_modules/@mui/material/esm/listitemicon/index.d.ts","./node_modules/@mui/material/esm/listitem/listitemclasses.d.ts","./node_modules/@mui/material/esm/listitem/listitem.d.ts","./node_modules/@mui/material/esm/listitem/index.d.ts","./node_modules/@mui/material/esm/listitembutton/listitembuttonclasses.d.ts","./node_modules/@mui/material/esm/listitembutton/listitembutton.d.ts","./node_modules/@mui/material/esm/listitembutton/index.d.ts","./node_modules/@mui/material/esm/listitemsecondaryaction/listitemsecondaryactionclasses.d.ts","./node_modules/@mui/material/esm/listitemsecondaryaction/listitemsecondaryaction.d.ts","./node_modules/@mui/material/esm/listitemsecondaryaction/index.d.ts","./node_modules/@mui/material/esm/listitemtext/listitemtextclasses.d.ts","./node_modules/@mui/material/esm/listitemtext/listitemtext.d.ts","./node_modules/@mui/material/esm/listitemtext/index.d.ts","./node_modules/@mui/material/esm/list/listclasses.d.ts","./node_modules/@mui/material/esm/list/list.d.ts","./node_modules/@mui/material/esm/list/index.d.ts","./node_modules/@mui/material/esm/listsubheader/listsubheaderclasses.d.ts","./node_modules/@mui/material/esm/listsubheader/listsubheader.d.ts","./node_modules/@mui/material/esm/listsubheader/index.d.ts","./node_modules/@mui/material/esm/menuitem/menuitemclasses.d.ts","./node_modules/@mui/material/esm/menuitem/menuitem.d.ts","./node_modules/@mui/material/esm/menuitem/index.d.ts","./node_modules/@mui/material/esm/menulist/menulist.d.ts","./node_modules/@mui/material/esm/menulist/index.d.ts","./node_modules/@mui/material/esm/popover/popoverclasses.d.ts","./node_modules/@mui/material/esm/popover/popover.d.ts","./node_modules/@mui/material/esm/popover/index.d.ts","./node_modules/@mui/material/esm/menu/menuclasses.d.ts","./node_modules/@mui/material/esm/menu/menu.d.ts","./node_modules/@mui/material/esm/menu/index.d.ts","./node_modules/@mui/material/esm/mobilestepper/mobilestepperclasses.d.ts","./node_modules/@mui/material/esm/mobilestepper/mobilestepper.d.ts","./node_modules/@mui/material/esm/mobilestepper/index.d.ts","./node_modules/@mui/material/esm/nativeselect/nativeselectinput.d.ts","./node_modules/@mui/material/esm/nativeselect/nativeselectclasses.d.ts","./node_modules/@mui/material/esm/nativeselect/nativeselect.d.ts","./node_modules/@mui/material/esm/nativeselect/index.d.ts","./node_modules/@mui/material/esm/usemediaquery/index.d.ts","./node_modules/@mui/material/esm/outlinedinput/outlinedinputclasses.d.ts","./node_modules/@mui/material/esm/outlinedinput/outlinedinput.d.ts","./node_modules/@mui/material/esm/outlinedinput/index.d.ts","./node_modules/@mui/material/esm/usepagination/usepagination.d.ts","./node_modules/@mui/material/esm/pagination/paginationclasses.d.ts","./node_modules/@mui/material/esm/pagination/pagination.d.ts","./node_modules/@mui/material/esm/pagination/index.d.ts","./node_modules/@mui/material/esm/paginationitem/paginationitemclasses.d.ts","./node_modules/@mui/material/esm/paginationitem/paginationitem.d.ts","./node_modules/@mui/material/esm/paginationitem/index.d.ts","./node_modules/@mui/material/esm/radiogroup/radiogroup.d.ts","./node_modules/@mui/material/esm/radiogroup/radiogroupcontext.d.ts","./node_modules/@mui/material/esm/radiogroup/useradiogroup.d.ts","./node_modules/@mui/material/esm/radiogroup/radiogroupclasses.d.ts","./node_modules/@mui/material/esm/radiogroup/index.d.ts","./node_modules/@mui/material/esm/radio/radioclasses.d.ts","./node_modules/@mui/material/esm/radio/radio.d.ts","./node_modules/@mui/material/esm/radio/index.d.ts","./node_modules/@mui/material/esm/rating/ratingclasses.d.ts","./node_modules/@mui/material/esm/rating/rating.d.ts","./node_modules/@mui/material/esm/rating/index.d.ts","./node_modules/@mui/material/esm/scopedcssbaseline/scopedcssbaselineclasses.d.ts","./node_modules/@mui/material/esm/scopedcssbaseline/scopedcssbaseline.d.ts","./node_modules/@mui/material/esm/scopedcssbaseline/index.d.ts","./node_modules/@mui/material/esm/select/selectinput.d.ts","./node_modules/@mui/material/esm/select/selectclasses.d.ts","./node_modules/@mui/material/esm/select/select.d.ts","./node_modules/@mui/material/esm/select/index.d.ts","./node_modules/@mui/material/esm/skeleton/skeletonclasses.d.ts","./node_modules/@mui/material/esm/skeleton/skeleton.d.ts","./node_modules/@mui/material/esm/skeleton/index.d.ts","./node_modules/@mui/material/esm/slider/useslider.types.d.ts","./node_modules/@mui/material/esm/slider/slidervaluelabel.types.d.ts","./node_modules/@mui/material/esm/slider/slidervaluelabel.d.ts","./node_modules/@mui/material/esm/slider/sliderclasses.d.ts","./node_modules/@mui/material/esm/slider/slider.d.ts","./node_modules/@mui/material/esm/slider/index.d.ts","./node_modules/@mui/material/esm/snackbarcontent/snackbarcontentclasses.d.ts","./node_modules/@mui/material/esm/snackbarcontent/snackbarcontent.d.ts","./node_modules/@mui/material/esm/snackbarcontent/index.d.ts","./node_modules/@mui/material/esm/clickawaylistener/clickawaylistener.d.ts","./node_modules/@mui/material/esm/clickawaylistener/index.d.ts","./node_modules/@mui/material/esm/snackbar/snackbarclasses.d.ts","./node_modules/@mui/material/esm/snackbar/snackbar.d.ts","./node_modules/@mui/material/esm/snackbar/index.d.ts","./node_modules/@mui/material/esm/transitions/index.d.ts","./node_modules/@mui/material/esm/speeddial/speeddialclasses.d.ts","./node_modules/@mui/material/esm/speeddial/speeddial.d.ts","./node_modules/@mui/material/esm/speeddial/index.d.ts","./node_modules/@mui/material/esm/tooltip/tooltipclasses.d.ts","./node_modules/@mui/material/esm/tooltip/tooltip.d.ts","./node_modules/@mui/material/esm/tooltip/index.d.ts","./node_modules/@mui/material/esm/speeddialaction/speeddialactionclasses.d.ts","./node_modules/@mui/material/esm/speeddialaction/speeddialaction.d.ts","./node_modules/@mui/material/esm/speeddialaction/index.d.ts","./node_modules/@mui/material/esm/speeddialicon/speeddialiconclasses.d.ts","./node_modules/@mui/material/esm/speeddialicon/speeddialicon.d.ts","./node_modules/@mui/material/esm/speeddialicon/index.d.ts","./node_modules/@mui/material/esm/stack/stack.d.ts","./node_modules/@mui/material/esm/stack/stackclasses.d.ts","./node_modules/@mui/material/esm/stack/index.d.ts","./node_modules/@mui/material/esm/stepbutton/stepbuttonclasses.d.ts","./node_modules/@mui/material/esm/stepbutton/stepbutton.d.ts","./node_modules/@mui/material/esm/stepbutton/index.d.ts","./node_modules/@mui/material/esm/stepconnector/stepconnectorclasses.d.ts","./node_modules/@mui/material/esm/stepconnector/stepconnector.d.ts","./node_modules/@mui/material/esm/stepconnector/index.d.ts","./node_modules/@mui/material/esm/stepcontent/stepcontentclasses.d.ts","./node_modules/@mui/material/esm/stepcontent/stepcontent.d.ts","./node_modules/@mui/material/esm/stepcontent/index.d.ts","./node_modules/@mui/material/esm/stepicon/stepiconclasses.d.ts","./node_modules/@mui/material/esm/stepicon/stepicon.d.ts","./node_modules/@mui/material/esm/stepicon/index.d.ts","./node_modules/@mui/material/esm/steplabel/steplabelclasses.d.ts","./node_modules/@mui/material/esm/steplabel/steplabel.d.ts","./node_modules/@mui/material/esm/steplabel/index.d.ts","./node_modules/@mui/material/esm/stepper/stepperclasses.d.ts","./node_modules/@mui/material/esm/stepper/stepper.d.ts","./node_modules/@mui/material/esm/stepper/steppercontext.d.ts","./node_modules/@mui/material/esm/stepper/index.d.ts","./node_modules/@mui/material/esm/step/stepclasses.d.ts","./node_modules/@mui/material/esm/step/step.d.ts","./node_modules/@mui/material/esm/step/stepcontext.d.ts","./node_modules/@mui/material/esm/step/index.d.ts","./node_modules/@mui/material/esm/swipeabledrawer/swipeabledrawer.d.ts","./node_modules/@mui/material/esm/swipeabledrawer/index.d.ts","./node_modules/@mui/material/esm/switch/switchclasses.d.ts","./node_modules/@mui/material/esm/switch/switch.d.ts","./node_modules/@mui/material/esm/switch/index.d.ts","./node_modules/@mui/material/esm/tablebody/tablebodyclasses.d.ts","./node_modules/@mui/material/esm/tablebody/tablebody.d.ts","./node_modules/@mui/material/esm/tablebody/index.d.ts","./node_modules/@mui/material/esm/tablecell/tablecellclasses.d.ts","./node_modules/@mui/material/esm/tablecell/tablecell.d.ts","./node_modules/@mui/material/esm/tablecell/index.d.ts","./node_modules/@mui/material/esm/tablecontainer/tablecontainerclasses.d.ts","./node_modules/@mui/material/esm/tablecontainer/tablecontainer.d.ts","./node_modules/@mui/material/esm/tablecontainer/index.d.ts","./node_modules/@mui/material/esm/tablehead/tableheadclasses.d.ts","./node_modules/@mui/material/esm/tablehead/tablehead.d.ts","./node_modules/@mui/material/esm/tablehead/index.d.ts","./node_modules/@mui/material/esm/tablepaginationactions/tablepaginationactions.d.ts","./node_modules/@mui/material/esm/tablepaginationactions/tablepaginationactionsclasses.d.ts","./node_modules/@mui/material/esm/tablepaginationactions/index.d.ts","./node_modules/@mui/material/esm/tablepagination/tablepaginationclasses.d.ts","./node_modules/@mui/material/esm/toolbar/toolbarclasses.d.ts","./node_modules/@mui/material/esm/toolbar/toolbar.d.ts","./node_modules/@mui/material/esm/toolbar/index.d.ts","./node_modules/@mui/material/esm/tablepagination/tablepagination.d.ts","./node_modules/@mui/material/esm/tablepagination/index.d.ts","./node_modules/@mui/material/esm/table/tableclasses.d.ts","./node_modules/@mui/material/esm/table/table.d.ts","./node_modules/@mui/material/esm/table/index.d.ts","./node_modules/@mui/material/esm/tablerow/tablerowclasses.d.ts","./node_modules/@mui/material/esm/tablerow/tablerow.d.ts","./node_modules/@mui/material/esm/tablerow/index.d.ts","./node_modules/@mui/material/esm/tablesortlabel/tablesortlabelclasses.d.ts","./node_modules/@mui/material/esm/tablesortlabel/tablesortlabel.d.ts","./node_modules/@mui/material/esm/tablesortlabel/index.d.ts","./node_modules/@mui/material/esm/tablefooter/tablefooterclasses.d.ts","./node_modules/@mui/material/esm/tablefooter/tablefooter.d.ts","./node_modules/@mui/material/esm/tablefooter/index.d.ts","./node_modules/@mui/material/esm/tab/tabclasses.d.ts","./node_modules/@mui/material/esm/tab/tab.d.ts","./node_modules/@mui/material/esm/tab/index.d.ts","./node_modules/@mui/material/esm/tabscrollbutton/tabscrollbuttonclasses.d.ts","./node_modules/@mui/material/esm/tabscrollbutton/tabscrollbutton.d.ts","./node_modules/@mui/material/esm/tabscrollbutton/index.d.ts","./node_modules/@mui/material/esm/tabs/tabsclasses.d.ts","./node_modules/@mui/material/esm/tabs/tabs.d.ts","./node_modules/@mui/material/esm/tabs/index.d.ts","./node_modules/@mui/material/esm/textfield/textfieldclasses.d.ts","./node_modules/@mui/material/esm/textfield/textfield.d.ts","./node_modules/@mui/material/esm/textfield/index.d.ts","./node_modules/@mui/material/esm/togglebutton/togglebuttonclasses.d.ts","./node_modules/@mui/material/esm/togglebutton/togglebutton.d.ts","./node_modules/@mui/material/esm/togglebutton/index.d.ts","./node_modules/@mui/material/esm/togglebuttongroup/togglebuttongroupclasses.d.ts","./node_modules/@mui/material/esm/togglebuttongroup/togglebuttongroup.d.ts","./node_modules/@mui/material/esm/togglebuttongroup/index.d.ts","./node_modules/@mui/material/esm/styles/props.d.ts","./node_modules/@mui/material/esm/styles/overrides.d.ts","./node_modules/@mui/material/esm/styles/variants.d.ts","./node_modules/@mui/material/esm/styles/components.d.ts","./node_modules/@mui/material/esm/styles/createthemenovars.d.ts","./node_modules/@mui/material/esm/styles/createthemewithvars.d.ts","./node_modules/@mui/material/esm/styles/createtheme.d.ts","./node_modules/@mui/material/esm/styles/adaptv4theme.d.ts","./node_modules/@mui/material/esm/styles/createcolorscheme.d.ts","./node_modules/@mui/material/esm/styles/createstyles.d.ts","./node_modules/@mui/material/esm/styles/responsivefontsizes.d.ts","./node_modules/@mui/system/esm/createbreakpoints/index.d.ts","./node_modules/@mui/material/esm/styles/usetheme.d.ts","./node_modules/@mui/material/esm/styles/usethemeprops.d.ts","./node_modules/@mui/material/esm/styles/slotshouldforwardprop.d.ts","./node_modules/@mui/material/esm/styles/rootshouldforwardprop.d.ts","./node_modules/@mui/material/esm/styles/styled.d.ts","./node_modules/@mui/material/esm/styles/themeprovider.d.ts","./node_modules/@mui/material/esm/styles/cssutils.d.ts","./node_modules/@mui/material/esm/styles/makestyles.d.ts","./node_modules/@mui/material/esm/styles/withstyles.d.ts","./node_modules/@mui/material/esm/styles/withtheme.d.ts","./node_modules/@mui/material/esm/styles/themeproviderwithvars.d.ts","./node_modules/@mui/material/esm/styles/getoverlayalpha.d.ts","./node_modules/@mui/material/esm/styles/shouldskipgeneratingvar.d.ts","./node_modules/@mui/material/esm/styles/excludevariablesfromroot.d.ts","./node_modules/@mui/material/esm/styles/index.d.ts","./node_modules/@mui/utils/esm/classnamegenerator/classnamegenerator.d.ts","./node_modules/@mui/utils/esm/classnamegenerator/index.d.ts","./node_modules/@mui/utils/esm/capitalize/capitalize.d.ts","./node_modules/@mui/utils/esm/capitalize/index.d.ts","./node_modules/@mui/material/esm/utils/capitalize.d.ts","./node_modules/@mui/utils/esm/createchainedfunction/createchainedfunction.d.ts","./node_modules/@mui/utils/esm/createchainedfunction/index.d.ts","./node_modules/@mui/material/esm/utils/createchainedfunction.d.ts","./node_modules/@mui/material/esm/utils/createsvgicon.d.ts","./node_modules/@mui/utils/esm/debounce/debounce.d.ts","./node_modules/@mui/utils/esm/debounce/index.d.ts","./node_modules/@mui/material/esm/utils/debounce.d.ts","./node_modules/@mui/utils/esm/deprecatedproptype/deprecatedproptype.d.ts","./node_modules/@mui/utils/esm/deprecatedproptype/index.d.ts","./node_modules/@mui/material/esm/utils/deprecatedproptype.d.ts","./node_modules/@mui/utils/esm/ismuielement/ismuielement.d.ts","./node_modules/@mui/utils/esm/ismuielement/index.d.ts","./node_modules/@mui/material/esm/utils/ismuielement.d.ts","./node_modules/@mui/material/esm/utils/memotheme.d.ts","./node_modules/@mui/utils/esm/ownerdocument/ownerdocument.d.ts","./node_modules/@mui/utils/esm/ownerdocument/index.d.ts","./node_modules/@mui/material/esm/utils/ownerdocument.d.ts","./node_modules/@mui/utils/esm/ownerwindow/ownerwindow.d.ts","./node_modules/@mui/utils/esm/ownerwindow/index.d.ts","./node_modules/@mui/material/esm/utils/ownerwindow.d.ts","./node_modules/@mui/utils/esm/requirepropfactory/requirepropfactory.d.ts","./node_modules/@mui/utils/esm/requirepropfactory/index.d.ts","./node_modules/@mui/material/esm/utils/requirepropfactory.d.ts","./node_modules/@mui/utils/esm/setref/setref.d.ts","./node_modules/@mui/utils/esm/setref/index.d.ts","./node_modules/@mui/material/esm/utils/setref.d.ts","./node_modules/@mui/utils/esm/useenhancedeffect/useenhancedeffect.d.ts","./node_modules/@mui/utils/esm/useenhancedeffect/index.d.ts","./node_modules/@mui/material/esm/utils/useenhancedeffect.d.ts","./node_modules/@mui/utils/esm/useid/useid.d.ts","./node_modules/@mui/utils/esm/useid/index.d.ts","./node_modules/@mui/material/esm/utils/useid.d.ts","./node_modules/@mui/utils/esm/unsupportedprop/unsupportedprop.d.ts","./node_modules/@mui/utils/esm/unsupportedprop/index.d.ts","./node_modules/@mui/material/esm/utils/unsupportedprop.d.ts","./node_modules/@mui/utils/esm/usecontrolled/usecontrolled.d.ts","./node_modules/@mui/utils/esm/usecontrolled/index.d.ts","./node_modules/@mui/material/esm/utils/usecontrolled.d.ts","./node_modules/@mui/utils/esm/useeventcallback/useeventcallback.d.ts","./node_modules/@mui/utils/esm/useeventcallback/index.d.ts","./node_modules/@mui/material/esm/utils/useeventcallback.d.ts","./node_modules/@mui/utils/esm/useforkref/useforkref.d.ts","./node_modules/@mui/utils/esm/useforkref/index.d.ts","./node_modules/@mui/material/esm/utils/useforkref.d.ts","./node_modules/@mui/material/esm/utils/mergeslotprops.d.ts","./node_modules/@mui/material/esm/utils/index.d.ts","./node_modules/@mui/material/esm/box/box.d.ts","./node_modules/@mui/material/esm/box/boxclasses.d.ts","./node_modules/@mui/material/esm/box/index.d.ts","./node_modules/@mui/material/esm/darkscrollbar/index.d.ts","./node_modules/@mui/material/esm/grow/grow.d.ts","./node_modules/@mui/material/esm/grow/index.d.ts","./node_modules/@mui/material/esm/nossr/nossr.types.d.ts","./node_modules/@mui/material/esm/nossr/nossr.d.ts","./node_modules/@mui/material/esm/nossr/index.d.ts","./node_modules/@mui/material/esm/textareaautosize/textareaautosize.types.d.ts","./node_modules/@mui/material/esm/textareaautosize/textareaautosize.d.ts","./node_modules/@mui/material/esm/textareaautosize/index.d.ts","./node_modules/@mui/material/esm/usescrolltrigger/usescrolltrigger.d.ts","./node_modules/@mui/material/esm/usescrolltrigger/index.d.ts","./node_modules/@mui/material/esm/zoom/zoom.d.ts","./node_modules/@mui/material/esm/zoom/index.d.ts","./node_modules/@mui/material/esm/globalstyles/globalstyles.d.ts","./node_modules/@mui/material/esm/globalstyles/index.d.ts","./node_modules/@mui/material/esm/version/index.d.ts","./node_modules/@mui/utils/esm/composeclasses/composeclasses.d.ts","./node_modules/@mui/utils/esm/composeclasses/index.d.ts","./node_modules/@mui/utils/esm/generateutilityclass/generateutilityclass.d.ts","./node_modules/@mui/utils/esm/generateutilityclass/index.d.ts","./node_modules/@mui/material/esm/generateutilityclass/index.d.ts","./node_modules/@mui/utils/esm/generateutilityclasses/generateutilityclasses.d.ts","./node_modules/@mui/utils/esm/generateutilityclasses/index.d.ts","./node_modules/@mui/material/esm/generateutilityclasses/index.d.ts","./node_modules/@mui/material/esm/unstable_trapfocus/focustrap.types.d.ts","./node_modules/@mui/material/esm/unstable_trapfocus/focustrap.d.ts","./node_modules/@mui/material/esm/unstable_trapfocus/index.d.ts","./node_modules/@mui/material/esm/initcolorschemescript/initcolorschemescript.d.ts","./node_modules/@mui/material/esm/initcolorschemescript/index.d.ts","./node_modules/@mui/material/esm/index.d.ts","./node_modules/@mui/icons-material/esm/dashboard.d.ts","./node_modules/@mui/icons-material/esm/description.d.ts","./node_modules/@mui/icons-material/esm/psychology.d.ts","./node_modules/@mui/icons-material/esm/build.d.ts","./node_modules/@mui/icons-material/esm/tune.d.ts","./node_modules/@mui/icons-material/esm/terminal.d.ts","./node_modules/@mui/icons-material/esm/viewquilt.d.ts","./node_modules/@mui/icons-material/esm/expandmore.d.ts","./node_modules/@mui/icons-material/esm/add.d.ts","./node_modules/@mui/icons-material/esm/settings.d.ts","./node_modules/@mui/icons-material/esm/viewsidebaroutlined.d.ts","./node_modules/@mui/icons-material/esm/arrowbackoutlined.d.ts","./node_modules/@mui/icons-material/esm/arrowforwardoutlined.d.ts","./node_modules/@mui/icons-material/esm/restartalt.d.ts","./node_modules/@mui/icons-material/esm/folderopen.d.ts","./node_modules/@mui/icons-material/esm/visibility.d.ts","./node_modules/@mui/icons-material/esm/visibilityoff.d.ts","./node_modules/@mui/icons-material/esm/lightmode.d.ts","./node_modules/@mui/icons-material/esm/darkmode.d.ts","./node_modules/@mui/icons-material/esm/save.d.ts","./node_modules/@mui/icons-material/esm/close.d.ts","./node_modules/@mui/icons-material/esm/keyboard.d.ts","./node_modules/@mui/icons-material/esm/language.d.ts","./node_modules/@mui/icons-material/esm/systemupdatealt.d.ts","./node_modules/@mui/icons-material/esm/checkcircleoutline.d.ts","./node_modules/@mui/icons-material/esm/erroroutline.d.ts","./node_modules/@mui/icons-material/esm/download.d.ts","./src/shared/styles/themecontext.tsx","./node_modules/@mui/icons-material/esm/folder.d.ts","./node_modules/@mui/icons-material/esm/insertdrivefileoutlined.d.ts","./node_modules/@mui/icons-material/esm/arrowupward.d.ts","./src/app/components/directorybrowser.tsx","./src/app/pages/settings/settings.tsx","./node_modules/@mui/icons-material/esm/expandless.d.ts","./node_modules/@mui/icons-material/esm/notificationsactive.d.ts","./node_modules/@mui/icons-material/esm/send.d.ts","./node_modules/@mui/icons-material/esm/check.d.ts","./node_modules/@mui/icons-material/esm/edit.d.ts","./node_modules/@mui/icons-material/esm/search.d.ts","./node_modules/@mui/icons-material/esm/questionanswer.d.ts","./node_modules/@mui/icons-material/esm/extension.d.ts","./src/app/pages/agentchat/approvalbar.tsx","./src/app/components/globalapprovaloverlay.tsx","./src/app/components/layout/appshell.tsx","./node_modules/@mui/icons-material/esm/checkcircle.d.ts","./node_modules/@mui/icons-material/esm/cancel.d.ts","./node_modules/@mui/icons-material/esm/dragindicator.d.ts","./node_modules/motion-utils/dist/index.d.ts","./node_modules/motion-dom/dist/index.d.ts","./node_modules/framer-motion/dist/types.d-docc-kzb.d.ts","./node_modules/framer-motion/dist/types/index.d.ts","./node_modules/@mui/icons-material/esm/keyboardarrowdown.d.ts","./node_modules/@mui/icons-material/esm/adsclick.d.ts","./node_modules/@mui/icons-material/esm/folderoutlined.d.ts","./node_modules/@mui/icons-material/esm/psychologyoutlined.d.ts","./node_modules/@mui/icons-material/esm/buildoutlined.d.ts","./node_modules/@types/unist/index.d.ts","./node_modules/@types/hast/index.d.ts","./node_modules/vfile-message/lib/index.d.ts","./node_modules/vfile-message/index.d.ts","./node_modules/vfile/lib/index.d.ts","./node_modules/vfile/index.d.ts","./node_modules/unified/lib/callable-instance.d.ts","./node_modules/trough/lib/index.d.ts","./node_modules/trough/index.d.ts","./node_modules/unified/lib/index.d.ts","./node_modules/unified/index.d.ts","./node_modules/@types/mdast/index.d.ts","./node_modules/mdast-util-to-hast/lib/state.d.ts","./node_modules/mdast-util-to-hast/lib/footer.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/blockquote.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/break.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/code.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/delete.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/emphasis.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/footnote-reference.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/heading.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/html.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/image-reference.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/image.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/inline-code.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/link-reference.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/link.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/list-item.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/list.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/paragraph.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/root.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/strong.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/table.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/table-cell.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/table-row.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/text.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/thematic-break.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/index.d.ts","./node_modules/mdast-util-to-hast/lib/index.d.ts","./node_modules/mdast-util-to-hast/index.d.ts","./node_modules/remark-rehype/lib/index.d.ts","./node_modules/remark-rehype/index.d.ts","./node_modules/react-markdown/lib/index.d.ts","./node_modules/react-markdown/index.d.ts","./node_modules/micromark-util-types/index.d.ts","./node_modules/micromark-extension-gfm-footnote/lib/html.d.ts","./node_modules/micromark-extension-gfm-footnote/lib/syntax.d.ts","./node_modules/micromark-extension-gfm-footnote/index.d.ts","./node_modules/micromark-extension-gfm-strikethrough/lib/html.d.ts","./node_modules/micromark-extension-gfm-strikethrough/lib/syntax.d.ts","./node_modules/micromark-extension-gfm-strikethrough/index.d.ts","./node_modules/micromark-extension-gfm/index.d.ts","./node_modules/mdast-util-from-markdown/lib/types.d.ts","./node_modules/mdast-util-from-markdown/lib/index.d.ts","./node_modules/mdast-util-from-markdown/index.d.ts","./node_modules/mdast-util-to-markdown/lib/types.d.ts","./node_modules/mdast-util-to-markdown/lib/index.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/blockquote.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/break.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/code.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/definition.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/emphasis.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/heading.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/html.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/image.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/image-reference.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/inline-code.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/link.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/link-reference.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/list.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/list-item.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/paragraph.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/root.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/strong.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/text.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/thematic-break.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/index.d.ts","./node_modules/mdast-util-to-markdown/index.d.ts","./node_modules/mdast-util-gfm-footnote/lib/index.d.ts","./node_modules/mdast-util-gfm-footnote/index.d.ts","./node_modules/markdown-table/index.d.ts","./node_modules/mdast-util-gfm-table/lib/index.d.ts","./node_modules/mdast-util-gfm-table/index.d.ts","./node_modules/mdast-util-gfm/lib/index.d.ts","./node_modules/mdast-util-gfm/index.d.ts","./node_modules/remark-gfm/lib/index.d.ts","./node_modules/remark-gfm/index.d.ts","./node_modules/@mui/icons-material/esm/openinfull.d.ts","./src/app/pages/views/viewpreview.tsx","./src/app/pages/agentchat/viewbubble.tsx","./src/app/pages/agentchat/messagebubble.tsx","./node_modules/@mui/icons-material/esm/block.d.ts","./node_modules/@mui/icons-material/esm/email.d.ts","./node_modules/@mui/icons-material/esm/event.d.ts","./node_modules/@mui/icons-material/esm/attachfile.d.ts","./src/app/pages/agentchat/toolcallbubble.tsx","./src/app/pages/agentchat/toolgroupbubble.tsx","./node_modules/@mui/icons-material/esm/micnoneoutlined.d.ts","./node_modules/@mui/icons-material/esm/stop.d.ts","./node_modules/@mui/icons-material/esm/smarttoyoutlined.d.ts","./node_modules/@mui/icons-material/esm/questionansweroutlined.d.ts","./node_modules/@mui/icons-material/esm/mapoutlined.d.ts","./node_modules/@mui/icons-material/esm/categoryoutlined.d.ts","./node_modules/@mui/icons-material/esm/tuneoutlined.d.ts","./node_modules/@mui/icons-material/esm/viewquiltoutlined.d.ts","./src/app/components/commandpicker.tsx","./src/app/pages/agentchat/templateinvokemodal.tsx","./src/app/pages/agentchat/chatinput.tsx","./node_modules/@mui/icons-material/esm/chevronleft.d.ts","./node_modules/@mui/icons-material/esm/chevronright.d.ts","./src/app/pages/agentchat/branchnavigator.tsx","./node_modules/@mui/icons-material/esm/refresh.d.ts","./node_modules/@mui/icons-material/esm/difference.d.ts","./src/app/pages/agentchat/diffviewer.tsx","./src/app/pages/agentchat/agentchat.tsx","./src/app/pages/dashboard/agentcard.tsx","./node_modules/@mui/icons-material/esm/bolt.d.ts","./node_modules/@mui/icons-material/esm/gridviewrounded.d.ts","./node_modules/@mui/icons-material/esm/removecircleoutline.d.ts","./src/app/pages/views/inputschemaform.tsx","./src/app/pages/dashboard/dashboardviewcard.tsx","./node_modules/@mui/icons-material/esm/arrowback.d.ts","./node_modules/@mui/icons-material/esm/arrowforward.d.ts","./node_modules/@mui/icons-material/esm/lock.d.ts","./src/app/pages/dashboard/browsercard.tsx","./node_modules/@mui/icons-material/esm/remove.d.ts","./node_modules/@mui/icons-material/esm/fitscreen.d.ts","./node_modules/@mui/icons-material/esm/autoawesome.d.ts","./src/app/pages/dashboard/canvascontrols.tsx","./node_modules/@mui/icons-material/esm/stickynote2outlined.d.ts","./node_modules/@mui/icons-material/esm/historyrounded.d.ts","./src/app/pages/dashboard/dashboardtoolbar.tsx","./node_modules/@types/react-dom/index.d.ts","./src/app/components/selectionoverlay.tsx","./src/app/pages/dashboard/dashboard.tsx","./node_modules/@mui/icons-material/esm/deleteoutline.d.ts","./node_modules/@mui/icons-material/esm/contentcopy.d.ts","./node_modules/@mui/icons-material/esm/morevert.d.ts","./src/app/pages/dashboardselection/dashboardselection.tsx","./node_modules/@mui/icons-material/esm/delete.d.ts","./src/app/pages/templates/templates.tsx","./node_modules/@mui/icons-material/esm/openinnew.d.ts","./node_modules/@mui/icons-material/esm/keyboardarrowright.d.ts","./node_modules/@mui/icons-material/esm/morehoriz.d.ts","./node_modules/@mui/icons-material/esm/code.d.ts","./node_modules/@mui/icons-material/esm/autofixhigh.d.ts","./src/app/pages/skills/skillbuilderchat.tsx","./src/app/pages/skills/skills.tsx","./node_modules/@mui/icons-material/esm/schedule.d.ts","./node_modules/@mui/icons-material/esm/map.d.ts","./node_modules/@mui/icons-material/esm/hourglassempty.d.ts","./node_modules/@mui/icons-material/esm/storefront.d.ts","./node_modules/@mui/icons-material/esm/star.d.ts","./node_modules/@mui/icons-material/esm/sort.d.ts","./node_modules/@mui/icons-material/esm/cloud.d.ts","./node_modules/@mui/icons-material/esm/public.d.ts","./node_modules/@mui/icons-material/esm/link.d.ts","./node_modules/@mui/icons-material/esm/security.d.ts","./node_modules/@mui/icons-material/esm/pantool.d.ts","./src/app/pages/tools/tools.tsx","./src/app/components/richprompteditor.tsx","./src/app/pages/modes/modes.tsx","./node_modules/@mui/icons-material/esm/alternateemail.d.ts","./src/app/pages/commands/commands.tsx","./node_modules/@mui/icons-material/esm/playarrow.d.ts","./src/app/pages/views/viewcard.tsx","./node_modules/@mui/icons-material/esm/dataobject.d.ts","./node_modules/@mui/icons-material/esm/javascript.d.ts","./node_modules/@mui/icons-material/esm/style.d.ts","./node_modules/@mui/icons-material/esm/insertdrivefile.d.ts","./node_modules/@codemirror/state/dist/index.d.ts","./node_modules/style-mod/src/style-mod.d.ts","./node_modules/@codemirror/view/dist/index.d.ts","./node_modules/@codemirror/commands/dist/index.d.ts","./node_modules/codemirror/dist/index.d.ts","./node_modules/@lezer/common/dist/index.d.ts","./node_modules/@lezer/lr/dist/index.d.ts","./node_modules/@lezer/highlight/dist/index.d.ts","./node_modules/@codemirror/language/dist/index.d.ts","./node_modules/@codemirror/theme-one-dark/dist/index.d.ts","./node_modules/@codemirror/autocomplete/dist/index.d.ts","./node_modules/@codemirror/lang-html/dist/index.d.ts","./node_modules/@codemirror/lang-python/dist/index.d.ts","./node_modules/@codemirror/lint/dist/index.d.ts","./node_modules/@codemirror/lang-json/dist/index.d.ts","./src/app/pages/views/codeeditor.tsx","./src/app/pages/views/vieweditor.tsx","./src/app/pages/views/viewrundialog.tsx","./src/app/pages/views/views.tsx","./src/app/components/keyboardshortcutshelp.tsx","./src/app/main.tsx","./src/index.tsx","./src/app/components/slashcommandpicker.tsx","./src/app/pages/dashboard/closeagentdialog.tsx","./src/shared/modals/underconstruction/underconstruction.tsx","./src/shared/styles/getstylevalue.tsx","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/blob.d.ts","./node_modules/@types/node/web-globals/console.d.ts","./node_modules/@types/node/web-globals/crypto.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/encoding.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/undici-types/utility.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client-stats.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/h2c-client.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-call-history.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/snapshot-agent.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/cache-interceptor.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/web-globals/importmeta.d.ts","./node_modules/@types/node/web-globals/messaging.d.ts","./node_modules/@types/node/web-globals/navigator.d.ts","./node_modules/@types/node/web-globals/performance.d.ts","./node_modules/@types/node/web-globals/storage.d.ts","./node_modules/@types/node/web-globals/streams.d.ts","./node_modules/@types/node/web-globals/timers.d.ts","./node_modules/@types/node/web-globals/url.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/inspector/promises.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/path/posix.d.ts","./node_modules/@types/node/path/win32.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/quic.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/test/reporters.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/util/types.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/@types/connect/index.d.ts","./node_modules/@types/body-parser/index.d.ts","./node_modules/@types/bonjour/index.d.ts","./node_modules/@types/send/index.d.ts","./node_modules/@types/qs/index.d.ts","./node_modules/@types/range-parser/index.d.ts","./node_modules/@types/express-serve-static-core/index.d.ts","./node_modules/@types/connect-history-api-fallback/index.d.ts","./node_modules/@types/ms/index.d.ts","./node_modules/@types/debug/index.d.ts","./node_modules/@types/estree/index.d.ts","./node_modules/@types/json-schema/index.d.ts","./node_modules/@types/eslint/use-at-your-own-risk.d.ts","./node_modules/@types/eslint/index.d.ts","./node_modules/@types/eslint-scope/index.d.ts","./node_modules/@types/estree-jsx/index.d.ts","./node_modules/@types/http-errors/index.d.ts","./node_modules/@types/mime/index.d.ts","./node_modules/@types/serve-static/node_modules/@types/send/index.d.ts","./node_modules/@types/serve-static/index.d.ts","./node_modules/@types/express/node_modules/@types/express-serve-static-core/index.d.ts","./node_modules/@types/express/index.d.ts","./node_modules/@types/hoist-non-react-statics/index.d.ts","./node_modules/@types/html-minifier-terser/index.d.ts","./node_modules/@types/http-proxy/index.d.ts","./node_modules/@types/node-forge/index.d.ts","./node_modules/@types/parse-json/index.d.ts","./node_modules/@types/prismjs/index.d.ts","./node_modules/@types/react-redux/node_modules/redux/index.d.ts","./node_modules/@types/react-redux/index.d.ts","./node_modules/@types/react-syntax-highlighter/index.d.ts","./node_modules/@types/retry/index.d.ts","./node_modules/@types/serve-index/index.d.ts","./node_modules/@types/sockjs/index.d.ts","./node_modules/@types/use-sync-external-store/index.d.ts","./node_modules/@types/ws/index.d.ts"],"fileIdsList":[[1062,1064,1067,1090,1152,1160,1164,1167,1169,1170,1171,1183],[1062,1064,1090,1152,1160,1164,1167,1169,1170,1171,1183],[1062,1067,1070,1072,1090,1152,1160,1164,1167,1169,1170,1171,1183],[1064,1070,1075,1090,1152,1160,1164,1167,1169,1170,1171,1183],[1070,1072,1090,1152,1160,1164,1167,1169,1170,1171,1183],[1062,1063,1064,1067,1068,1069,1090,1152,1160,1164,1167,1169,1170,1171,1183],[1090,1152,1160,1164,1167,1169,1170,1171,1183],[1062,1070,1090,1152,1160,1164,1167,1169,1170,1171,1183],[1062,1063,1090,1152,1160,1164,1167,1169,1170,1171,1183],[166,167,1090,1152,1160,1164,1167,1169,1170,1171,1183],[168,169,1090,1152,1160,1164,1167,1169,1170,1171,1183],[168,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,172,175,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,170,1090,1152,1160,1164,1167,1169,1170,1171,1183],[166,172,1090,1152,1160,1164,1167,1169,1170,1171,1183],[170,172,173,174,175,177,178,179,180,181,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,176,1090,1152,1160,1164,1167,1169,1170,1171,1183],[172,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,174,1090,1152,1160,1164,1167,1169,1170,1171,1183],[176,1090,1152,1160,1164,1167,1169,1170,1171,1183],[182,1090,1152,1160,1164,1167,1169,1170,1171,1183],[85,166,1090,1152,1160,1164,1167,1169,1170,1171,1183],[171,1090,1152,1160,1164,1167,1169,1170,1171,1183],[162,1090,1152,1160,1164,1167,1169,1170,1171,1183],[172,183,184,185,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,1090,1152,1160,1164,1167,1169,1170,1171,1183],[172,183,184,1090,1152,1160,1164,1167,1169,1170,1171,1183],[186,187,1090,1152,1160,1164,1167,1169,1170,1171,1183],[186,1090,1152,1160,1164,1167,1169,1170,1171,1183],[164,1090,1152,1160,1164,1167,1169,1170,1171,1183],[163,1090,1152,1160,1164,1167,1169,1170,1171,1183],[165,1090,1152,1160,1164,1167,1169,1170,1171,1183],[1067,1090,1152,1160,1164,1167,1169,1170,1171,1183],[311,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,322,326,379,477,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[477,478,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,312,471,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[471,472,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,312,474,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[474,475,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,317,326,480,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[480,481,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,311,312,320,323,324,326,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[324,327,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,331,332,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[332,333,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,308,322,335,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[335,336,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,312,320,323,326,340,366,368,369,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[369,370,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,308,311,326,372,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[372,373,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,326,374,375,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[375,376,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,326,379,381,382,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[382,383,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,308,326,385,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[385,386,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,391,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[391,392,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,317,326,388,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[388,389,1090,1152,1160,1164,1167,1169,1170,1171,1183],[159,301,308,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[803,804,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,311,326,394,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[394,395,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,308,317,402,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[402,403,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,314,315,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[313,315,316,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,312,313,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,308,397,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,398,1090,1152,1160,1164,1167,1169,1170,1171,1183],[397,398,399,400,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,308,323,420,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[420,421,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,317,326,405,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[405,406,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,312,408,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[408,409,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,411,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[411,412,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,326,331,414,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[414,415,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,417,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[417,418,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,312,326,424,425,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[425,426,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,308,326,338,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[338,339,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,312,428,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[428,429,1090,1152,1160,1164,1167,1169,1170,1171,1183],[625,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,312,326,379,435,436,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[436,437,1090,1152,1160,1164,1167,1169,1170,1171,1183],[138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,439,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[301,1090,1152,1160,1164,1167,1169,1170,1171,1183],[439,440,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[442,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,312,323,326,379,384,456,457,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[457,458,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,312,444,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[444,445,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,312,447,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[447,448,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,331,450,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[450,451,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,331,460,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[460,461,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,308,463,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[463,464,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,312,323,326,379,384,456,467,468,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[468,469,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,308,317,483,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[483,484,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,379,1090,1152,1160,1164,1167,1169,1170,1171,1183],[380,1090,1152,1160,1164,1167,1169,1170,1171,1183],[301,312,488,489,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[489,490,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,308,495,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,496,1090,1152,1160,1164,1167,1169,1170,1171,1183],[495,496,497,498,1090,1152,1160,1164,1167,1169,1170,1171,1183],[497,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,312,326,331,492,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[492,493,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,312,500,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[500,501,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,308,503,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[503,504,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,308,506,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[506,507,1090,1152,1160,1164,1167,1169,1170,1171,1183],[825,1090,1152,1160,1164,1167,1169,1170,1171,1183],[828,1090,1152,1160,1164,1167,1169,1170,1171,1183],[301,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[819,1090,1152,1160,1164,1167,1169,1170,1171,1183],[159,301,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[512,513,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,308,509,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[509,510,1090,1152,1160,1164,1167,1169,1170,1171,1183],[807,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,308,515,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[515,516,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,308,317,318,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[318,319,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,308,518,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[518,519,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,524,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[524,525,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,312,521,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[521,522,1090,1152,1160,1164,1167,1169,1170,1171,1183],[158,311,317,320,323,328,331,334,337,340,361,366,368,371,374,377,381,384,387,390,393,396,401,404,407,410,413,416,419,422,427,430,438,441,443,446,449,452,456,459,462,465,467,470,473,476,479,482,485,488,491,494,499,502,505,508,511,514,517,520,523,526,529,532,535,538,541,544,547,550,553,556,559,562,565,568,570,573,576,579,583,584,587,591,594,599,602,605,608,612,615,621,624,626,629,633,636,639,642,645,648,651,654,657,660,664,668,670,673,676,679,682,685,688,692,694,697,700,703,706,709,712,715,718,721,724,751,802,805,806,808,811,814,816,818,820,821,823,826,829,832,834,1090,1152,1160,1164,1167,1169,1170,1171,1183],[833,1090,1152,1160,1164,1167,1169,1170,1171,1183],[241,1090,1152,1160,1164,1167,1169,1170,1171,1183],[533,534,1090,1152,1160,1164,1167,1169,1170,1171,1183],[301,312,488,533,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[527,528,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,527,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[486,487,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,312,486,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[530,531,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,308,508,530,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[159,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,312,317,326,423,1090,1152,1160,1164,1167,1169,1170,1171,1183],[536,537,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,312,536,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[539,540,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,308,331,539,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[560,561,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,560,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[548,549,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,326,548,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[542,543,1090,1152,1160,1164,1167,1169,1170,1171,1183],[301,312,542,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[551,552,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,317,551,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[545,546,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,312,545,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[554,555,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,312,554,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[557,558,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,312,326,331,557,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[563,564,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,563,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[574,575,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,312,323,326,379,384,456,570,573,574,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[566,567,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,317,566,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[569,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,308,562,1090,1152,1160,1164,1167,1169,1170,1171,1183],[577,578,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,312,323,326,538,577,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[453,454,455,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,308,326,361,384,454,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[581,582,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,312,535,580,581,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[809,810,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,809,1090,1152,1160,1164,1167,1169,1170,1171,1183],[585,586,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,312,326,488,585,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[589,590,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,312,588,589,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[592,593,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,308,326,588,592,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[321,322,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,308,321,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[571,572,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,312,323,325,326,379,384,456,571,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,326,358,361,362,1090,1152,1160,1164,1167,1169,1170,1171,1183],[363,364,365,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,363,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[359,360,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,359,1090,1152,1160,1164,1167,1169,1170,1171,1183],[600,601,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,312,326,424,600,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[595,597,598,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,502,1090,1152,1160,1164,1167,1169,1170,1171,1183],[502,1090,1152,1160,1164,1167,1169,1170,1171,1183],[596,1090,1152,1160,1164,1167,1169,1170,1171,1183],[603,604,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,308,326,603,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[606,607,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,606,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[610,611,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,312,491,535,576,587,609,610,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,576,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[613,614,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,308,613,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[466,1090,1152,1160,1164,1167,1169,1170,1171,1183],[619,620,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,308,326,616,618,619,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,617,1090,1152,1160,1164,1167,1169,1170,1171,1183],[627,628,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,312,326,379,624,626,627,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[622,623,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,312,323,622,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[631,632,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,312,326,485,630,631,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[637,638,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,312,326,485,636,637,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[640,641,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,312,640,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[643,644,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,731,1090,1152,1160,1164,1167,1169,1170,1171,1183],[665,666,667,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,665,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[646,647,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,317,646,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[649,650,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,312,649,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[652,653,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,312,326,379,438,652,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[655,656,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,311,312,655,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[658,659,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,312,326,657,658,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[661,662,663,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,323,661,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[161,301,302,303,304,305,306,725,726,727,731,1090,1152,1160,1164,1167,1169,1170,1171,1183],[725,726,727,1090,1152,1160,1164,1167,1169,1170,1171,1183],[730,1090,1152,1160,1164,1167,1169,1170,1171,1183],[85,301,1090,1152,1160,1164,1167,1169,1170,1171,1183],[161,307,729,730,1090,1152,1160,1164,1167,1169,1170,1171,1183],[159,161,278,301,302,303,304,305,306,1090,1152,1160,1164,1167,1169,1170,1171,1183],[161,301,302,303,304,305,306,307,728,1090,1152,1160,1164,1167,1169,1170,1171,1183],[307,728,729,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,161,304,1090,1152,1160,1164,1167,1169,1170,1171,1183],[304,1090,1152,1160,1164,1167,1169,1170,1171,1183],[159,160,161,278,301,302,303,304,305,306,725,726,727,728,730,731,732,733,734,735,736,737,738,741,742,743,744,745,746,747,748,749,750,1090,1152,1160,1164,1167,1169,1170,1171,1183],[301,311,314,317,320,323,328,331,334,337,340,366,371,374,377,384,387,390,393,396,401,404,407,410,413,416,419,422,427,430,438,441,446,449,452,456,459,462,465,470,473,476,479,482,485,488,491,494,499,502,505,508,511,514,517,520,523,526,529,532,535,538,541,544,547,550,553,556,559,562,565,568,570,573,576,579,583,587,591,594,599,602,605,608,612,615,621,624,629,633,636,639,642,645,648,651,654,657,660,664,668,673,676,679,682,685,688,692,694,697,700,703,706,709,715,718,721,724,725,1090,1152,1160,1164,1167,1169,1170,1171,1183],[311,314,317,320,323,328,331,334,337,340,366,371,374,377,384,387,390,393,396,401,404,407,410,413,416,419,422,427,430,438,441,443,446,449,452,456,459,462,465,470,473,476,479,482,485,488,491,494,499,502,505,508,511,514,517,520,523,526,529,532,535,538,541,544,547,550,553,556,559,562,565,568,570,573,576,579,583,584,587,591,594,599,602,605,608,612,615,621,624,629,633,636,639,642,645,648,651,654,657,660,664,668,670,673,676,679,682,685,688,692,694,697,700,703,706,709,715,718,721,724,1090,1152,1160,1164,1167,1169,1170,1171,1183],[301,305,1090,1152,1160,1164,1167,1169,1170,1171,1183],[301,731,739,740,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,241,278,301,729,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,241,270,301,730,1090,1152,1160,1164,1167,1169,1170,1171,1183],[731,1090,1152,1160,1164,1167,1169,1170,1171,1183],[728,731,1090,1152,1160,1164,1167,1169,1170,1171,1183],[301,725,1090,1152,1160,1164,1167,1169,1170,1171,1183],[309,310,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,308,309,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[669,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,326,470,1090,1152,1160,1164,1167,1169,1170,1171,1183],[671,672,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,312,326,424,671,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[707,708,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,317,707,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[695,696,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,308,695,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[674,675,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,674,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[677,678,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,312,677,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[680,681,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,680,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[704,705,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,704,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[683,684,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,683,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[689,693,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,320,326,568,612,679,688,689,692,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[686,687,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,311,319,1090,1152,1160,1164,1167,1169,1170,1171,1183],[698,699,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,698,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[701,702,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,308,317,326,701,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[713,714,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,308,311,326,712,713,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[710,711,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,311,317,326,710,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[812,813,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,812,1090,1152,1160,1164,1167,1169,1170,1171,1183],[716,717,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,312,326,488,491,499,505,532,535,587,612,716,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[719,720,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,308,317,719,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[722,723,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,312,722,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[690,691,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,308,690,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[634,635,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,301,312,326,366,379,634,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[379,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,378,1090,1152,1160,1164,1167,1169,1170,1171,1183],[329,330,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,301,305,308,329,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,830,1090,1152,1160,1164,1167,1169,1170,1171,1183],[830,831,1090,1152,1160,1164,1167,1169,1170,1171,1183],[367,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,1090,1152,1160,1164,1167,1169,1170,1171,1183],[263,731,1090,1152,1160,1164,1167,1169,1170,1171,1183],[815,1090,1152,1160,1164,1167,1169,1170,1171,1183],[755,1090,1152,1160,1164,1167,1169,1170,1171,1183],[758,1090,1152,1160,1164,1167,1169,1170,1171,1183],[762,1090,1152,1160,1164,1167,1169,1170,1171,1183],[765,1090,1152,1160,1164,1167,1169,1170,1171,1183],[326,753,756,759,760,763,766,769,770,773,776,779,782,785,788,791,794,797,800,801,1090,1152,1160,1164,1167,1169,1170,1171,1183],[768,1090,1152,1160,1164,1167,1169,1170,1171,1183],[193,731,1090,1152,1160,1164,1167,1169,1170,1171,1183],[325,1090,1152,1160,1164,1167,1169,1170,1171,1183],[772,1090,1152,1160,1164,1167,1169,1170,1171,1183],[775,1090,1152,1160,1164,1167,1169,1170,1171,1183],[778,1090,1152,1160,1164,1167,1169,1170,1171,1183],[781,1090,1152,1160,1164,1167,1169,1170,1171,1183],[301,325,751,1090,1152,1160,1164,1167,1169,1170,1171,1183],[790,1090,1152,1160,1164,1167,1169,1170,1171,1183],[793,1090,1152,1160,1164,1167,1169,1170,1171,1183],[784,1090,1152,1160,1164,1167,1169,1170,1171,1183],[796,1090,1152,1160,1164,1167,1169,1170,1171,1183],[799,1090,1152,1160,1164,1167,1169,1170,1171,1183],[787,1090,1152,1160,1164,1167,1169,1170,1171,1183],[817,1090,1152,1160,1164,1167,1169,1170,1171,1183],[235,237,239,1090,1152,1160,1164,1167,1169,1170,1171,1183],[236,1090,1152,1160,1164,1167,1169,1170,1171,1183],[235,1090,1152,1160,1164,1167,1169,1170,1171,1183],[238,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,183,1090,1152,1160,1164,1167,1169,1170,1171,1183],[191,1090,1152,1160,1164,1167,1169,1170,1171,1183],[85,183,188,190,192,1090,1152,1160,1164,1167,1169,1170,1171,1183],[189,1090,1152,1160,1164,1167,1169,1170,1171,1183],[195,1090,1152,1160,1164,1167,1169,1170,1171,1183],[196,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,195,197,207,212,216,218,220,222,224,226,228,230,232,245,1090,1152,1160,1164,1167,1169,1170,1171,1183],[246,247,1090,1152,1160,1164,1167,1169,1170,1171,1183],[193,195,198,207,212,1090,1152,1160,1164,1167,1169,1170,1171,1183],[213,1090,1152,1160,1164,1167,1169,1170,1171,1183],[264,1090,1152,1160,1164,1167,1169,1170,1171,1183],[215,1090,1152,1160,1164,1167,1169,1170,1171,1183],[159,284,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,207,212,283,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,193,212,284,1090,1152,1160,1164,1167,1169,1170,1171,1183],[283,284,286,1090,1152,1160,1164,1167,1169,1170,1171,1183],[159,212,248,1090,1152,1160,1164,1167,1169,1170,1171,1183],[249,1090,1152,1160,1164,1167,1169,1170,1171,1183],[159,1090,1152,1160,1164,1167,1169,1170,1171,1183],[198,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,193,207,212,1090,1152,1160,1164,1167,1169,1170,1171,1183],[251,1090,1152,1160,1164,1167,1169,1170,1171,1183],[193,1090,1152,1160,1164,1167,1169,1170,1171,1183],[193,198,199,200,207,208,210,1090,1152,1160,1164,1167,1169,1170,1171,1183],[208,211,1090,1152,1160,1164,1167,1169,1170,1171,1183],[209,1090,1152,1160,1164,1167,1169,1170,1171,1183],[221,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,270,271,272,1090,1152,1160,1164,1167,1169,1170,1171,1183],[274,1090,1152,1160,1164,1167,1169,1170,1171,1183],[271,273,274,275,276,277,1090,1152,1160,1164,1167,1169,1170,1171,1183],[271,1090,1152,1160,1164,1167,1169,1170,1171,1183],[217,1090,1152,1160,1164,1167,1169,1170,1171,1183],[219,1090,1152,1160,1164,1167,1169,1170,1171,1183],[233,1090,1152,1160,1164,1167,1169,1170,1171,1183],[193,212,241,1090,1152,1160,1164,1167,1169,1170,1171,1183],[242,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,193,259,288,301,1090,1152,1160,1164,1167,1169,1170,1171,1183],[159,288,1090,1152,1160,1164,1167,1169,1170,1171,1183],[198,200,207,288,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,207,212,248,1090,1152,1160,1164,1167,1169,1170,1171,1183],[288,289,290,291,292,293,1090,1152,1160,1164,1167,1169,1170,1171,1183],[193,195,197,198,199,200,207,210,212,214,216,218,220,222,224,226,228,230,232,234,240,243,245,248,250,252,254,257,259,261,263,265,267,268,274,276,278,279,280,282,285,287,294,299,300,1090,1152,1160,1164,1167,1169,1170,1171,1183],[269,1090,1152,1160,1164,1167,1169,1170,1171,1183],[223,1090,1152,1160,1164,1167,1169,1170,1171,1183],[225,1090,1152,1160,1164,1167,1169,1170,1171,1183],[281,1090,1152,1160,1164,1167,1169,1170,1171,1183],[227,1090,1152,1160,1164,1167,1169,1170,1171,1183],[229,1090,1152,1160,1164,1167,1169,1170,1171,1183],[244,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,159,193,198,200,295,301,1090,1152,1160,1164,1167,1169,1170,1171,1183],[295,296,297,298,1090,1152,1160,1164,1167,1169,1170,1171,1183],[159,295,1090,1152,1160,1164,1167,1169,1170,1171,1183],[194,1090,1152,1160,1164,1167,1169,1170,1171,1183],[253,1090,1152,1160,1164,1167,1169,1170,1171,1183],[252,1090,1152,1160,1164,1167,1169,1170,1171,1183],[201,1090,1152,1160,1164,1167,1169,1170,1171,1183],[204,1090,1152,1160,1164,1167,1169,1170,1171,1183],[201,202,203,204,205,206,1090,1152,1160,1164,1167,1169,1170,1171,1183],[85,1090,1152,1160,1164,1167,1169,1170,1171,1183],[85,193,201,202,203,1090,1152,1160,1164,1167,1169,1170,1171,1183],[266,1090,1152,1160,1164,1167,1169,1170,1171,1183],[240,1090,1152,1160,1164,1167,1169,1170,1171,1183],[231,1090,1152,1160,1164,1167,1169,1170,1171,1183],[262,1090,1152,1160,1164,1167,1169,1170,1171,1183],[258,1090,1152,1160,1164,1167,1169,1170,1171,1183],[212,1090,1152,1160,1164,1167,1169,1170,1171,1183],[255,256,1090,1152,1160,1164,1167,1169,1170,1171,1183],[260,1090,1152,1160,1164,1167,1169,1170,1171,1183],[754,1090,1152,1160,1164,1167,1169,1170,1171,1183],[752,1090,1152,1160,1164,1167,1169,1170,1171,1183],[822,1090,1152,1160,1164,1167,1169,1170,1171,1183],[757,1090,1152,1160,1164,1167,1169,1170,1171,1183],[761,1090,1152,1160,1164,1167,1169,1170,1171,1183],[86,1090,1152,1160,1164,1167,1169,1170,1171,1183],[764,1090,1152,1160,1164,1167,1169,1170,1171,1183],[824,1090,1152,1160,1164,1167,1169,1170,1171,1183],[827,1090,1152,1160,1164,1167,1169,1170,1171,1183],[767,1090,1152,1160,1164,1167,1169,1170,1171,1183],[771,1090,1152,1160,1164,1167,1169,1170,1171,1183],[774,1090,1152,1160,1164,1167,1169,1170,1171,1183],[777,1090,1152,1160,1164,1167,1169,1170,1171,1183],[86,87,1090,1152,1160,1164,1167,1169,1170,1171,1183],[780,1090,1152,1160,1164,1167,1169,1170,1171,1183],[789,1090,1152,1160,1164,1167,1169,1170,1171,1183],[792,1090,1152,1160,1164,1167,1169,1170,1171,1183],[783,1090,1152,1160,1164,1167,1169,1170,1171,1183],[795,1090,1152,1160,1164,1167,1169,1170,1171,1183],[798,1090,1152,1160,1164,1167,1169,1170,1171,1183],[786,1090,1152,1160,1164,1167,1169,1170,1171,1183],[357,1090,1152,1160,1164,1167,1169,1170,1171,1183],[351,353,1090,1152,1160,1164,1167,1169,1170,1171,1183],[341,351,352,354,355,356,1090,1152,1160,1164,1167,1169,1170,1171,1183],[351,1090,1152,1160,1164,1167,1169,1170,1171,1183],[341,351,1090,1152,1160,1164,1167,1169,1170,1171,1183],[342,343,344,345,346,347,348,349,350,1090,1152,1160,1164,1167,1169,1170,1171,1183],[342,346,347,350,351,354,1090,1152,1160,1164,1167,1169,1170,1171,1183],[342,343,344,345,346,347,348,349,350,351,352,354,355,1090,1152,1160,1164,1167,1169,1170,1171,1183],[341,342,343,344,345,346,347,348,349,350,1090,1152,1160,1164,1167,1169,1170,1171,1183],[91,92,93,94,95,1090,1152,1160,1164,1167,1169,1170,1171,1183],[1090,1152,1160,1164,1166,1167,1169,1170,1171,1183,1208,1209],[1090,1152,1158,1160,1164,1167,1169,1170,1171,1183,1208],[1090,1152,1160,1164,1167,1169,1170,1171,1183,1200,1208,1215],[1090,1152,1160,1164,1166,1167,1169,1170,1171,1183,1208],[1090,1152,1160,1164,1167,1169,1170,1171,1183,1217],[1090,1152,1160,1164,1167,1169,1170,1171,1183,1219,1222,1224],[1090,1152,1160,1164,1167,1169,1170,1171,1183,1219,1220,1221,1224],[1090,1152,1160,1164,1167,1169,1170,1171,1183,1222],[1090,1152,1160,1164,1167,1169,1170,1171,1183,1219,1224],[1090,1152,1160,1163,1164,1166,1167,1169,1170,1171,1183,1208,1212,1213,1214],[1090,1152,1160,1164,1167,1169,1170,1171,1183,1210,1213,1215,1228,1229],[892,1090,1152,1160,1164,1167,1169,1170,1171,1183],[1090,1152,1160,1163,1164,1166,1167,1168,1169,1170,1171,1173,1183,1188,1200,1208],[1090,1152,1160,1164,1167,1169,1170,1171,1183,1208],[1090,1149,1150,1152,1160,1164,1167,1169,1170,1171,1183],[1090,1151,1152,1160,1164,1167,1169,1170,1171,1183],[1152,1160,1164,1167,1169,1170,1171,1183],[1090,1152,1160,1164,1167,1169,1170,1171,1183,1191],[1090,1152,1153,1158,1160,1163,1164,1167,1169,1170,1171,1173,1183,1188,1200],[1090,1152,1153,1154,1160,1163,1164,1167,1169,1170,1171,1183],[1090,1152,1155,1160,1164,1167,1169,1170,1171,1183,1201],[1090,1152,1156,1157,1160,1164,1167,1169,1170,1171,1174,1183],[1090,1152,1157,1160,1164,1167,1169,1170,1171,1183,1188,1197],[1090,1152,1158,1160,1163,1164,1167,1169,1170,1171,1173,1183],[1090,1151,1152,1159,1160,1164,1167,1169,1170,1171,1183],[1090,1152,1160,1161,1164,1167,1169,1170,1171,1183],[1090,1152,1160,1162,1163,1164,1167,1169,1170,1171,1183],[1090,1151,1152,1160,1163,1164,1167,1169,1170,1171,1183],[1090,1152,1160,1163,1164,1165,1167,1169,1170,1171,1183,1188,1200],[1090,1152,1160,1163,1164,1165,1167,1169,1170,1171,1183,1188,1191],[1090,1139,1152,1160,1163,1164,1166,1167,1169,1170,1171,1173,1183,1188,1200],[1090,1152,1160,1163,1164,1166,1167,1169,1170,1171,1173,1183,1188,1197,1200],[1090,1152,1160,1164,1166,1167,1168,1169,1170,1171,1183,1188,1197,1200],[1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207],[1090,1152,1160,1163,1164,1167,1169,1170,1171,1183],[1090,1152,1160,1164,1167,1169,1171,1183],[1090,1152,1160,1164,1167,1169,1170,1171,1172,1183,1200],[1090,1152,1160,1163,1164,1167,1169,1170,1171,1173,1183,1188],[1090,1152,1160,1164,1167,1169,1170,1171,1174,1183],[1090,1152,1160,1164,1167,1169,1170,1171,1175,1183],[1090,1152,1160,1163,1164,1167,1169,1170,1171,1178,1183],[1090,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207],[1090,1152,1160,1164,1167,1169,1170,1171,1180,1183],[1090,1152,1160,1164,1167,1169,1170,1171,1181,1183],[1090,1152,1157,1160,1164,1167,1169,1170,1171,1173,1183,1191],[1090,1152,1160,1163,1164,1167,1169,1170,1171,1183,1184],[1090,1152,1160,1164,1167,1169,1170,1171,1183,1185,1201,1204],[1090,1152,1160,1163,1164,1167,1169,1170,1171,1183,1188,1190,1191],[1090,1152,1160,1164,1167,1169,1170,1171,1183,1189,1191],[1090,1152,1160,1164,1167,1169,1170,1171,1183,1191,1201],[1090,1152,1160,1164,1167,1169,1170,1171,1183,1192],[1090,1149,1152,1160,1164,1167,1169,1170,1171,1183,1188,1194],[1090,1152,1160,1164,1167,1169,1170,1171,1183,1188,1193],[1090,1152,1160,1163,1164,1167,1169,1170,1171,1183,1195,1196],[1090,1152,1160,1164,1167,1169,1170,1171,1183,1195,1196],[1090,1152,1157,1160,1164,1167,1169,1170,1171,1173,1183,1188,1197],[1090,1152,1160,1164,1167,1169,1170,1171,1183,1198],[1090,1152,1160,1164,1167,1169,1170,1171,1173,1183,1199],[1090,1152,1160,1164,1166,1167,1169,1170,1171,1181,1183,1200],[1090,1152,1160,1164,1167,1169,1170,1171,1183,1201,1202],[1090,1152,1157,1160,1164,1167,1169,1170,1171,1183,1202],[1090,1152,1160,1164,1167,1169,1170,1171,1183,1188,1203],[1090,1152,1160,1164,1167,1169,1170,1171,1172,1183,1204],[1090,1152,1160,1164,1167,1169,1170,1171,1183,1205],[1090,1152,1155,1160,1164,1167,1169,1170,1171,1183],[1090,1152,1157,1160,1164,1167,1169,1170,1171,1183],[1090,1152,1160,1164,1167,1169,1170,1171,1183,1201],[1090,1139,1152,1160,1164,1167,1169,1170,1171,1183],[1090,1152,1160,1164,1167,1169,1170,1171,1183,1200],[1090,1152,1160,1164,1167,1169,1170,1171,1183,1206],[1090,1152,1160,1164,1167,1169,1170,1171,1178,1183],[1090,1152,1160,1164,1167,1169,1170,1171,1183,1196],[1090,1139,1152,1160,1163,1164,1165,1167,1169,1170,1171,1178,1183,1188,1191,1200,1203,1204,1206],[1090,1152,1160,1164,1167,1169,1170,1171,1183,1188,1207],[87,1090,1152,1160,1164,1167,1169,1170,1171,1183,1231,1237],[87,1090,1152,1160,1164,1167,1169,1170,1171,1183,1239],[378,431,432,433,434,1090,1152,1160,1164,1167,1169,1170,1171,1183],[84,85,86,1090,1152,1160,1164,1167,1169,1170,1171,1183],[1090,1152,1160,1164,1167,1169,1170,1171,1183,1188,1208],[1090,1152,1160,1164,1167,1169,1170,1171,1183,1230],[1090,1152,1160,1164,1166,1167,1169,1170,1171,1183,1208,1225,1227],[1090,1152,1160,1164,1167,1169,1170,1171,1183,1188,1208,1226],[1090,1152,1160,1163,1164,1166,1167,1168,1169,1170,1171,1173,1183,1188,1197,1200,1207,1208],[87,884,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,241,883,884,885,1090,1152,1160,1164,1167,1169,1170,1171,1183],[101,1090,1152,1160,1164,1167,1169,1170,1171,1183],[936,939,942,944,945,946,1090,1152,1160,1164,1167,1169,1170,1171,1183],[903,931,936,939,942,944,946,1090,1152,1160,1164,1167,1169,1170,1171,1183],[903,931,936,939,942,946,1090,1152,1160,1164,1167,1169,1170,1171,1183],[969,970,974,1090,1152,1160,1164,1167,1169,1170,1171,1183],[946,969,971,974,1090,1152,1160,1164,1167,1169,1170,1171,1183],[946,969,971,973,1090,1152,1160,1164,1167,1169,1170,1171,1183],[903,931,946,969,971,972,974,1090,1152,1160,1164,1167,1169,1170,1171,1183],[971,974,975,1090,1152,1160,1164,1167,1169,1170,1171,1183],[946,969,971,974,976,1090,1152,1160,1164,1167,1169,1170,1171,1183],[893,903,904,905,929,930,931,1090,1152,1160,1164,1167,1169,1170,1171,1183],[893,904,931,1090,1152,1160,1164,1167,1169,1170,1171,1183],[893,903,904,931,1090,1152,1160,1164,1167,1169,1170,1171,1183],[906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,1090,1152,1160,1164,1167,1169,1170,1171,1183],[893,897,903,905,931,1090,1152,1160,1164,1167,1169,1170,1171,1183],[947,948,968,1090,1152,1160,1164,1167,1169,1170,1171,1183],[903,931,969,971,974,1090,1152,1160,1164,1167,1169,1170,1171,1183],[903,931,1090,1152,1160,1164,1167,1169,1170,1171,1183],[949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,1090,1152,1160,1164,1167,1169,1170,1171,1183],[892,903,931,1090,1152,1160,1164,1167,1169,1170,1171,1183],[936,937,938,942,946,1090,1152,1160,1164,1167,1169,1170,1171,1183],[936,939,942,946,1090,1152,1160,1164,1167,1169,1170,1171,1183],[936,939,940,941,946,1090,1152,1160,1164,1167,1169,1170,1171,1183],[883,1090,1152,1160,1164,1167,1169,1170,1171,1183],[934,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,893,902,931,933,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,91,1090,1152,1160,1164,1167,1169,1170,1171,1183],[127,131,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,125,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,125,126,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,125,126,128,129,130,1090,1152,1160,1164,1167,1169,1170,1171,1183],[125,1090,1152,1160,1164,1167,1169,1170,1171,1183],[91,1090,1152,1160,1164,1167,1169,1170,1171,1183],[943,976,977,1090,1152,1160,1164,1167,1169,1170,1171,1183],[978,1090,1152,1160,1164,1167,1169,1170,1171,1183],[931,932,1090,1152,1160,1164,1167,1169,1170,1171,1183],[893,897,902,903,931,1090,1152,1160,1164,1167,1169,1170,1171,1183],[899,1090,1152,1160,1164,1167,1169,1170,1171,1183],[1090,1105,1108,1111,1112,1152,1160,1164,1167,1169,1170,1171,1183,1200],[1090,1108,1152,1160,1164,1167,1169,1170,1171,1183,1188,1200],[1090,1108,1112,1152,1160,1164,1167,1169,1170,1171,1183,1200],[1090,1152,1160,1164,1167,1169,1170,1171,1183,1188],[1090,1102,1152,1160,1164,1167,1169,1170,1171,1183],[1090,1106,1152,1160,1164,1167,1169,1170,1171,1183],[1090,1104,1105,1108,1152,1160,1164,1167,1169,1170,1171,1183,1200],[1090,1152,1160,1164,1167,1169,1170,1171,1173,1183,1197],[1090,1102,1152,1160,1164,1167,1169,1170,1171,1183,1208],[1090,1104,1108,1152,1160,1164,1167,1169,1170,1171,1173,1183,1200],[1090,1099,1100,1101,1103,1107,1152,1160,1163,1164,1167,1169,1170,1171,1183,1188,1200],[1090,1108,1116,1124,1152,1160,1164,1167,1169,1170,1171,1183],[1090,1100,1106,1152,1160,1164,1167,1169,1170,1171,1183],[1090,1108,1133,1134,1152,1160,1164,1167,1169,1170,1171,1183],[1090,1100,1103,1108,1152,1160,1164,1167,1169,1170,1171,1183,1191,1200,1208],[1090,1108,1152,1160,1164,1167,1169,1170,1171,1183],[1090,1104,1108,1152,1160,1164,1167,1169,1170,1171,1183,1200],[1090,1099,1152,1160,1164,1167,1169,1170,1171,1183],[1090,1102,1103,1104,1106,1107,1108,1109,1110,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1134,1135,1136,1137,1138,1152,1160,1164,1167,1169,1170,1171,1183],[1090,1108,1126,1129,1152,1160,1164,1167,1169,1170,1171,1183],[1090,1108,1116,1117,1118,1152,1160,1164,1167,1169,1170,1171,1183],[1090,1106,1108,1117,1119,1152,1160,1164,1167,1169,1170,1171,1183],[1090,1107,1152,1160,1164,1167,1169,1170,1171,1183],[1090,1100,1102,1108,1152,1160,1164,1167,1169,1170,1171,1183],[1090,1108,1112,1117,1119,1152,1160,1164,1167,1169,1170,1171,1183],[1090,1112,1152,1160,1164,1167,1169,1170,1171,1183],[1090,1106,1108,1111,1152,1160,1164,1167,1169,1170,1171,1183,1200],[1090,1100,1104,1108,1116,1152,1160,1164,1167,1169,1170,1171,1183],[1090,1108,1126,1152,1160,1164,1167,1169,1170,1171,1183],[1090,1119,1152,1160,1164,1167,1169,1170,1171,1183],[1090,1102,1108,1133,1152,1160,1164,1167,1169,1170,1171,1183,1191,1206,1208],[897,901,1090,1152,1160,1164,1167,1169,1170,1171,1183],[892,897,898,900,902,1090,1152,1160,1164,1167,1169,1170,1171,1183],[894,1090,1152,1160,1164,1167,1169,1170,1171,1183],[895,896,1090,1152,1160,1164,1167,1169,1170,1171,1183],[892,895,897,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,109,114,122,311,323,331,805,837,838,858,863,865,891,991,992,993,994,995,996,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,97,111,320,331,396,404,430,446,449,459,462,541,547,553,559,562,718,805,863,864,865,866,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,98,122,320,331,340,805,843,863,869,870,877,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,331,449,459,462,805,863,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,111,115,122,132,320,328,331,404,438,547,553,559,629,636,805,836,837,838,839,840,841,842,843,844,845,846,847,848,849,863,868,878,1090,1152,1160,1164,1167,1169,1170,1171,1183],[83,87,107,122,331,805,863,997,998,1024,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,88,89,1024,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,122,323,331,547,553,559,562,805,837,838,863,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,88,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,111,116,117,121,122,132,133,134,835,863,879,1026,1030,1032,1039,1051,1053,1055,1080,1081,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,98,99,110,118,122,132,320,331,340,636,805,856,863,867,877,887,982,987,988,999,1002,1005,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,98,109,122,320,331,340,404,438,718,805,837,839,841,843,856,863,869,871,872,873,874,875,876,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,320,331,805,863,1000,1001,1090,1152,1160,1164,1167,1169,1170,1171,1183],[83,87,88,97,105,107,110,122,320,331,340,430,456,547,559,568,576,636,805,850,856,863,865,866,867,887,888,986,989,990,991,992,993,994,995,997,998,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,97,320,331,636,805,863,1003,1004,1090,1152,1160,1164,1167,1169,1170,1171,1183],[83,87,98,320,331,340,404,438,456,636,718,805,843,856,863,865,873,888,889,890,891,935,978,981,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,107,331,404,427,446,449,459,462,499,532,559,568,587,612,718,805,863,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,98,320,331,438,805,841,843,860,861,863,864,869,871,874,935,978,983,984,985,986,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,98,123,320,331,340,438,805,841,843,860,863,869,987,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,114,122,320,331,438,449,459,517,805,843,856,863,979,980,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,107,108,109,110,114,122,323,331,340,805,837,838,841,857,858,863,865,891,991,996,997,1054,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,98,99,122,320,331,340,404,636,805,841,856,863,872,877,880,881,882,886,987,1006,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,88,99,105,119,120,122,124,320,331,430,488,538,636,805,856,858,863,874,991,1003,1013,1014,1015,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,90,320,331,636,805,844,863,1017,1018,1019,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,404,446,449,452,459,462,863,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,88,89,90,98,99,100,114,115,117,118,120,122,132,331,805,836,863,867,1007,1012,1016,1020,1023,1025,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,88,98,114,122,134,331,430,488,517,636,751,805,844,858,863,867,874,886,999,1009,1021,1022,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,99,114,122,320,331,430,636,805,856,863,980,1003,1008,1009,1011,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,99,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,115,122,132,320,331,404,547,559,568,576,636,718,805,836,844,863,873,874,1027,1028,1029,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,107,108,109,110,122,320,331,340,404,410,413,422,427,430,446,449,459,462,499,532,559,565,568,587,612,636,718,805,840,844,850,863,867,873,876,991,992,993,994,1014,1015,1031,1052,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,110,111,116,122,320,328,331,404,430,446,449,459,462,499,529,538,568,612,621,629,718,721,724,805,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,867,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,97,98,108,122,320,331,404,485,636,805,849,855,856,863,867,1006,1017,1037,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,108,113,122,320,328,331,340,404,430,438,446,449,459,462,529,629,636,718,721,724,805,837,841,844,851,862,863,864,873,874,887,935,978,1031,1033,1034,1035,1036,1037,1038,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,107,122,320,331,340,404,430,446,449,459,462,568,718,805,844,863,873,1010,1031,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,97,109,112,114,122,320,328,331,340,374,404,413,422,430,438,446,449,459,462,499,529,532,568,576,612,629,636,673,718,721,724,805,837,839,841,842,844,845,851,862,863,873,874,875,876,880,887,983,1003,1015,1031,1033,1034,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1090,1152,1160,1164,1167,1169,1170,1171,1183],[102,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,863,1062,1064,1065,1066,1071,1073,1074,1076,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,320,331,404,494,499,532,568,612,673,718,805,844,863,1010,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,114,320,331,517,636,805,863,873,1027,1056,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,88,97,98,103,114,118,122,320,331,340,404,430,438,636,673,709,715,718,805,841,843,844,855,860,861,863,864,980,999,1003,1006,1008,1011,1013,1027,1036,1037,1056,1058,1059,1060,1061,1077,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,88,104,805,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,114,122,331,404,430,446,449,459,462,805,863,980,1011,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,114,122,331,404,805,844,863,1057,1078,1079,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,137,1082,1090,1152,1160,1164,1167,1169,1170,1171,1183],[105,118,119,1090,1152,1160,1164,1167,1169,1170,1171,1183],[117,121,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,98,122,132,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,135,1090,1152,1160,1164,1167,1169,1170,1171,1183],[96,97,1090,1152,1160,1164,1167,1169,1170,1171,1183],[96,97,98,1090,1152,1160,1164,1167,1169,1170,1171,1183],[96,98,99,106,107,108,109,110,111,112,113,114,115,116,1090,1152,1160,1164,1167,1169,1170,1171,1183],[96,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,134,1090,1152,1160,1164,1167,1169,1170,1171,1183],[87,120,1090,1152,1160,1164,1167,1169,1170,1171,1183],[97,98,117,1090,1152,1160,1164,1167,1169,1170,1171,1183]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"2ab096661c711e4a81cc464fa1e6feb929a54f5340b46b0a07ac6bbf857471f0","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"73f78680d4c08509933daf80947902f6ff41b6230f94dd002ae372620adb0f60","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5239f5c01bcfa9cd32f37c496cf19c61d69d37e48be9de612b541aac915805b","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"87ac5f005e342e517e500f635ad8297809c7ab8e029c3182f5674aea74b8b223","signature":"110ec2c239c14bc4fd89aac3ee8e032f3c9e1df7bfd2a43ffbbb63159bfb44b6"},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"87d9d29dbc745f182683f63187bf3d53fd8673e5fca38ad5eaab69798ed29fbc","impliedFormat":1},{"version":"035312d4945d13efa134ae482f6dc56a1a9346f7ac3be7ccbad5741058ce87f3","affectsGlobalScope":true,"impliedFormat":1},{"version":"628dc8d41872acf69b9965e3add515d69fec9d219227d984acbee1354e0ad4c3","signature":"e7484cccdd6990a29c8a12c3676b63a4d3d3aeba0f271a210e28b4e1d467c4db"},{"version":"62cb4b14546de6d073b29cfdd6dac92509238db908331adf84a7eda7fd5c9b5d","signature":"3aa8e3d47bad01dc122187b458b5b071f1b60ca1c24e08b24a2d4d00d0888248"},{"version":"a38c3bc463bdc2933d0487f49dbbab1c8b396e9723db2f894091de35452e8dbe","signature":"2226411363434efd8af39351e8a7c3eaf91f3c3ef4ee11eefa8eca59380787c0"},{"version":"f734b58ea162765ff4d4a36f671ee06da898921e985a2064510f4925ec1ed062","affectsGlobalScope":true,"impliedFormat":1},{"version":"55c0569d0b70dbc0bb9a811469a1e2a7b8e2bab2d70c013f2e40dfb2d2803d05","impliedFormat":1},{"version":"37f96daaddc2dd96712b2e86f3901f477ac01a5c2539b1bc07fd609d62039ee1","impliedFormat":1},{"version":"9c5c84c449a3d74e417343410ba9f1bd8bfeb32abd16945a1b3d0592ded31bc8","impliedFormat":1},{"version":"a7f09d2aaf994dbfd872eda4f2411d619217b04dbe0916202304e7a3d4b0f5f8","impliedFormat":1},{"version":"a66ebe9a1302d167b34d302dd6719a83697897f3104d255fe02ff65c47c5814e","impliedFormat":99},{"version":"90a9b8fbb9d719f76d1aed407acd2fc26add4c9bf151b965c02353ba04b109f5","signature":"6613ff52532f9fcc1be549ffcd6e3fb726c42b79a1b8b10af5b5aaef5a112310"},{"version":"1f87754c79b221cea525c3a67e03607624359a9b8e961a7b0cddbdd70219f4a8","signature":"87425d6f7a09c4370a7341af0662e143bf1e50403339735523fd34d1f056d87f"},{"version":"438e445c686a6e702d5e27edc9173bc0b494c476d943a2eb7fca90d351d7d683","signature":"fa6459a2654f54d52c2df4b7a40817ff1b7ab2fb7982388e2981b557da367bef"},{"version":"349c43cf2937b190a0025e5c3756f81c2014e454464009328377bc04251ed4af","signature":"fe5ba13e54586014ece0d3f07b2c003236ab965aa7a41fae50d1ea91ec9d5a02"},{"version":"ee09b9348d02aec6cd1cebb94c27896c10d47efa042a3fbc9c90dd6a7f6af752","impliedFormat":1},{"version":"bf673997a66d2225f43fe1b51cdddd497d0a8c08a990ee331457f2d017563075","impliedFormat":1},{"version":"b6ccbac29e6d17043c49bc900e2574e25b8529ac883cc80da2ebf7983061ba60","signature":"caf5f406fd509e80cfa6bd4fae67cc103efd8e34737e7831d46800e92b57937e"},"5657d65e69986258a56073ecaef9b67e481f936c2b4d9100da14263b53debe98",{"version":"8587e54ecff4c55715bcb5b2b701a524a0c8bf2dc9bfbed01b4b8ad44af7c5ed","signature":"96a46b722e9c2e2d90c85d9551d7bf93ab46287825e31f1195454e16e3449e6a"},{"version":"010fa0f5a5bfec93b0fc73289e8b1b3a43fce6752d6b198e57632f07369bbd21","signature":"cad219d666a64a8d4753a7d5da3c2793a70cc46b59adb8f6588b1603f05df0c1"},{"version":"934a88597a1c97bb153d9c608fb8a91eb9f75f62f678199cec3c8dc67802e8cd","signature":"f9d833c0d1c00feef58ba15a134e6c5a64e289ec6e934c5448e0cbc95d3020e4"},{"version":"272b1ee0aaebdb31adad232eea206dc3506ca4c67f0dc868fc8ba9ae307daf91","signature":"610fee1fb6bfe24cc042d71a28bbba228d6a2747e556b4e3823e21f106c8c11e"},{"version":"85de4d8b61aff290e861fdf16da18910865245c14105137c9d092dc56853c798","signature":"cc5da1ab6a381fa02139094a56a1e7994d620d0982cfded553c4377479da338c"},{"version":"82b3f3d21bf6ddc49d87d772a91f3ac013cb7d8d5ddbafb6259f7654d778e588","signature":"a8c9de08e315883c96a7b3c1ad9eed8d38437a61e366caa9ad3679ce47489745"},{"version":"2889e5f630b90c1f985664eac9fa1072d9729dcebe5a1786ab851be73ec11407","signature":"03eff4dbea503a8d38f0272640dcf48beecd418164cd59ce72c673c8d8d46aad"},{"version":"9fff4e72433acb3414b18c2262bb9adebfd89eaeb6f34ef8e37efae388a5278b","signature":"6d5f04a5f6a2decbaa59b112158545b2cc5a0961f1864cf93f70674be3330feb"},{"version":"76f2ddd9847d42c0c4c30627cc56a8ab5f34598d8eedf886bdd1373cb10f9813","signature":"2efe0d54d8d30d147b79063f07114802414b51cf2f37d03ae10cebfccc0cd1dd"},{"version":"2008dbd9f521bf99ccd10eacd8014ffdcfa492d74d9dfaa2a0f8265cb649fe3e","signature":"75e7dfb53ff49fef237668f682e61e68b008b8b5335d91ab3230fee3a4000561"},{"version":"f542a338af576530b0a14455b8ad62b40ffe80381451f79cab1917874d16a4c4","signature":"9e181944e75a442844c228668bb843f816884c26fb1461c53a1b9a26ee1db0fa"},{"version":"58d8508d682029500a1a7e9066c8064c1b1b54ad30d3d1a7071aac4d1ca72ce9","signature":"bf97af566ce2388381a3566a0ed04d4bb5aefeaf184ab78167bf263ed85853af"},{"version":"7e5473adc564e4a16b8f6413b903ab11118da67ef63bed0bbddb16a721dec12f","signature":"7bd01b1a71f44efc760095e381a39b667634f492d18909b73400432a570de8f6"},"d835cb2685558874fa9d8a20683f8c40b04273c8f30ddbd571668225555905bf",{"version":"93f45d5979fc1369ca96f3a268df19aeb0b40d7215e1152ca4ac00565be35e17","signature":"9acbf50bc0d7f5983de6e0b2c3d918a893f5013a4397fc749cd2f0c971693097"},{"version":"dd71b3d1e39235acdd83fa4c405d8d1a82137ec7f86c46f081aba76f2d76d331","signature":"f70ba000a4f7a789a20648835657bac19d46a9a1b0b24bf92366a117e843a110"},{"version":"9b643d11b5bca11af760795e56096beae0ed29e9027fec409481f2ee1cb54bbc","impliedFormat":1},"4b5db289b716b8f529e53cd1f137db1ba9062865127675d5f6bd562e970c6592",{"version":"c0a466b289970062647ab96105fdf5a5c4cb2bb7b14caaf182d852d5a7ba4748","signature":"4551b364ef59c268e241ed19050c7e1716a86541605150be714570fcba7e24e1"},{"version":"e00c3d783f78a20c9f508c70b77e44a83fdd6745d434e1ffdf0e826dbaae51cf","signature":"73b28a3d4c2c3cd76f60236c4014902e86a522dbb622d16147f4c8e8f01de80c"},{"version":"a437d0929fd84e31cd444b8823f4066cc897be005a4003aa74ae946aed3057b1","impliedFormat":99},{"version":"d439306d5d6b8563d53258134ca6bb28d0b6ca6a557bda753ef75829c000a938","impliedFormat":99},{"version":"40af4d2f89f4de15e69d7ff4915a48d54175698870cae94b40a9dd759d5aaffe","affectsGlobalScope":true,"impliedFormat":99},{"version":"ac93729a812a3b6e5e13338dfb98289bed810e88887b37b7aac5b28c6e6287c1","impliedFormat":99},{"version":"a50c9237f37a07b2d5332d6e77160c89624549a5a318108f7ce82ec36b06a3d7","impliedFormat":99},{"version":"79c164aa4f8a8418df7717206ea52508f72743224a6b9c705f10724c6dbb5548","impliedFormat":1},{"version":"65183e393edd53502c199cdfea624c1395461a8c6603a263f695bd309dcf9048","impliedFormat":99},{"version":"9f49b8064f63b7b3275a8247692967da2458734ea9afcf5ffd86b5c177674740","impliedFormat":99},"dc8f349b1673ef15eea7f2e565827312db1c56ba6e16ab6660c6e623ec866c62",{"version":"34928375d6427c429b50caea6afbcce2cfe7f09dd46229fceef33d14b86c0396","signature":"2837d90c5b7d3be23db7294bf715b19b0bfa365ceee189b2a7626f4de6f21e70"},"7c2cabe8d719df7bd72fee16bdef953edc9e06d5b52a2ff4e371366ecd17bf49",{"version":"042a7373d9890a723427ec8016759230e8d43a381161b33c8944352cc131830f","affectsGlobalScope":true},{"version":"05321b823dd3781d0b6aac8700bfdc0c9181d56479fe52ba6a40c9196fd661a8","impliedFormat":1},{"version":"deb685eea280337580ecdc1f59ba64df19b8a0a5b26737c152a492d372d75738","impliedFormat":99},{"version":"e8f18d8914599c6b788ab6549287ecf89bd1a9a173e9eb81659edd61f041fc3c","impliedFormat":99},{"version":"6a89c8b199e69d0fa67aa02481d672c80c1077f1668446d995243efd2fc37225","impliedFormat":99},{"version":"e00fc542e2d58412c06217830a0650bc201c706c8eee2d8d27d5ba6b804c6035","impliedFormat":99},{"version":"b46555207d3dbb03ab62585b52a396f48b48a3c40e96723c3ddab672b66ccf2a","impliedFormat":99},{"version":"37b768bac5fe7881c1823e8b8f372b73f2bb4f619e4ed14432df2030f0fd42ae","impliedFormat":99},{"version":"006047b00455c1b865fa1df0ddae8db818bb39a321f3ddda2c2701f893f81aa4","impliedFormat":99},{"version":"537bed5a5d8b5885ebc6f33a2a27bf6af7231a5119410a7c19ca49ece077b985","impliedFormat":99},{"version":"38ef428d44eec84100a2c3d9409607b7d5d79b611b2e9e3b5bf55787fb3cf01a","impliedFormat":99},{"version":"a082dc47e7a81b2075d1be0e1c84abeef96b90f5c4b0df67c882ea36e9b5198a","impliedFormat":99},{"version":"2eb9b16c811eb2e4cc7c088ecafe3dd58d381cb7bcd43c6378f59d6b62343f82","impliedFormat":99},{"version":"0d99404df5e7375c3af5b29e421e971e4d9497f757e08f6d71c55abe12fb4775","impliedFormat":99},{"version":"2ad8375a297254a151082eca24de4880709e22af2b90b5c0a1527a5c34fdfdd8","impliedFormat":99},{"version":"fb1c107b6e709fa8d8183dcb5513a88ef43037b8dfdb148945bb5de406ced872","impliedFormat":99},{"version":"1c6477a91023bd6c797a298f14926e90756eb2d1eddcf04399d003afc3b8c874","impliedFormat":99},{"version":"31881b2ef14f4a800abb5a2e901a380a60890d3e53481f43820e5677e6731071","impliedFormat":99},{"version":"b1ca55067b6f268f36321ef2bcc284d5bd8f728aeb2be639385d9f62bf4a0b3e","impliedFormat":99},{"version":"08415f0037d74b8126615514833ce44bf9e946ee77390b8f68e93df26a905297","impliedFormat":99},{"version":"56c63ffa519c6f7f237f8d4f2475260a32938bf3e0c2287670bce0c5008854cd","impliedFormat":99},{"version":"01a19462afb14049348a4437ca23d8ea8216f2c5a49e2a05bfaaec0acc4987e7","impliedFormat":99},{"version":"18d4f7640b5e7f959234f0226842f5aac95df07414e66afbe0a86624c0317f72","impliedFormat":99},{"version":"c19012befc7fa0dca216cd574620b15da1cf4ad2b62957d835ba6ccdbb1a9c27","impliedFormat":99},{"version":"cc0048f62d66e974d5c563bcc0b94476e8a005406ed07ef41e8693316b2e31bd","impliedFormat":99},{"version":"e97ab9ab0de2905d62b6f01b8929c21c9b66d3caef11e5fe1f024f6b2c168ae7","impliedFormat":99},{"version":"4dcdbdbc992d114e52247e2f960b05cf9d65d3142114bf08552b18938cb3d56b","impliedFormat":1},{"version":"b75d56703daaffcb31a7cdebf190856e07739a9481f01c2919f95bde99be9424","impliedFormat":99},{"version":"ddb5454371b8da3a72ec536ad319f9f4e0a9851ffa961ae174484296a88a70db","impliedFormat":1},{"version":"fb7c8a2d7e2b50ada1e15b223d3bb83690bd34fd764aa0e009918549e440db1d","impliedFormat":1},{"version":"b75d56703daaffcb31a7cdebf190856e07739a9481f01c2919f95bde99be9424","impliedFormat":99},{"version":"9c909c17f69f125976e5c320eded3e693890d21b18cbc4caa246ec4fda260dcd","impliedFormat":1},{"version":"7915d50018073244a9bcb3621e79b8e0ad4eedfb6b053fc945cad60c983bb11b","impliedFormat":1},{"version":"ea7b47bc357858506e6161065b1a8997cfbc5d1dcdf233966da9d01d74721ef8","impliedFormat":1},{"version":"50444daaee4bf4ad85ad8eb52e3ad5c6bba420aad9e2a800043a78f4d8bc436c","impliedFormat":99},{"version":"1fa33d8db2a9d2a7dbfb7a24718cccbcde8364d10cce29b1a7eea4cf3a530cbb","impliedFormat":1},{"version":"b75d56703daaffcb31a7cdebf190856e07739a9481f01c2919f95bde99be9424","impliedFormat":99},{"version":"90300bef1c0e2523c97fdd178b9d50e3f39646ade67faab69be4e445937c862a","impliedFormat":1},{"version":"381437930df37907c030519b23ffea4d8113f46e4431a70bfe008a0c43c63648","impliedFormat":1},{"version":"695cbb89013bc9e87fb24b0df020fe605c54f0ab5c267b5bf0490ed097044197","impliedFormat":1},{"version":"f43780383543bfcdc0a2ee850375e1f03d94bdb1b85091d5b11bb8b2023c8b49","impliedFormat":1},{"version":"303638e9e9378e3cce14c10a276251b2b6baea811f882b0adb6d8b7e44a8245e","impliedFormat":1},{"version":"93fc1a008c4786aa9970b7a4c56295bef4d39c243af63cbfcbd5548ca4fdd535","impliedFormat":1},{"version":"6b91aca1948fd92e4fb32e91e94955e7b7c12fb8cbc0a40eb55f1808886e53e8","impliedFormat":1},{"version":"1e197b6e669b8ece0a68c684af9a4394d8c47e58eaa040391cbdadcc1b5020a0","impliedFormat":1},{"version":"fccfc90c19498513d5c4b9c705706660eba9eb493bc38cdc16a11e9d384cd086","impliedFormat":1},{"version":"b288bbe96ea05e353f008a4d445fb8589a82f2a1c4d4d0bdfc283a19020dc96f","impliedFormat":1},{"version":"b75d56703daaffcb31a7cdebf190856e07739a9481f01c2919f95bde99be9424","impliedFormat":99},{"version":"cf32b34fb9148d541c100a83fd3d204ced00c76871b4811d53b710ff15a948a1","impliedFormat":1},{"version":"6940a178bd12acca76e270f0b0c4d907b9cc469d28833bd59a3276f11668591e","impliedFormat":1},{"version":"22165b22578a128275b69d52c0cacc6ab19e36eb95e10da18f1bca58cd6ac887","impliedFormat":1},{"version":"ea7b47bc357858506e6161065b1a8997cfbc5d1dcdf233966da9d01d74721ef8","impliedFormat":1},{"version":"9dc9c7a268e5b2caa79a5a5040a86ba5ddf1cba20d8715ceaf2b76f79ee444fc","impliedFormat":99},{"version":"9be491a96d84a67f0d94eff72780b05f5d87e72e35ab479d5d178ec3992afa16","impliedFormat":99},{"version":"c048b081418f530417dd4193b47890bc734711378df819f0ff217144f6775afa","impliedFormat":99},{"version":"43d809531ce93c48c965969fbf6a005d509b56bd2cd99c0e77347185ebd8fce0","impliedFormat":99},{"version":"bf0b1e6c1bb4930244203a593c6db7aed456e635c31aba73ee2102c55998861f","impliedFormat":99},{"version":"58e8c4bed19bfa7264f90353b891ff96094228a20416623bb998f1ae441e958a","impliedFormat":99},{"version":"171e17f251c65245d7b0d18da35b9e9c900576ef6db03a59cae533353e222a90","impliedFormat":99},{"version":"76e3666a9f4495c6d15035095a9bb678a4c3e20014dc8eb9c8df8dc091ec8981","impliedFormat":99},{"version":"055bc641ca1f1eed76df9bc84ec55aaff34e65d364fea6ae7f274ba301726768","impliedFormat":99},{"version":"22ebe7ce1ddc8ee5e70f28c41930c63401e178c637d628b9af9f7a9c456e86b0","impliedFormat":99},{"version":"041c4afbee0a17614e9d4a8aa4385ffbbbfa1a5d5148c9aab0dce964be1af0d6","impliedFormat":99},{"version":"00d259e465df20202e848bf8d192056919e460a3de20aa14f59d523d3af38b29","impliedFormat":99},{"version":"9cbb746b8d46880874f6a8f8c64dfa925ec0cf70412d4ad5e00a8756c82edf3c","impliedFormat":99},{"version":"fd23901347e68e39f7043fc6787b2af6c7094d6c7ef6038ee909cfe26da625c1","impliedFormat":99},{"version":"b27d92f5ce61e0ccb00a4f1f19665ff995df3f16b4b7005a651ffe7255c45cab","impliedFormat":99},{"version":"118a23aa24572ae8fe1a2dc0014d73a0ce45d62bdb988a71bcb6c021dc592c26","impliedFormat":99},{"version":"37f91e6110c28b1d1a7a82cdf44c66fe0259b38c74440b8acbf9d14ddfa451ae","impliedFormat":99},{"version":"47ceda52be9bebcfdda6181b496963f530cf61719fda168f052f6ca483add543","impliedFormat":99},{"version":"3eeab58ad93111ccf9287c7f32b1a8037f23d28783e96b93d097290919fe386e","impliedFormat":99},{"version":"5f6442d0a9bbb961b58f45d09690a034734aeea01f2875cb0e7ec31aa3676ef7","impliedFormat":99},{"version":"6511839e63105744b3bb8b340791218b253bdae80c7d57c288dcc85bc6f91317","impliedFormat":99},{"version":"a361409ddb9ecedc609eac1cc6f752383b1a667be212846927b660727e346d85","impliedFormat":99},{"version":"3f01edcdc9641acfb6689126d9506248d3a3afe3e4a23e2f7588988ba693f349","impliedFormat":99},{"version":"8365f863e47c17b2412fc736f8e279ee225129b9436af8ba9b746fd5d59b06ae","impliedFormat":99},{"version":"6ac1b4401d51471ae0d6b6bcce637e550eb78d75b1cfe993b6eaca9898d74976","impliedFormat":99},{"version":"0b4d305552d9cce2397e6c618cb27d241f64eb4e3496e66d926a7f66a8e0c6b3","impliedFormat":99},{"version":"894395299a4761cd4e38c20bf17bfce27a3cbdc2650054e5fc28e692fddc4b4c","impliedFormat":99},{"version":"7568f6aaaf6b62b7f3f72ebd07bbabd95749a0f969dfb15e7789d4a3c8e080a1","impliedFormat":99},{"version":"039d7ce09e9246c255c7acc1c00ba3afe7e98b4767547ccb6b77274109f8a5c1","impliedFormat":99},{"version":"b4b9514c90add4b59499251f760f01aa7fdaacb02894ff0d885286094cef8c2a","impliedFormat":99},{"version":"f670e23ac2377ed32187f39d02be707c9c0cd61e95786a6ba49ea7f860baa50d","impliedFormat":99},{"version":"25f27d8da6c42f1622b0b01fc5c78f48c79c645e10c4849fc8c5521faa9ace29","impliedFormat":99},{"version":"54e17510b0440980e3bc8ce141c9b922adb6c8e77ee81c443870bf684679255a","impliedFormat":99},{"version":"3e9e2f295358fa46f10faa524be6e99a42114752b0e195ae997f550968ea481f","impliedFormat":99},{"version":"74cf1308a1f0de094f0e8567541b0a0e126426ec2eb4ef68c9cd97fa4d0d9272","impliedFormat":99},{"version":"dcd1e783bde43c7d570ce309cc21e9d9d7b3110491aef9c5c5ce87c6a53f7e5d","impliedFormat":99},{"version":"08bc14542d8d34fd138945413e31ecf65668e029f966b5aab5b25e8e421efead","impliedFormat":99},{"version":"17648a898be56a6a9c4a6305e84ba220bc76d4355f0f55696726f1eb1fcd6d4d","impliedFormat":99},{"version":"cc6c1ade000cc9b7f8c79d8bdddb145950bbe7d404e5b3b938537a0bbfba73bd","impliedFormat":99},{"version":"eb97def43c2617552f76eb367e7f5531127fa03fdf991ef12cf5ae8fcc52c7ed","impliedFormat":99},{"version":"f49bde1443de7aaf05371f049ee0710619bde1b7bb7042192512e5cab672b3fc","impliedFormat":99},{"version":"a704c8b701194cc47d333b093f87db332694b124e304fb0167be09ff3304d353","impliedFormat":99},{"version":"358f8d33b436d21a7c313f02e900b805eb1c6abda3d675f703ada38eea3b92d5","impliedFormat":99},{"version":"dbcf8b1a2d94e9a1f0fa3fd5152114a14f83d8dba8d3f8dd773be476adac937f","impliedFormat":99},{"version":"ee63e60be6f56e08cf8d7b5ab750078fc6d08f69cdf70ee43fd0693d10c65d2f","impliedFormat":99},{"version":"4807b8b139747bd82ef181b5eaf8676c1f9012be0ad91feb1173bd57f08aaac8","impliedFormat":99},{"version":"ceee442c1035bd941c9fbddbab08fce2e34d1e23d79d56a48c0444bb45d705b7","impliedFormat":99},{"version":"fb9bcb4ee14feca03c05eaff9f1eb826bb1e75bade5e64f98c65ecc79b910949","impliedFormat":99},{"version":"f8ee6c9ecf3a39cb551db7d6f0aea157cd272ac477c561331efd734a13b34134","impliedFormat":99},{"version":"f72af7f1a38a5b8ae564be5eb68a8c25e5cf9cf4c567ddfa471a481425369c79","impliedFormat":99},{"version":"aef37af42cec810a643f24ba90f2f7d55c3e05ec5e31adca4c3318e578822aa6","impliedFormat":99},{"version":"ce35f35a8d59172dbf5cd945c253512114d6020e7dd30d399d372e473eff2515","impliedFormat":99},{"version":"e9e8a6bbb3819df983667e1bbf9c993e954c009f575c1f5d2063d55c1af47d1a","impliedFormat":99},{"version":"42c169fb8c2d42f4f668c624a9a11e719d5d07dacbebb63cbcf7ef365b0a75b3","impliedFormat":1},{"version":"b6abb79b5ce1a00b991e3568a1f7ddffdafa6f27235d8c41d440ae3e1395024a","impliedFormat":99},{"version":"bf0b1e6c1bb4930244203a593c6db7aed456e635c31aba73ee2102c55998861f","impliedFormat":99},{"version":"44993fcc19de9502ac3f58734809acbe0b7af3f5cca12761dc33d9a77cf02d1b","impliedFormat":99},{"version":"d172b164580892e56129985557aaf73b4e45279e4e0774e1df53282e6fd89427","impliedFormat":99},{"version":"9104e9de24372f5469c59b5df6cf7cb3f8252268a933e4fd6a2dd09610b165a8","impliedFormat":99},{"version":"68f1a4ec2937052ae0dd18407eb8d1b579708970ced79c6e7cfe4a93d0a00385","impliedFormat":99},{"version":"efe0fabfc89403ce6a4a8b1fe3a7633f1161b7e10d9824299560f2d15e4e606e","impliedFormat":99},{"version":"863e3b3ffefbe39c727cf30147ffe04c04f1c94d5e8f4ac846b227bad8152c93","impliedFormat":99},{"version":"e84f2065c605965fd1d44de2cddf0509dce060b4d9e79c01a884a0899fe877db","impliedFormat":99},{"version":"4546ed6a4f9981e2009e8bc0047130eef10c6ad12958a4093d6a6d720548508f","impliedFormat":99},{"version":"16725a633f5f5c1cd82e2baf4b0ae521da7f6055339f837bf2695bc3fd44373f","impliedFormat":99},{"version":"664104ab990ca5d100a69e159f9f8874551d94a187db834309af14fee2d64f4e","impliedFormat":99},{"version":"542e50c2dca6d24f5cb9cb2b7a5c07d450850af21ef253838bb2bbfb175a3e8c","impliedFormat":99},{"version":"b87a5b1b4ef40860bb48923e0abed7183883a6b4bf16ee7d1ddd745e1c52737b","impliedFormat":99},{"version":"2631b7256705a9ace791907cd28a1272f7c46fc33126332011b6e6ec4504763e","impliedFormat":99},{"version":"fd8b58b771380655281dca6ed40019cd8ecd639ef6ec74baa91662ca0e0ae458","impliedFormat":99},{"version":"6a73dc1806928e57c21fc51d00f40e4e92f17dc6b31ddfa95365a837651587c0","impliedFormat":99},{"version":"ce35f35a8d59172dbf5cd945c253512114d6020e7dd30d399d372e473eff2515","impliedFormat":99},{"version":"97912ca64fedc028914d9f1585e30d98a1e1e46a426a06f2190024067b8a534f","impliedFormat":99},{"version":"a9b65aa46a4613eef2bef431366d8f5f166e8226c6fae3688c67ca102c3d6a79","impliedFormat":99},{"version":"45af3936c6c68c1ebf71c6f69375b64df0bb3ff0ee66c9af8ddb4c43f426110a","impliedFormat":99},{"version":"0caecd57de90295669dd561bf9f0e4c4478434e14e0741c2b0fbed44e38563eb","impliedFormat":99},{"version":"9bf450866b0ae8f5539cc364ebcb566c8eac607bd4cb3c6ce786134b4e6815bc","impliedFormat":99},{"version":"78c0f55d5519d39233daf5562c5704a0322dd7abcc1e72afb015cac550be32d3","impliedFormat":99},{"version":"78b8de068c89bd325bad4d1da693b679f57bb2a0f4a0140e9f58f12d7a913fc6","impliedFormat":99},{"version":"f72af7f1a38a5b8ae564be5eb68a8c25e5cf9cf4c567ddfa471a481425369c79","impliedFormat":99},{"version":"205d330174cc427f3002517bae08e2cf8b8e134cfe086cc80fe18a07efeca799","impliedFormat":99},{"version":"f1cd4f713f4437d86a7e618fc260e84bb609de484c7774d3138b0e52f1ea264e","impliedFormat":99},{"version":"03535e283a156874e32846037dc86e32c53995db4e077d392a8b17c6f26e4f8d","impliedFormat":99},{"version":"8e0b721643bbab457fc721978ca39bb210dee3f84f2693e9f2b463a3079de8e2","impliedFormat":99},{"version":"26714a66ea656e9971107607ff771e07c2d92066fad35f41164ce2f8df516900","impliedFormat":99},{"version":"3c8f12fe817e0928ca30f4df324c0941ba057f1c4cff8e53ce88c5156dada27b","impliedFormat":99},{"version":"d35f81ba39296216f0d88d7b28ed0e02d8c628cf70194b108c0e941cda519ab6","impliedFormat":99},{"version":"87621a249f7a938e9d270b70e560b78b55552eafd08ddf71d2fbd80913699488","impliedFormat":99},{"version":"ab92b4094b7db98dc3c59d5a12afd9a8778a7d0f3304ea8a6497d74c41aa95de","impliedFormat":99},{"version":"400402da2b06f5acd7940db2ee5507784fdab53354062fcddfe4934f3ac04340","impliedFormat":99},{"version":"3e80aeb2dad64ce73bb62a404e1db152fd73bd5849b1777d444939d0c1cfc287","impliedFormat":99},{"version":"61f825380b5ff41a275f6d0cedd145a073524cc24b4963f82c4348574325768c","impliedFormat":99},{"version":"1631f72761156e3e1f414db7ea97cc6b6f1f50904b290f3e6985502be9ee016c","impliedFormat":99},{"version":"b41d3caa8c0839223be817bfedea85bfcf1e682182d51414fd11d9ccaf83792f","impliedFormat":99},{"version":"2b5637680ce53987f0335180e79a9dd639ccfa8f20d46332195dcf11c02e9bb7","impliedFormat":99},{"version":"08bee5ad21bf8bf6d1e66f9bcbcf1c790c1873ae5d63068c02567c357ae619fc","impliedFormat":99},{"version":"a50883ca9e4d58a313d8f8614ddb8bcf4a33587ec85ff9998a971334e34dff0c","impliedFormat":99},{"version":"6cbe055efdadb8b2d27ab470fded80fb4d2219e7b1a0140ffcba3f1ff4e6bd14","impliedFormat":99},{"version":"949ccc4add0506d70be23ded8fe17702ce7ecad3f6b9b2948d12be7b7621c008","impliedFormat":99},{"version":"8b5aa4aceca84ffb115eaa92eb511db532a380715fbe40e0f2691399f59779c4","impliedFormat":99},{"version":"3c84fbf2b9676c3b985e56281412906d998acd2ea3b420679179746d2eb158ef","impliedFormat":99},{"version":"04498bab7aa04819b6f85e0a833cac9a90d2c225449e62a500e0d969a980a0f5","impliedFormat":99},{"version":"603c4205a9e69ac7eee80d9967196c5e1be4e5815507c07a6bc7442a7404a35d","impliedFormat":99},{"version":"953be5c29962c02b750c81742c6c8e3ec88f0dca93b490ae0c25d06ec09a336b","impliedFormat":99},{"version":"93c47ea71b8ac6043e85e16a7f5a12fdf28283e0c3e64818b24ef77339dde953","impliedFormat":99},{"version":"c1faba1a4367b207aa0c37ab286daf320200659b052887e5d017f1a19a1bc939","impliedFormat":99},{"version":"0a5c9fcea7d8dfde5b22c26763cf7c8822a99ba7774b87d4faa63fe165f371d3","impliedFormat":99},{"version":"acbbdccb0deb733cb3c04d97084b6d51b2f3f1257fd84005ab982b068d08e084","impliedFormat":99},{"version":"cd80c1f39858c9aaf24cb6cf109d90b16470b4c4af5b712b350e6e18b08c1d7e","impliedFormat":99},{"version":"938cfdec82f866cebaba7a0d8f7d41aec9cf34ba53628c444d4c0edd90123b39","impliedFormat":99},{"version":"ef0a3e581b336ec4522badc01575daa324a63e76b7317ceda2ef887a5168e2e2","impliedFormat":99},{"version":"5a3458dfcbd3d376e91a57ff64ae747c34f8ca1b503b1be1a84f490b56da1638","impliedFormat":99},{"version":"684fed66904651fd676b78ec044da251651f4dfaedb163df74b2280013d5cd5f","impliedFormat":99},{"version":"78156ec80b86cc8f8651968051ed8f9eb4b2f02559500365ee12c689c2febd9e","impliedFormat":99},{"version":"e463bccc0c9e8e19113e8f5684fa1e0d357fd66cbc7a495a3c4854442268ab0b","impliedFormat":99},{"version":"e8c0fce94bf97316262ce31a0946120e9dafdf2dfda1dc9a71b5e7b1c1337b53","impliedFormat":99},{"version":"a16ecd75e1660eebf91b31f0a6e06fbc1cba65a6b6afe313dab362bd1e5b95c1","impliedFormat":99},{"version":"a9e0a480c019837e2634ee2ac49d078e9548032f2f69e9f7c4465ce4e871155f","impliedFormat":99},{"version":"2e415d3626693f39e40f19ad427f6ad173dc4bde2a7c4ef6a655f30d052b61b0","impliedFormat":99},{"version":"07c33a8bf964265d8a37515f8cb754b82ecdb6b2ae1e2ce18b09c14b9d13b704","impliedFormat":99},{"version":"ec031aac2844e250f72acb0123642f6eb9483250ad7389a79b3757963a890504","impliedFormat":99},{"version":"c98069496e78eba403f51c1a7d582ae0e0f338e2d63b6417e561c9f56cbe88c6","impliedFormat":99},{"version":"7263d25edc36d45908af60cedfa14b898f558e17a7e967b2e1fed0082431461b","impliedFormat":99},{"version":"4b0e0173e248db6eab5b9402044f2f1a2d086e99d9d8af6c4a7f46f52cb6d787","impliedFormat":99},{"version":"dab4f30b9d72cb7596989c6cee8787309e45945f236d984db885ad611e59a259","impliedFormat":99},{"version":"a39d68209be7cdeb86ea872366f7c9f3578e657dde3eb1489012833c87028ff3","impliedFormat":99},{"version":"d86678c90586f9e0be0060703cbfce7ae586cae66eac159afc1b355e2dd2f163","impliedFormat":99},{"version":"c5e59270f3237a2bf344ac83ab3095f30c0ad8f3f07e41f266e662ce544520c5","impliedFormat":99},{"version":"71b85fe7dd2be824ca331849424a64b6417214047772f914db895ac812e06b6f","impliedFormat":99},{"version":"1bfb743c928bfe9fbf9ce88bdfaf8235edb1d3ea0b5ab446603d71c4ac87d802","impliedFormat":99},{"version":"b6e92e897f1bd0dab01bb0f64bd70956f574c7752f7bbdc7f107460a074b707d","impliedFormat":99},{"version":"843c0a76abaef274128b61eae8c21f04202905ab2f53b7f03486ea81aa1c0110","impliedFormat":99},{"version":"a3c33f57bb6ce04191478ea23a17293d382cddb7aee7b56bb5aed3ca49c7fa60","impliedFormat":99},{"version":"c9bfc8572556f746686beb2ac476f999356253c4b3fcba189327b25b30c47801","impliedFormat":99},{"version":"b8c88b5a41a26a1b3518415afadf5160e88fa4a4887978b071893a7c64b43014","impliedFormat":99},{"version":"6af214e64dbf7c599257f7f0851cb57b267c6eef97dbca04b1f2d204ac571fdb","impliedFormat":99},{"version":"7197ba787985c196aae100b99b32e5b271627c340a5883a52c83923f796ccce8","impliedFormat":99},{"version":"ac84c9b0786abb646dfce8480f6ebf83370a47a45d8bd7e2bc705f1069bc71b5","impliedFormat":99},{"version":"3e1850cc32b15cc8e9e7617ade862f50d4d4220ba423ed2542915649e84ca483","impliedFormat":99},{"version":"b95e18604b5d61baf87320e5bd776467df49d18a26e93b5ab18599ea37d4e7bc","impliedFormat":99},{"version":"98c33da6fd946601b36415c760e677c1faed100c361fee8c45565d8d6a00aca1","impliedFormat":99},{"version":"afabd37daf4bc1b2604caedd796ec9deb277d7f3f1927ecea80cc9eeda678518","impliedFormat":99},{"version":"0dfe325b190de07f861c28e1027730a186591562f3890a03ee53c66da76a2065","impliedFormat":99},{"version":"c59eee5e50312900effee1403fa07d9386e95dfaf20411a854729acdf6787629","impliedFormat":99},{"version":"8c8b35b1251978c2156c04db23ce6b842f48db71d39b42dd3c537dfa099e5ef9","impliedFormat":99},{"version":"ffe2657207e83f7b1a8ba2def29185ee81571f5e120176f981e544e589192958","impliedFormat":99},{"version":"9b571fa31a14b8e1e8e7412743e6000be66b7d350358938c1e42bcd18701c31f","impliedFormat":99},{"version":"9a14a6f51a079956ce0a7ee0826c7898825dea24be60e10802e18b46f142efc3","impliedFormat":99},{"version":"f3789c8262f633fd3f474f2f7e36537a29c65bb60a351efb2ddf47208909b962","impliedFormat":99},{"version":"f0410c617e9f6d332d7b860a1c3a679f7fa3e00e89699dfbc6b4f563b12b350c","impliedFormat":99},{"version":"7cbe98b14f6634dda9f63a1fbb217b7eee8053c03e28fdd2b9cd6dc27e0a819a","impliedFormat":99},{"version":"f54071d7f4208a2aea12ea153599608607f44f0d8b6d20a47da8f72e30a5dbfd","impliedFormat":99},{"version":"b6b726231178cb2695b8a83519d4fa50a03e800fa9b2dd75193a56bf6cb58a08","impliedFormat":99},{"version":"70a29119482d358ab4f28d28ee2dcd05d6cbf8e678068855d016e10a9256ec12","impliedFormat":1},{"version":"869ac759ae8f304536d609082732cb025a08dcc38237fe619caf3fcdd41dde6f","impliedFormat":1},{"version":"0ea900fe6565f9133e06bce92e3e9a4b5a69234e83d40b7df2e1752b8d2b5002","impliedFormat":1},{"version":"e5408f95ca9ac5997c0fea772d68b1bf390e16c2a8cad62858553409f2b12412","impliedFormat":1},{"version":"3c1332a48695617fc5c8a1aead8f09758c2e73018bd139882283fb5a5b8536a6","impliedFormat":1},{"version":"9260b03453970e98ce9b1ad851275acd9c7d213c26c7d86bae096e8e9db4e62b","impliedFormat":1},{"version":"083838d2f5fea0c28f02ce67087101f43bd6e8697c51fd48029261653095080c","impliedFormat":1},{"version":"969132719f0f5822e669f6da7bd58ea0eb47f7899c1db854f8f06379f753b365","impliedFormat":1},{"version":"94ca5d43ff6f9dc8b1812b0770b761392e6eac1948d99d2da443dc63c32b2ec1","impliedFormat":1},{"version":"2cbc88cf54c50e74ee5642c12217e6fd5415e1b35232d5666d53418bae210b3b","impliedFormat":1},{"version":"ccb226557417c606f8b1bba85d178f4bcea3f8ae67b0e86292709a634a1d389d","impliedFormat":1},{"version":"5ea98f44cc9de1fe05d037afe4813f3dcd3a8c5de43bdd7db24624a364fad8e6","impliedFormat":1},{"version":"5260a62a7d326565c7b42293ed427e4186b9d43d6f160f50e134a18385970d02","impliedFormat":1},{"version":"0b3fc2d2d41ad187962c43cb38117d0aee0d3d515c8a6750aaea467da76b42aa","impliedFormat":1},{"version":"ed219f328224100dad91505388453a8c24a97367d1bc13dcec82c72ab13012b7","impliedFormat":1},{"version":"6847b17c96eb44634daa112849db0c9ade344fe23e6ced190b7eeb862beca9f4","impliedFormat":1},{"version":"d479a5128f27f63b58d57a61e062bd68fa43b684271449a73a4d3e3666a599a7","impliedFormat":1},{"version":"6f308b141358ac799edc3e83e887441852205dc1348310d30b62c69438b93ca0","impliedFormat":1},{"version":"ef5813952c53ea286963133baf66787308c84eed7338d8c61613a8762167bf79","impliedFormat":99},{"version":"5ca32089fa4a40b1369f085635aadc4bf853bc4ea4dd49eac0779bf9f62423a3","impliedFormat":99},{"version":"5a46f69508e086a0f63d8fb15717422e9ea54d1813be3798c2220bbd9c8ef43c","impliedFormat":99},{"version":"21e29420bf5da1147cf6ebcd8cd85afa21dc3cbf04aee331a042ae6f94c1fa63","impliedFormat":99},{"version":"2532ef3d4f071e7d873ccc1c5766f71fc9007f4e768096b9b5bbe9924abc4a85","impliedFormat":99},{"version":"98f2ac6d25c8ed61bc7afa717b56e11c826fcae1d36c9999248dc85d37454947","impliedFormat":99},{"version":"9bab9e8d65ff83bceec753685598d1d522ca1735a2983eb8c881dc8389b6c008","impliedFormat":99},{"version":"0356b906e53157425c8beb4e5673c71fa80d88e1cd32759d4bd57e59698ef88f","impliedFormat":99},{"version":"0d3d2bf02e634ab678adc2916045058d136c4420bfe710c4557a160b67aed36a","impliedFormat":99},{"version":"edca1f05d978d3c2feae191a82e34710dd8fedb83a24c2fab15373be5be8a378","impliedFormat":99},{"version":"36ac04ebfefc210ab3c0148cbfc451f3434e9ca7048b19827a98247875923176","impliedFormat":99},{"version":"866c88db9c98b1497eb50a58cffa811f35d0aa7ae14361e07bab37f1966e7fba","impliedFormat":99},{"version":"d44ad42a40c4e84bcccc9a5db198f86afa6196d42e152cedbe09d513bff01fb5","impliedFormat":99},{"version":"4f20bc9c75b4515c25c3de1cc6c5391972991a25136b796f8c6601a809e80796","impliedFormat":99},{"version":"4f3b2abbe8fbd186f5d599de906c5afd2ec4328b13285dbbab5cddc3cf3b7373","impliedFormat":99},{"version":"2670ba717e7b90210f244401d5fe6f729cf879cb2938b6536c9c118371ef24a2","impliedFormat":99},{"version":"2e86a352fce1cf1df7be54b242d65c5efa3d66a445a60b2a0f7c33a60ed76eeb","impliedFormat":99},{"version":"b85a123b9f8fc782828d80ce35261e7a06f97affb3dde7cb158da6f7bbd17016","impliedFormat":99},{"version":"02e6668da999217b040e0d8d6e41daa96d7f59eda7bd9dc9156378584116b296","impliedFormat":99},{"version":"7c52a6d05a6e68269e63bc63fad6e869368a141ad23a20e2350c831dc499c5f2","impliedFormat":1},{"version":"217de2289fff8451ec63629b4a49eac597c68425b9bac8fceacc861dc7f33989","impliedFormat":99},{"version":"1a45026d00ce38b0e8deb084a105fe02bdcc32b7050195cc6351c2bb5b554c33","impliedFormat":99},{"version":"97bc3fd65336434e6330e0a9141807cbde8ba4045989809632f70ba93f70f6d3","impliedFormat":99},{"version":"d5bcc410b5ab12693f89a3c477f8dba724d881d87498adfa8ed292869b393c7e","impliedFormat":99},{"version":"09938ea562ff26325e6adccda5de5fc7403c28798335cc3d947eee9b6d5940b0","impliedFormat":99},{"version":"9f313a2d30d03a9954269fa7c7f5cca86ffe2ae6c1ea14741c3e2794aa805806","impliedFormat":99},{"version":"2c4945c48f529153672e10dc7b67f414ac7e7678bfcd5d6b79842ae28a330002","impliedFormat":99},{"version":"0e77db673ec8f065fca99ba005c8be50f615ae00c86f340696bf81cf65bce59e","impliedFormat":99},{"version":"ef83f22620073b4b9e666191044faad4f2b3a5b4bb87e8487b8200bcc75102df","impliedFormat":99},{"version":"99cec35e19fac2229b5c6ba317476fd2694f15a0e9a9d38f146c5f5edfe3ada3","impliedFormat":99},{"version":"730a7f1b457f1b6017fb7a000cb9c1ce9798c3f0f247f1cd751ea7d2aebdf1fe","impliedFormat":99},{"version":"98ab624c4bb847ffac693acecf770154c9763eeb7228e28b873aa2d2ec9eacc4","impliedFormat":99},{"version":"6d26c9ddd47ab86552f4d06e7bf051661237856cc0e5cf75d634853bbd562166","impliedFormat":99},{"version":"680d0952320aceb8891190e27707ac15753b603df67c4437ac7b6e9fa64d8744","impliedFormat":99},{"version":"0a202409812f7dd20d61ded10a6984b79882fe264c76364dc53dca951a28c737","impliedFormat":99},{"version":"06d5971c8b4a3bc00bf57f4332d3bfd92636dd4abda4fa0357c7c1dd496b1407","impliedFormat":99},{"version":"16bc3daf1ea7a6d3ce2407e25ca4ae2ba980c9f683f083c7ad6dedec22b64ecb","impliedFormat":99},{"version":"719f559f65d32823f1db11af17b4ee08fbb19d5acd4b6feb7b6610ccc83af179","impliedFormat":99},{"version":"32e457b81fe1c22b636600c5afaeaf9b53610174cf3bfd3ae6163b6b4251424f","impliedFormat":99},{"version":"0e974dacd2db2d61518aa2b96e39cda96fe082f297f1648ac92aa06d22f652e6","impliedFormat":99},{"version":"aa29bfc666c850f62d2d0b1bb1efd7a56074a96b309667e0de5e0f6c9a893957","impliedFormat":99},{"version":"218daa4b2d1f8f6d3c4f022acce45b10b65d04086a1ab74ea7a135814521627d","impliedFormat":99},{"version":"7f7b3faa89da29e2f52f73f7f2dd37b40c7d1e6dd8b820be1f9603bbd37080a0","impliedFormat":99},{"version":"19129eddecdecfc0dd69e7d02bf2adf525f390269f0667af7d9d14fd9933ad53","impliedFormat":99},{"version":"93f2f1257d136a1173e26beddd168ebaa5b50479fc9cdeafd3c3fdee92db670c","impliedFormat":99},{"version":"8a50a838343a8ee7318f5a4a33defa84d325cb035ff67d4cef3f04cc3dbd7c72","impliedFormat":99},{"version":"93f0399b89384f652cb73f597865e287b69db239dbb52c044a6844cb44a45b1b","impliedFormat":99},{"version":"cc545c484b2a0cd1a77e63252fa8bf49064ed577781cc7f273c8b499f231e9d7","impliedFormat":99},{"version":"9553bb2ddc97cadf255d6056236f335fb3d0b34cd3ff34ef7dc170d0004d8f05","impliedFormat":99},{"version":"522651983601a3d0a24eb8104086714d8e9a958810503275e45cd6ff263cf416","impliedFormat":99},{"version":"4a42853bde0c734cab8c5194afa6e78a6875090d310d472127c84110b8468870","impliedFormat":99},{"version":"ddec04cd05ab7614a2d51c3fbafa772b47cec4d7d6be80c1de8d37e4366692d1","impliedFormat":99},{"version":"a28d089808860737ef08c33c36db5e3db57ec5c5fd41acdbeb0f0d1d8f7a1519","impliedFormat":99},{"version":"8bf2591f190490dc2bd3425f53b56b941cf05d0d4e7c69beb67f473a19d1d87b","impliedFormat":99},{"version":"51b1dce48fa5bde70b49e5586d0bf7ba3371e172df994fd6401bba8b436fb852","impliedFormat":99},{"version":"09a2cc054e9070ff418f718c410e0065a56447a91e4770d619b58142b7ca7800","impliedFormat":99},{"version":"c0e40d24064092ec578bc6f7a61e8a20b14e450b69978017a94c1ce30c3d840b","impliedFormat":99},{"version":"aec5756720255bd7045409db869db09031ce31003dc654175f552d59b196313f","impliedFormat":99},{"version":"86892d5bcae518db21850a892aa682878f77bc6ff1fe096f5f706c91e547cde3","impliedFormat":99},{"version":"920fb154685f4ceae115152b5880295f0da66e60674d22852b18424d2828053a","impliedFormat":99},{"version":"d22c80b0d938d2a571dbe1707606222fb97bd1d4bbb46fe42e326bdee6545ca3","impliedFormat":99},{"version":"4053a0866f10634083ba91f2166420b1c29a2509b64803bd192f50baeb221265","impliedFormat":99},{"version":"71748069e3823c2c09f87fd64f2078d2ac74d80c19bb2d44e3d61e9d5342a23a","impliedFormat":99},{"version":"8b5762f3138b2894db972d51cb539f1ff2bf6b231129667cb89962d4711f9c70","impliedFormat":99},{"version":"ffa366f1f2b7ccf00d170f120836a57cc74e8548e3e72b41bd0cee00dab9dd2a","impliedFormat":99},{"version":"8c85e5dbbf569edf4c83e9e2e5cdf69d3e0644c676d22224899f38c0691a158a","impliedFormat":99},{"version":"aa94cdb0dbaac5ab520157f991bdcdc953c2fbb0436cb4ef6252bba926429a34","impliedFormat":99},{"version":"f440eb21669554667141024bf26145e5bf7de56eddf9eaeaff94310b911f4cf0","impliedFormat":99},{"version":"664ea2d1a61cbe738cf3a4cbe619f775868a97d06398cfe2867173356786988a","impliedFormat":99},{"version":"43246e78fc3edad75b54a70ca2298c86f78023d3d26513fa0a2f7dc8f41bccda","impliedFormat":99},{"version":"8ea7b3318983c9b2e3afa2eaf76d0f7c20c15a571c35567920f0f89848b09fec","impliedFormat":99},{"version":"060bc6464f23a8cfe35ff7b91a3ca4ad918b4f760a96e666453ea093b412a336","impliedFormat":99},{"version":"960a68ced7820108787135bdae5265d2cc4b511b7dcfd5b8f213432a8483daf1","impliedFormat":1},{"version":"2e7ebdc7d8af978c263890bbde991e88d6aa31cc29d46735c9c5f45f0a41243b","impliedFormat":1},{"version":"b57fd1c0a680d220e714b76d83eff51a08670f56efcc5d68abc82f5a2684f0c0","impliedFormat":1},{"version":"8cf121e98669f724256d06bebafec912b92bb042a06d4944f7fb27a56c545109","impliedFormat":1},{"version":"1084565c68b2aed5d6d5cea394799bd688afdf4dc99f4e3615957857c15bb231","impliedFormat":1},{"version":"057a6bc4d8d4ebc4817ad261915f898cf589b62194058913ed9eb4c25f14544f","impliedFormat":99},{"version":"ebaccf8f7b32b5e70b50a0f7f85fd1f3274109ff139dd672b151f05281d0fc99","impliedFormat":99},{"version":"90eb37365f7f73460de47970a44dbf4760990badf21b3223e8ce0207ed874903","impliedFormat":99},{"version":"3127a03a881f78c9145d7db821295531e8c577a8a0738847e70af2b6ad9778f3","impliedFormat":99},{"version":"892acb5e07ceaa0b42725ffd0625b833e77cd148f19117e510334bc815b0b3bd","impliedFormat":99},{"version":"1a35bd51a28387166ff9069b79c5b1b45d917efc33381368083a645c78aa5006","impliedFormat":99},{"version":"01805149ab10adad177b7e7d9e446af6c95e1f7f48db2800e050dcdf90ddfafe","impliedFormat":99},{"version":"57afd9ed037a00dd2715e6128c9f305f287c9b29d9c7f556e4daa074d35a90e5","impliedFormat":99},{"version":"221c6bb2c1152e37f7254d5a167f11ffd57f12c734e970ea15cdc59a97f2038e","impliedFormat":99},{"version":"34b2c4b951dc5a34e03fc0eb0181da3890bd7c720cf8296104aeba2111748826","impliedFormat":99},{"version":"5b6c6c22a039478fa3bc034d6d91d10c0e4d20af1829d986b78a85232cbe0d2f","impliedFormat":99},{"version":"ac67258368872db1e2d5a8fd53fa649fe31c5abe6f62786fd4bc6e6ad51ccb9d","impliedFormat":99},{"version":"3c6e09ab22d0aff0db5dd3b434ca44ed623154cfc5625c8739c5a4b380c25dfb","impliedFormat":99},{"version":"1397759591619d547cbcaea8d94cca1ed29e9f6f13beffaffe9f9307e5955861","impliedFormat":99},{"version":"77381f3914dde6135f903652e311c5bb8053dae28607f519a3716ead90429f85","impliedFormat":99},{"version":"03f966b8e3ca8d79f635c66a3217ebb184a9d6bd6ccb20270d35a7177b418889","impliedFormat":99},{"version":"788ec71568d441083686e3c32d5238de15aab63b59481f9b91174d8b4fb71100","impliedFormat":99},{"version":"976851b5b8d431a8c0767507e182658bb195c7d2fa94a2249f653628791e34b8","impliedFormat":99},{"version":"6d9b1602e3d14e16b782dec30666f2e42d287d6a5345fb7ae52111f9a1e1f92d","impliedFormat":99},{"version":"bb94a73f650bed26030748153efe4730ffc5578a5fae54c34e287956e729340d","impliedFormat":99},{"version":"07c9867e04c1628c47fde22389e075d615795c6b7c66ea90af6c281810699d0a","impliedFormat":99},{"version":"75f943dba7fb8f9472368465096d5f536ef3ef477376d83134978110362ce726","impliedFormat":99},{"version":"fda0aedb30d6f3671dd757a418a60b32699a0a9fe545f68b0be1aea21b1bbdab","impliedFormat":99},{"version":"23abf55ba0b7a59b9bfd17491675b818fc178c581686840a7aef27e45205383c","impliedFormat":99},{"version":"06d3015b06f1f22899905d74207c52e54c051f0466975156de9067ceb884ee47","impliedFormat":99},{"version":"badf4bd328dba83445227652bc1fc2a2d33eb30090e2dbf94d04844c48f3fe30","impliedFormat":99},{"version":"3ecd423076cd6107967e1b9187f38919490d790b258df54e8a6572a93ded5f96","impliedFormat":99},{"version":"3544ad39f2a89044a4d79b878d07a10b9380d39adc2aac3e480b75122ed4c570","impliedFormat":99},{"version":"c1c550ec07e285fd750ac5e3c8ac73e6ab28d775c1cbe29bb97820f169dba940","impliedFormat":99},{"version":"242258092f0ed6960f328b9d7a455c6559c7253c6b57b08883a2fb859c4cfdbb","impliedFormat":99},{"version":"d30e1f8098a34d3b71f1681959f993968fd6d16f40c653689705980ff6610e9e","impliedFormat":99},{"version":"848ac64950a137510b1f47d87cb0f1fe15c7eb06c8e1c2823ae63f413430653c","impliedFormat":99},{"version":"b31006747ab661a13d4bd6bd42715aa1fa8c2288d99a8d2bc4d1f8f81be0d7ed","impliedFormat":99},{"version":"b99e048d5bd6cf544e47f48d4b6893d62bae40217b4d477213e4043b11b0d1ce","impliedFormat":99},{"version":"31f800e9c3607ff0e370bd5a2b73501567dfcf03b7c7c9c9e8927c10a0467efd","impliedFormat":99},{"version":"75624353ffcf91bb2b7911b44075d19a7b9283670f2a78938c17e82e50d1c0f3","impliedFormat":99},{"version":"cad130d0060930b3e5108137b6860fb1eec34406d2710233512256e0b857a252","impliedFormat":99},{"version":"f54bb4e54d36037ae537835edc7d64caff0e33b34fac0a2c3e035a418258ab62","impliedFormat":99},{"version":"725e63c5518a0ca69dc44c12dc4cde29218e4bfd8088368ec67836f394cfc7a4","impliedFormat":99},{"version":"f69b380742957c3cb43b061ab3293ac7ba9d2af1771eba33ef2f814de2353140","impliedFormat":99},{"version":"a6c16d7e6060828143259e5ce1ad0228e3a34e2ff2cf35d2300adc78b6fcb130","impliedFormat":99},{"version":"de9ff289e55588add27a015cc023023660d6b8a21da1a64baa237d0f448b2e96","impliedFormat":99},{"version":"2e92b32bb0b1241e6df9676055172700214318acac3047979c4e03cd74286baf","impliedFormat":99},{"version":"2f7d6f80dd8dd07edff2652926a4b8eeaedafb51775bea7c889afbc795d40b4f","impliedFormat":99},{"version":"32a7a268524728eabdef3c3303a884504d020038f4f320105a96ab7e01430c71","impliedFormat":99},{"version":"586e33bd7f51d99245ff9513e6d603b8522379f29a3f0005176411e16ffeb42e","impliedFormat":99},{"version":"0528549bceed39a3d94c2bbefde7eab0778460dae5eef4ff71f04fcb8c8ec6f0","impliedFormat":99},{"version":"17d424fb44cd45655049d153d11a71cb236155abb50d605e1d91c3736799004b","impliedFormat":99},{"version":"715201e7e601dfdfa08c336f663ec650517e74840d7f988d876f841f0816d297","impliedFormat":99},{"version":"03ceff4db920e1831332a5a40c2eaf8056f221b9e3e672bc294ebc89537c9ff8","impliedFormat":99},{"version":"fef81c4e9f1dfb18873d09b8013567fdb97c0b0bbc3ee7a76c1f2a260af72c8b","impliedFormat":99},{"version":"feca50aa0695b84a0e01990e23e6ba7ab6bd81d50378f5089609b17e52ce97e4","impliedFormat":99},{"version":"377862d812238033feb16a3174f3eca5449b5786727572fc546cb6f1e973adef","impliedFormat":99},{"version":"e362bee8c7c56dad6c0f52b2d83316ed53c6aca843ccc4c1a88b7e55382e0b52","impliedFormat":99},{"version":"9ad91c508ec913a91b433a23c6221e74ccd438b96e001050a7a4cef41a2aef8d","impliedFormat":99},{"version":"eb7e19c5a59896a08776f58b63212ebf6b4c52c24cb6f0574c8ad2e462fc1277","impliedFormat":99},{"version":"c5676e6ff4ed5b0069a3dea05479e3a5abd938dedd4f5ca813f744728066fae8","impliedFormat":99},{"version":"eb874afa240860c59d2443e281d8a0437598f65aa84a3eaa9b5a63533a7e3d99","impliedFormat":99},{"version":"7944d3987fda085b3b5a9325ec52f998d0172d4138fcdcbbff60e34b562656cc","impliedFormat":99},{"version":"b944764dcffb404b05669dede7b7008e62b21a8f7c0cc1c021294490a99e555f","impliedFormat":99},{"version":"5e695fcebbb6a7ff65a5413649befc0510bb34c2e8ac4aa86a55daf77256e17a","impliedFormat":99},{"version":"503a8ac885749cc70864c0dfff99302888a41964e4a9fcaf83ab8d01eef3e458","impliedFormat":99},{"version":"015b9884efeea4f3ffbf092e1c1d6eb69ade71d7d79833468e9c18e36545e142","impliedFormat":99},{"version":"8637312eb67001e93cee29113dfcab695b3e12332a5f4d2fba22471d01978b3d","impliedFormat":99},{"version":"8dfeb90bd8f28f690c724ee3c00d2d32ad633884e159fcfb5ce4e82ee5589c5c","impliedFormat":99},{"version":"eb203bc5bcac0edfc18f2079033038917a42d99775d78566f9844810845aa49d","impliedFormat":99},{"version":"f5df5c1a71732a42fdf23542b344d7069a4e0a68adbec151982b93571442b068","impliedFormat":99},{"version":"b532dd989593d814d9bfcb3131b4331de4b35ade064427001676d1fff001ddd9","impliedFormat":99},{"version":"ca6970eff86a31fd8d9c132f80dbd1aa54d2dcd76a5b2a9108ae8c394bd7e7a1","impliedFormat":99},{"version":"3dad5f9d2442b6a1ee26187724f0a1ebdf9f89b5dff0fb3b8ba1eea11db6d7ba","impliedFormat":99},{"version":"5fca4b593907fc70848e8590d14dba0cf0410e6c061e39c177835e700ad089bf","impliedFormat":99},{"version":"9cd0fc5364ed46b35a958c51c45e4bc47dfaf32750d536b16faab83e885f6c1a","impliedFormat":99},{"version":"4876014affafb8fe03898c335c396ec29ff29ec8ae3b50ad5ea5ff98c9323c8d","impliedFormat":99},{"version":"255cfcfd791b6f0dfd44f17f8bf6d4dfd733b4a8fec6c15efed8013d794016c2","impliedFormat":99},{"version":"8c12c27dc0c277c184812b6605f122f971c2a7b0347e32e995c0b410d96d687f","impliedFormat":99},{"version":"d15d43b6b19a969858befe90f60009952298120dcaab7110cff78a388a50f7a0","impliedFormat":99},{"version":"a6c66a8706af12cecf4c42f17508d6a76b78388e849d8d59b7933a68fdd8487c","impliedFormat":99},{"version":"37b5ab7dcd9f3954013a12e1e873953d8be801cc3f97b4e5d9c4dc895d8fc4ac","impliedFormat":99},{"version":"1277bf682a6d071861d20d2df102d950dedc15e49a96f211b1a4d2c87c83a912","impliedFormat":99},{"version":"8cfe0fafb887fb38150159834ac34b3e91d883b250ba4e1154ce88ed057d9fe2","impliedFormat":99},{"version":"f16b5d560b0e248818ee7c18cba59cdf9e4efa20107be3722e8232aa4a05b61b","impliedFormat":99},{"version":"da5d2ad94cbe6ead090c5dabeb266eb81a958354e487442dfe8313beb467f99c","impliedFormat":99},{"version":"1656706a594b924adfc45a7e9088c63caafb5c2ba689fce0d757d1ee5f016b17","impliedFormat":99},{"version":"50ef2957360f31ed9f3aa91a1bb75d927890469424d1713bb2a5c3eb1aacc4b4","impliedFormat":99},{"version":"a050ee6f9c5833d18643f86c0618ffe791cc15e7dd758f21738e305749e9b002","impliedFormat":99},{"version":"d6d3c9c634567472794a7de284b8220174b57c8ac73b351398436c100bf43cc9","impliedFormat":99},{"version":"a3a561696b28f4e190b734060801f98f6b90cf445996871d2a98e96e4802948c","impliedFormat":99},{"version":"bcaf57053cdd116527f18f99ed70085db39bed9a251510fcd6903e99df6910d2","impliedFormat":99},{"version":"522ff1756b55a8c06ccc949b09b4cafe6fe922fbb1e2d780dc04e992673f6375","impliedFormat":99},{"version":"002a3431688069033aec66620393cd1b97a621e2e3f14742cf59eb472970e32e","impliedFormat":99},{"version":"04ea39e4b3e1d6e56bc1f0bd0c7b19aeb4d35b678937b3ad54c63d44b44900c9","impliedFormat":99},{"version":"7a54a284c5fb690b97ce715f0e7d861c3b150765751cb6bffd6c479c8d5b0313","impliedFormat":99},{"version":"68e90b09ebdc70f73bbf7a632837f153a215ec5fa44354061181d706a991a3b6","impliedFormat":99},{"version":"d7fbd0ea7793a151d792f6ad7d7c9a9ab7dbc69d970d0d0e57b408cba59ab91c","impliedFormat":99},{"version":"c59df2ff58c6adc907ed95ae1e0ddc2f6a123ca1189926dbafa3fae1fe8f40b5","impliedFormat":99},{"version":"b9e75acf8c49e675de4d1f0ddc5f9ccead5e31ce10814bc6c3e159f5aedac1f1","impliedFormat":99},{"version":"717c55229509a89e25c3c3a83a1de364e4db51be5002a738800f76f0ac168868","impliedFormat":99},{"version":"72526a38ff02f77db02a437640df162dd7b542026e0cd0c30b80b4847b154be0","impliedFormat":99},{"version":"74645fa7216f163be6da9092526d7ab1aa4c2840830b5e4bfc901fa592853650","impliedFormat":99},{"version":"ec4ec119f797f71ee6d8110930dad93c689a1683484171621a2702b873d8af1f","impliedFormat":99},{"version":"194560fdeec7316cd47bc201df705df31023382e09a022e780abae975795045b","impliedFormat":99},{"version":"afa28e0c1b26066a331fa400dde21e065ff2275238f41a66d931f56804326b2e","impliedFormat":99},{"version":"09c6639e5622dc1693276f4c7684b0f0f4992d5c4e5c0769dd576e95c50635f7","impliedFormat":99},{"version":"0af521e519e48440bd69f5683fd26542d478c8110c1bde2815a732ea790d5448","impliedFormat":99},{"version":"53c73e3bcfdd414d1f43d62801c7bc03c491c7b13a9f8e7decd2a73afff8a10f","impliedFormat":99},{"version":"49062a955da1d4880135873f5c08988c920429c3785349ed1b4e112b9269d8f7","impliedFormat":99},{"version":"334bc494ebf7f62684a30a916455dc63c6895784a74b07b835d28d0297785496","impliedFormat":99},{"version":"1c671fa97ad69902c110c7890527f5720a785a2e0b68efcb77c16f37d6274d67","impliedFormat":99},{"version":"907467198cc07e6eac62f7eb2bcc7afc31e3ee433ae60000eca62213de971e6d","impliedFormat":99},{"version":"4263e62ba6e779cd26752ab3fcfb42249d009efcf110bf7a69412c1f33582e22","impliedFormat":99},{"version":"fff135e7d6bc235d1968beb6e5d061e243ae19a723a9e2d5b79052eb63318590","impliedFormat":99},{"version":"a723cf11acbb7f1d9b620b90a5cdc50f60f9ac8c2ec7bb6f69751729093180b6","impliedFormat":99},{"version":"019bfea6e0ea6051fe1d51f3d0671fccd704731d54ab218d9a8a42afcde54a41","impliedFormat":99},{"version":"3f9f8c7286eb740abc5ab238fe81d3c4fd5fcde423a120cf55fefd480d694743","impliedFormat":99},{"version":"3f854a9e492f56ef132efbc1bdc155896b97618a2c15eb06248bd88478303be2","impliedFormat":99},{"version":"984d0fd8112e3cdde9bc9cf0875f69676cd5a150caabb228cf067741e1241add","impliedFormat":99},{"version":"401914ef3c9067ec980a75be5e0abbed382a42a279d91cf040e6ec9f455e218b","impliedFormat":99},{"version":"6b95bc34efdbe1082609ab0a1522f30f4b79a906e479af1295d4aba7fa887f58","impliedFormat":99},{"version":"c81e7a416c0e77487b511c0f345797d6323214968009b52dc8c2aa5c9faf7210","impliedFormat":99},{"version":"48f5798a88443d6fbcf24be78dd95bcfd0d173b9639bf3772ea499773adf472a","impliedFormat":99},{"version":"0d8ab497f53d6142282bacf32f1538fc607e267e058074286528126fd1c2db6c","impliedFormat":99},{"version":"5b81a34a60401dac6213a45e2bbde3e57060ff06f847cb005337816ff2015189","impliedFormat":99},{"version":"0b7afe6e094ac7b826a680d4a3838166c438d0d9b0a8867766e137bb2eb24a24","impliedFormat":99},{"version":"8ae43e29b6a1b72cec9bd415afd180de9a9d83423c7d7c8f4d61e090f85ad572","impliedFormat":99},{"version":"f8449256f5c820606e9da9e5dcffd574d48981b8b6520c234b15f8a6bc3dfa70","impliedFormat":99},{"version":"c5aa8fd497a5ce7145a9ab4327fa9a86e8cf04abd71957c9b702e118546b72db","impliedFormat":99},{"version":"3de403593b664a953f7b10950653129a6b70e97fbdbcc79ad8292cebd6602274","impliedFormat":99},{"version":"35c011c44b69e88a5798bb61158c26e35ce74df571c095c029b29d182924c2f8","impliedFormat":99},{"version":"fc41464bb043aad346f6c4a9761ca347ca90ee6912d53b38b8fea621626be77e","impliedFormat":99},{"version":"c9bf49c427e33b552a03b20084624635957dc8468eca2a3d461f0582a011c5b8","impliedFormat":99},{"version":"f4d2c3633596eb54d2bb659bc1c60da3d4157c74c6b6e19f8d27965da2b46bf4","impliedFormat":99},{"version":"cf0c6c6b7ae29e49b64116ac726435fa589a9f4181dcf0fa95e5c06ca07a1954","impliedFormat":99},{"version":"53b2c7304bea0d35da3f158365ecd0794a49cbd8882ff2f7122f99a737854993","impliedFormat":99},{"version":"8ba0c3329dd73b8da0be21357da0dcf8c59e56df9378548e2baa7c05ddd1ee7b","impliedFormat":99},{"version":"6f40ad7380099493513c35be209c0b10a531c4e3bf3acf27d5400d030c59971a","impliedFormat":99},{"version":"d2f0d9d92558f5e5406a561675e6437524bee447f554a8ba6f4dbdd627d0b2e5","impliedFormat":99},{"version":"1a6f8bdae8370c07682bd8dbffb161c2430ea51bd25f0384c66919b4da006ff2","impliedFormat":99},{"version":"ef74f47c63b7a4d7a022c1f569f3ca9c14e3277e0385b037587665d69b96be7d","impliedFormat":99},{"version":"4198bc4505f06500bd9b7db780972b9a301cc946896287e0c9da7d140849ea46","impliedFormat":99},{"version":"990241e0a1ce99f55d209b7957d8ad37ef44aadb98a65d771ace925343a53d27","impliedFormat":99},{"version":"b4b440d99a10cbfd6272aac5bfd9aa9622b9c1f9c43f7d5cf79cb43825614958","impliedFormat":99},{"version":"741587fb86739542002fd67fed070c07e34dbfd9bbfde95ca955144b861d00f3","impliedFormat":99},{"version":"85f6fec457861b1cd7267dce1155878bd33d26f4076db4f399376b74ff492410","impliedFormat":99},{"version":"6989d42d669be40f6591a8fdb8e705df5fec8968a38206f5a0047f47c230d1b2","impliedFormat":99},{"version":"c4dc3d6e7fc6a9f92964a638d033397f68eba61f3c250405a93449081b626034","impliedFormat":99},{"version":"a534aae35e31df8c5dfae7d984612adca9d5641b59b49ead295066dee45b4dfe","impliedFormat":99},{"version":"5bde73a7726033c08aa3a1578dac8f1734dddd9a630f9b985d67365049abfdb1","impliedFormat":99},{"version":"d0b1cdaa14a443a383bfe147dc579b4a836b73f8dfe2b3289e58e871fcad0bf8","impliedFormat":99},{"version":"2546d813c0fcb88951aeeb0c59d42fcc188ca463a6b64045cc091cbe01737664","impliedFormat":99},{"version":"fa36613a2eca835645eda5b9d42edcd51ee8caf8b1b9925fb616c3ca9ca2f1eb","impliedFormat":99},{"version":"4e233c71ce329908730909620ef85af24b60fe520d85d0ab6cd0c8fdb209166a","impliedFormat":99},{"version":"aad34743471540dc34740144e1dccc42c9b4a1522a8f60ea6f8bece95f226aa5","impliedFormat":99},{"version":"9286fbfc02a92a99210da22629d15ace72a71714c3204bb1f21d1647340b6a1f","impliedFormat":99},{"version":"3f6ff7fa12f7ae9e51fb3335767a23feb2042397ff6dd78836ab8380ce06b760","impliedFormat":99},{"version":"9ff80c1ff411da4263c981e187df80b25032f1ac386c137fc4e39252d69819c3","impliedFormat":99},{"version":"05e7d52d0f13fc255dae1568da631c3b31ae36097bf4fa7fafa5d4fc0a902d2f","impliedFormat":99},{"version":"9de7ba484e55a135129114a55baf6401450d4dcdf6072a4026e96a6c491c0df1","impliedFormat":99},{"version":"be8c3c8a9be63d5d07ab0916d6a4636b47da24e8f09fa2bd23be05c1b6426598","impliedFormat":99},{"version":"035cdb01dc859990cc531611dd6c7bb0144f5c02a911b06e7dfbf3232ee0bc73","impliedFormat":99},{"version":"1a95f139da85d7daf0a3e6de7aaf243cad13900f61ed2764a9bbdf64d64ac8ce","impliedFormat":99},{"version":"cce8976bec1dfccb5e48ed58df797a393e3c894397b40986884a173e3ef8fb51","impliedFormat":99},{"version":"d1dfa8127d21751115a0a6ae3e0e0e41f70eabf45e23787ba2d327a14669e518","impliedFormat":99},{"version":"ef87c5b95fbe2151e96c89e6c80ad7dcfa895a7001ea9c0cc258eca3eb84ae49","impliedFormat":99},{"version":"2433129fe6d3d67b8268ba54abd4ab1c7c2f7a32444d4c6a68a9a10be06cc617","impliedFormat":99},{"version":"e969d9b9fd9ca2e023ef701519ccd75e207dd52b92f9af22e15c04fea8e719c4","impliedFormat":99},{"version":"22f273ce016495159b7c0ddba1521435c4ae8f05329efe96fcec598508d5a682","impliedFormat":99},{"version":"dd429b03ce8ba91ab6f204d6c2c7ca00fb3cff07b956da1ac8c60360da28d866","impliedFormat":99},{"version":"b7a63ff548e03c363de65f81f7c31bf98f77b73f13054ece8ee2bc1c1ed9cf6b","impliedFormat":99},{"version":"10122199ed1aab7af1a1b1e1836a79d1401f4700bbd5b85aa1a52cc7d5e200d3","impliedFormat":99},{"version":"5f49779e856a15a93dbc55628c6dd22787c4729a6ecd4a3ef0226ce3efa54d6a","impliedFormat":99},{"version":"bb836f3e3bb9cff93ea6cd392b5fcb88aae3d664d7c09171e6ffacc2f0a44759","impliedFormat":99},{"version":"663757479ca123153d940314df55e939999c56e28b2b52f6c7c8a6f00b59a78e","impliedFormat":99},{"version":"02d5344b11cf703ffd698f1874f5298d855ae6a91c3a2d42c3d95b70c2f4e6f7","impliedFormat":99},{"version":"1db8be2061f286903f62930c719d46369a876340c2571ddc2cfa8b65e462001e","impliedFormat":99},{"version":"d6f8d517ec72c416556f8fae1280d2dc202cdf7bf00621827360bed778a8c19b","impliedFormat":99},{"version":"84c6f7ed4db89f3c5b300c81430eb633116492ca46951c6bb5dd45808c71810c","impliedFormat":99},{"version":"3801017d48638edbf32c445143b804711d2bc1a2ef51f0dceb25fe8a5b591bd5","impliedFormat":99},{"version":"2d5537810389a683449de9b0896ca4b130b93a339d8d72836649f08cebd17f1d","impliedFormat":99},{"version":"900fd868eedf9974863b2cc58d7aee9e7730fed6c7787329c66f02ead215f307","impliedFormat":99},{"version":"558d19d1b6743e92b564bfbf3edf3501ed8bdb2d090181b4fe5003b884694c38","impliedFormat":99},{"version":"2dbd8d1b3b34d8ba5f3c9fb13253d08f3b07fc1710138824011f858907e1670c","impliedFormat":99},{"version":"9ac492280c55460036216dacf01dbe5148e3965aa4372b5fdc3edab7f4c49203","impliedFormat":99},{"version":"657b6b8b5d76a9fc986b9330495f3b4fbb9c7b34c271e53deda88eaa8973cfb2","impliedFormat":99},{"version":"17a97fa195741417d6a71aee84fcedf034cbcaa861a61da46fb6e721ce7ae2e0","impliedFormat":99},{"version":"b2051cf12a3afba968a368f700d1b845824955d478807229b25560ceb55abfdc","impliedFormat":99},{"version":"ee2f8c4790ef349e7777b3faaf599823e82e3e59a4bfc2c67c3e1775d3bee50c","impliedFormat":99},{"version":"8effb19bf88f12addeb45df0c5d05e0f6464612d3d6b34f1da8ca8c2c1c5cc12","impliedFormat":99},{"version":"56aaa79117a6b4b58caac3c352370dfac66540c34356b2a0862841c3f6d30db7","impliedFormat":99},{"version":"bec1c0e444418bd6b168ffb15b76b9441c761bb2d243c089fa6ea378b2cc72ef","impliedFormat":99},{"version":"f6655a2e1d991e617b3695cb250f9a997ad09620c5399cb8de06fd685d3643d3","impliedFormat":99},{"version":"5c7d1b8744a3c63cb23db59258fcee28ef638307c6862f51572805162a851b51","impliedFormat":99},{"version":"448a88c8e7eda3d8999b7022cfe4dbd1cf586e71e21e999bdbbcdd436ac58b8d","impliedFormat":99},{"version":"7fcabc4baa02f69019cbf2b48048fd9454a8b7c0c83c776ed9d92bf53df14d6a","impliedFormat":99},{"version":"ceec50190a9d3d13a8500a8e1d1b6f8f5a3f6be45dc8e9f983530d84dbd69cd7","impliedFormat":99},{"version":"42b9d795a3152c6bb0f641da28297b91d5424cdbe936952ad18c20f501bed1f0","impliedFormat":99},{"version":"37488fdc6ffd2d40cb049ddab8ba198c8e887dfe77510c6c83efb6de34e2fe68","impliedFormat":99},{"version":"af582471a53417da3ef5d56ae772d08eaee896dba489a77fb76428f2c0116ea2","impliedFormat":99},{"version":"661b89ea587a659596859486a0123a631c34b5057993284d60ef9b87c015797f","impliedFormat":99},{"version":"0e6f5d456e1b73ad322c4b0bdcf10b0f9a8a0b75414d5b9e00d9f561a43874df","impliedFormat":99},{"version":"8cabe28809e715b1e2633c3e849053c2b9e2449d311d2494df93baeffe7e713f","impliedFormat":99},{"version":"e72931e0fd3c01a2153527880a56b53a2fbbe198421809dc2a7c3a93ea74997f","impliedFormat":99},{"version":"b70eb8f22c1217715e2c34d1a83a75d5fa024c32b1aef4b7c4db3f98645cb395","impliedFormat":99},{"version":"fc86007838a8c03afea1015f1cc20a7aa55fab268c6f6314943289e3e85425cc","impliedFormat":99},{"version":"3a5b6c07dd61016f03d7d4b9b8714fc10e0ecfb2f358783449a6385b930409fd","impliedFormat":99},{"version":"0b70dc15cd46f0b2f0d705744aa3dc4798b87f5113589ca5e1a7053af8edc756","impliedFormat":99},{"version":"02eb91b64a184428de52c5a303bcbe0e7de5a878a74692ca1b777ddf336ca361","impliedFormat":99},{"version":"ae1fc7ed3c72167972acd4f771883d14dd13d635c3b585606218ea4f9f5662c9","impliedFormat":99},{"version":"f0e4cb01dc2ffb699d0d7e4f0f14208d1ba6e5cbc12a83afab2553a8729661fe","impliedFormat":99},{"version":"3608e6f20899db55d817ab7a76390aea19b8e3bf7cb4becb5f3b70b833db038f","impliedFormat":99},{"version":"434af61f55bf25916aba2d8abcec57ceeef35571daff914fe7b54aba771312c1","impliedFormat":99},{"version":"3f31fbb79cd50033ef517ce3296f511ba8654758609015026227740f4892e187","impliedFormat":99},{"version":"38977f661ec68bcec7c0087960fc6fb6d5addb7cd48da0e19d734b5f09e799b3","impliedFormat":99},{"version":"590a91fe582b89a9bad5b5b4d1a6d9747c5287f6e1b23a2a57d1aa60c1a23180","impliedFormat":99},{"version":"ef2c251603129991a413e295b5bce5d0ada22726bba363db26e563f9162d491f","impliedFormat":99},{"version":"42aa868d84ffa9aac2f5d08dbdfe6cb79436b96d227b836bd655159bbfddba5d","impliedFormat":99},{"version":"157a1f916813abf3e1faadae34279ee65110d7dc8146711240196ce0e46cbcec","impliedFormat":99},{"version":"7d0101529b77bd85692b2a831308a7534a478c60b95a1798c07e14d3a14e4b21","impliedFormat":99},{"version":"4a0d53890ed17ea582794de930248bb3a5a16547b9659f46664149a853f8b1ac","impliedFormat":99},{"version":"19ea1b64d140b3fb5d1b699b09f1aaa60ebf32014f6dee279b96d92ca662d871","impliedFormat":99},{"version":"b2d2ab3ab26f446cad62cc23ded652641a44deb9d19280550c74cc81c7cd4263","impliedFormat":99},{"version":"d3bb594337c7b16cd0aa2f54710afd9c5352f24d0ac83bf02a1efce7e731a0b4","impliedFormat":99},{"version":"9afee2d40467087a6aed46b5fef0548c2a1351d533f2aafc68cb47694a81f7c2","impliedFormat":99},{"version":"372c39fd10f96d006497fc2bf9d56d0a602119244ed46d087a2bd5bb037821d9","impliedFormat":99},{"version":"86aab19392ce35fbf19b7beb7968772b78380fb3962b020eab778e2060b68087","impliedFormat":99},{"version":"d9e8f082189fbcd24d1c13275aaffebaf48c9222d20654d61ad7082f6f2df101","impliedFormat":99},{"version":"8f2350543fe05a8d34952c3dae8f9781594751f5ef130384446a729e3dac7bff","impliedFormat":99},{"version":"cc27791842a8f54b24e8c3c631fe842f96421d257d0f7b636ba416f8ea454bc5","impliedFormat":99},{"version":"87622b9b115ff00fdcb1ad2e5c0f6064249dd577cd94140d2429aed76218195d","impliedFormat":99},{"version":"987a12239021ad858813841f22475f2a225d3333a2dfd9beb32222c9e2dc2505","impliedFormat":99},{"version":"ed3f6a7fbdb2e7d6bc2636b3f56c08ed34d2ba80ad3c4d30f03a8b12298ba100","impliedFormat":99},{"version":"f2b4e9551b694795727201a46b5b0d09383c6fc88966d3472aec3df1dab18074","impliedFormat":99},{"version":"ae868f126890affa478b4628684db9c084b00eaea3ac884ece0184e8f9b4041c","impliedFormat":99},{"version":"0aa2fc9a3936aaed64b486dc8efcbd6c62e0afad81ffd72be408cb97867c0b16","impliedFormat":99},{"version":"e0842052caa52cb6702d9dc7d3f90c799a6123e8509bb79465c14957e990b204","impliedFormat":99},{"version":"1caad517833757199ab3830587bca968433d3e1e485c518989e10a3b77f85b24","impliedFormat":99},{"version":"9087d62992fb955a421851106b0e8c815f3e24120b95c56e8373d384e273e0e5","impliedFormat":99},{"version":"7a5bcb70a2b1b72d52636ef8aed8b8c8a374067367667fcb8517e492f37329c3","impliedFormat":99},{"version":"ebdb84450ad6efa9a70dbb78f4c0f9a16888bd798eefc37f6cd04d2572206242","impliedFormat":99},{"version":"f93d43b0832bc9f5e6a3ec0358bfee8dc2f44f748278f3e6a073220844e78c78","impliedFormat":99},{"version":"29d83f8e43a87dc636d0e5764a89d45129c9a0f0f8abfa0e3a58e9a141cb66d8","impliedFormat":99},{"version":"30d463e7ce174f7a529d3a832711f424c984cf517c08f59dbcd2ccd5b16bb6ea","impliedFormat":99},{"version":"6767ab11a8cda8c0ac2ac7e2252bf7be2299410752049237a48d93c62a4a7195","impliedFormat":99},{"version":"21394e045094d440e762a0e3f8bf9b8b58ea9daa89e399d108ea2d6a3d80fb96","impliedFormat":99},{"version":"256cde5dd5a4f0ed7516ef587efd4bef006317e8daffc232974fac0efe47ecee","impliedFormat":99},{"version":"53c4229dc8cd2aa22a2c58537514818d429b6972555241f821cd7e1701c42d38","impliedFormat":99},{"version":"0fcffee63e98cf059b427289b97d6be2e49eafc9d3d19d8f527aefb0f28f047a","impliedFormat":99},{"version":"6745a82126e61c30cb5a8db54d35886159c53ac5a28f5a61d31fee282598f7c2","impliedFormat":99},{"version":"be768a2f53e62d96a980aa56e02861472f7e974862730dd12fa26cb4bc50e348","impliedFormat":99},{"version":"a33c25c4c281b8cd1967ce9f2d2ad451edce03a2254102365f3cdfbcf1b00d3f","impliedFormat":99},{"version":"1bc5d66f065f14c9c6290f6fe09492e60d30901737b68a1e344f2d61ed001e96","impliedFormat":99},{"version":"bf531fe3337bd1315f2dae65b2607363d05e5a862ea50a547702a4d950201094","impliedFormat":99},{"version":"fe896af05f06c4c6257fdc8e8cad8a278c90d4b38ff6b70efc5b5e3ecc880bb4","impliedFormat":99},{"version":"362db1b55e2006226b53ac79a8ddd5a12976bdd4531badad0ddff27b49817de2","impliedFormat":99},{"version":"c3ff132ac57ce2706280f9e145befc0e7ee6060caebb32ff3022e9c154575876","impliedFormat":99},{"version":"8c1e7fe0b90aeba2f3eab5fe6e5fd66e70ddb6cd998a1eda1c5cfdd6336ba94c","impliedFormat":99},{"version":"acf830a1733f75248a8fc2d3dcaff39c6e76f9ddf27c20ba09a584da138f46b9","impliedFormat":99},{"version":"89af4f75c1f204d678637102d01382e0b8b167e0b213a42a6fab2a64826e815d","impliedFormat":99},{"version":"cd8dd8ebf533d787130cd5371f8e7fc4403f94cdb2e0dc2e5acc4ae681091057","impliedFormat":99},{"version":"50d2f4d075114bd15852e0ae28244f897e8fb7109fdb4bb980cd0d3071ffa87e","impliedFormat":99},{"version":"fb29fb3a2e3247167f4e699f19b47cbbe02e3137794c48d08ef6140c13a82a13","impliedFormat":99},{"version":"5a211830f651041b3d3873533d8bd4afa01263306da8ca2fdc1e0e1d593caf93","impliedFormat":99},{"version":"00287f47a7a9ab63f5e218d1db19923519e6761a3ae2ba9222d2c38a21a4bb35","impliedFormat":99},{"version":"17f1776b27b2c29bebba486721f5d9319dd9b651b6e3be83de3fa216085e948e","impliedFormat":99},{"version":"21e8114b92a2d11e1f58e2be0a9c59e6d7a9d2fae4bcbed1353bfdea98043fae","impliedFormat":99},{"version":"7468715152819058c1a2a27ea8688a7ae51f9800f1273e0815a60b53a0c023ac","impliedFormat":99},{"version":"fcaaf555e60e7e4ae4b60408c7bb84c0ef61d656a4315bcb6589cae1c5ef7741","impliedFormat":99},{"version":"9192851be0a7d39b5599d1c5a22cd17343c9dac43cbcfed922809d311423c422","impliedFormat":99},{"version":"9ddf47eb87c7613d5a5bbb577fe6ce87dd34f2c7681dede0ab9fa1d6bcaa7242","impliedFormat":99},{"version":"57b00b8088284b7178fda7be8f5987d5edcdddfa10bd2f777c9910bbb7ac7e97","impliedFormat":99},{"version":"0244571048467de1c966215b7506b1a65f19594084b159e675f7d03bb4da4ea0","impliedFormat":99},{"version":"cf03afdf519792b0f8bcc22c984a5521c5d192c3f46b1caee9d645dc02cc076c","impliedFormat":99},{"version":"8ef260aeed7f688a8c40f0a3480e8e4ff4c1406b0afc44544a8d0087c9f80cd2","impliedFormat":99},{"version":"121a70198c504bdf22f901de9f5c4b2264e1c35ba4979c5126d8dbf91c08b011","impliedFormat":99},{"version":"500265f07d0faf96f8b04ee1c9e0a77a8e5e1ae07b075adf58105c05db2687ac","impliedFormat":99},{"version":"5eafb802b8483ae0fda85920af0802e633178c701f631ad85db80156054a3840","impliedFormat":99},{"version":"30c0d02586f80d0df6dde2b95d7f1769e1590e92bd13e4b798bdd840ae005797","impliedFormat":99},{"version":"41edc9dcb80ada08b64177bd4405650842e2e17f86f2ba905e5a7395b660c1f6","impliedFormat":99},{"version":"282c37fb44ceeb5bcfcf070f383314a1bc33b1c1f089f682f53e79b0bd90ce7b","impliedFormat":99},{"version":"87858dcdd2e39eb46633a5db6666f202258d0d0c2040a90e775010d92776c5c3","impliedFormat":99},{"version":"57d5f16d751884e0a2e97ef772d1a24f256dd1b82b35397041d91baa85e4bd93","impliedFormat":99},{"version":"d5851073cd5047ff38938d853a37c2d709d68a74017bd4df1010187f44541fa2","impliedFormat":99},{"version":"a6c6485b7c9ac65bb8147e2d6a43a49458edf99a3607fbb75c67f0a08f230fb2","impliedFormat":99},{"version":"979fa80f9aa7e1f015e0a019a28baed03f69924db612889d1899b62b4439f8b7","impliedFormat":99},{"version":"67cfa42620d86ad53914cfec05a9d8f90e43fb28fef9323275d25f6dde1d7790","impliedFormat":99},{"version":"f7f586cb700449ac509cc542095a01fa33d21eee19201ef3793abdc393a70ee7","impliedFormat":99},{"version":"08b4120029f17693ae31a695121c2a37fa1b7f98769aeaf4582ec7a7b25bb352","impliedFormat":99},{"version":"78138a90e0027ff8005665cb6375b94140b8050a120e6ff9a61515d439a15a62","impliedFormat":99},{"version":"acf24ed1b0a60dad01e526804173fa7593491db7826bd5f39a5af335786164be","impliedFormat":99},{"version":"7a1f228faa5fa5b29b96c1ad04293e310a20c22ec1b83b5adbd1ee306625ddb1","impliedFormat":99},{"version":"22d5c827159162dd95e53a3a67e0d84b61f08d549589ce83dc650ba2446e4055","impliedFormat":99},{"version":"7719c09b8acc28e6283481e3907a990b7f1e730f830ace38f57eb7cce753717e","impliedFormat":99},{"version":"54ee6720ce787300bf050b24224405696295d9e2f3f42da366a0b62758835451","impliedFormat":99},{"version":"8db5e7a47d3796b48afb5417f16e3c44c9784dffe6b0daca679e3faab69fbc28","impliedFormat":99},{"version":"2fd73846e6a7602ecbcfba95e7ae8c535340bdd49121ec0da552720bd8273e65","impliedFormat":99},{"version":"91a5549884a38ea6510c6b2b2bc3908d7aaa9d93982423635c6d70173002cbe1","impliedFormat":99},{"version":"94fde0116233179a8b9aff97f1c94a774abd836e257d5f43b77a52be83e47fb5","impliedFormat":99},{"version":"0953aa9d052d4e83a8fb3b88c304c420d44ee7e20d1b341ce91e214d06e96fc3","impliedFormat":99},{"version":"80dd0657da599ac1840dd2bb6787c7742bcb7efb1a7e95890a822dbb01ae9471","impliedFormat":99},{"version":"697929cc709ce1a14bfa22637796c90de5a7deac1afc32d703aed10cd148230b","impliedFormat":99},{"version":"a258c163f1cd5155ffdf6bf9334260cad50b42773f79e47c8b67f665f541d580","impliedFormat":99},{"version":"c2bff621d611a1cc7e0cbf6f8bb2e5fd99930b159d80bfc721bd6e2f3ac1af50","impliedFormat":99},{"version":"56e9483c87ffd60f3811152a21d9704384c6539b13fef717ddbf99c5d944c330","impliedFormat":99},{"version":"97cb603e7ca4203c5cf2402a88dc566e2fa1e2206d97016072066387ecf7087a","impliedFormat":99},{"version":"32f816bc6d64a56503bb2398846ba92f6e058d93a57ca8dba27790b8214fc88c","impliedFormat":99},{"version":"99c9b803342e29e16248f6d03fccbc88f202c57852c4ef2f8f37407965cfbb6a","impliedFormat":99},{"version":"9057244241137ab9d0f8e7b2419d26d6b5794c063ff2a390047ab733e17a84f6","impliedFormat":99},{"version":"8c9a39e52635167098f9a8f44fd15c2c93af92caac24dfabeb62975f11518aff","impliedFormat":99},{"version":"497306690b137169dba6d70af7b3db655ea7b115fa565f8a2d1d80675ddf00a8","impliedFormat":99},{"version":"0c46d7c267ba59b302512de340f4c92b97764eafd086c5b13477fedfa953385d","impliedFormat":99},{"version":"0f2e941fbb7fa25b52f407745686b2e905ec03225af1de5285dc8113cf9f38cc","impliedFormat":99},{"version":"a12f3295a92f365c2919a9b128984c35486282b7de8f3ff81fc360b8f137aaa5","impliedFormat":99},{"version":"38b3fcade0a4b61a87c8b6689f8434112bede7832ba491511aa83f519036d7c4","impliedFormat":99},{"version":"c326bb72f933aa18f366a29a27dfd4193749c4c077b0464bb31054134a84aa8b","impliedFormat":99},{"version":"0222992caad46191f90e9a5987e0c92ca95c5bb631f8f953e4c92b700411321e","impliedFormat":99},{"version":"fbb281974839d3fcc1fc0eb70b71f68688d9d2e3c719f7956f02ada2d03b0e2a","impliedFormat":99},{"version":"488bcf6a8b6a65669199f64f11c75102a11518759dc23f7d0bcb3257e830eab7","impliedFormat":99},{"version":"df38839fca3589013d3cd76564185ab4d19ce938593a27602cfd3e50f42424ab","impliedFormat":99},{"version":"c44f3421179cfb7ac73a38b1b9e1d5d229228327e0ede465d9d9a21c5039203d","impliedFormat":99},{"version":"b4d6ec77adcdc6728c52f2739954c7f5ae1c9598c5f0a6b8e3ae73989590e9d5","impliedFormat":99},{"version":"05718aee3a6d1193f2a4b1772a3ef60f1ebc0228a293b94c84a602fbec0ec5e0","impliedFormat":99},{"version":"b62e58a89eb8b818d7422360e5ef6f69038be1cdac57ae5fabe6f1060aa880dd","impliedFormat":99},{"version":"eb4c841c0bf793dd919904718220df9623006e90628e7e332b708239a5cd3c42","impliedFormat":99},{"version":"0dea1946e1a188dcefc1a78bd3e8d206b482bb0e34205c8bee073bcf9e9a81a8","impliedFormat":99},{"version":"57f207358f2409974d35d0c62cb39b0e2122d87f74314ac36f362a591b0eb02e","impliedFormat":99},{"version":"c9d4c7b66b4f74273a4cb6fff0b42833916c043a4cfa450a13a71ab3a261ad6c","impliedFormat":99},{"version":"943e697697e9e73676b145c331f114e733753cb920d08882f8db5faa841e0f41","impliedFormat":99},{"version":"3dc164317289da2ec08166baca1c10ca42b29fa2ea51d4b1769748c3c06d4da1","impliedFormat":99},{"version":"ca92a9ee21c608133d7c5d16e16936e072b6d48b5a7258736eacc19f76beac38","impliedFormat":99},{"version":"db6d9a3de83202ef18f6cabbb064362b6ec796fa5499e18e89cbbd1f22f81902","impliedFormat":99},{"version":"1bc55655e0c89b5d02451cdfd1d11595aa3b4c55ee829fe502ab352218ef6d1c","impliedFormat":99},{"version":"f8c341677219569376d0eb374bc9c8483c7d13a7d9ba7820ddd68aa188e641b6","impliedFormat":99},{"version":"6e8a8d10c8e40378dc5aa955218c5b4f374465eebc313adc4bafb69b9ad4d77d","impliedFormat":99},{"version":"51eb031a7f09d002181adb6a235a49b25995ab954e9f319b9edab0a8dc3f6e8e","impliedFormat":99},{"version":"3bc01a0f49b6a90662942f70139d9d44b8eaf2527ab95bdaf3a1a7d0383e65c2","impliedFormat":99},{"version":"1fc08a76433c326036f4b07b8eabb370f0e4b66429a17a940b2eadf82e4cd0c0","impliedFormat":99},{"version":"9d71b80f4dd663e7be4960a4b4fc48bdff4f1db34ffc9a3c01b3fa7de1ed2330","impliedFormat":99},{"version":"42670fd2d98fce7eaa84ddb1ba6a2bb6015df92db527913f869eb545d94e60f6","impliedFormat":99},{"version":"dcc306d9e63904256ba262f23cfa59fbfcef86f4caeb88835146164ca2a19bc3","impliedFormat":99},{"version":"18cee427b1962391970a74a31bbd4c150ab4bea0118dfa0ce9722fa276f1530b","impliedFormat":99},{"version":"d53ce1daa4010a2195a1710b2da24e464afc8f8b8dbe976ef3626a5a53e3042c","impliedFormat":99},{"version":"1ce643fded91c3a62f16ba0c7f5e607f68d5792a0282c57019aa64ce61df5c05","impliedFormat":99},{"version":"08b9b1b7f590e2b9dce12e29ef7cc0b0257a1aaea8d0fc2cd88233e36f716d5f","impliedFormat":99},{"version":"1e9201bf6f6968b3a2e05fa337b2d824a9de4f8a4fabb43d3a39def1bacc40b9","impliedFormat":99},{"version":"6a2b97a8d4f8d77bfde0ad800d2ca49f274fa0e25036645345168f033a8b559e","impliedFormat":99},{"version":"676ecc05abaf7e2a33686da7f5a998a8812fde2b4b42cb756b8ee63ef22dad55","impliedFormat":99},{"version":"cca1205cd000d7a9a19dda43d3bd5079ed8d70f81ad1f7d3912d2c4d68c19bcc","impliedFormat":99},{"version":"e98020ecd0cca8549262c22e1e566e35232e038650ab9dec76c4d9c343cd22c0","impliedFormat":99},{"version":"ca747835676df2aa94222860024b77a548e1c1507c3c4fafc25f2d92973f1c19","impliedFormat":99},{"version":"c024e4c849cbd9492e428f6f686d5d47c13f8b1978856abc0b11b758d26469d2","impliedFormat":99},{"version":"c392ac93c5e068db0465a6657921c5e7f191abd0b437b4a9c2adc36da94b0c74","impliedFormat":99},{"version":"479d563dabfecd2b14d7ec2537d3511c20d2a3440296fef7196edbb8b494d3dd","impliedFormat":99},{"version":"322131ab9e1654f5213c906962bc32778f54e7d535e82e2230b852d319ae8621","impliedFormat":99},{"version":"6f7065ce4d734d131e3d2c01210d511cff0e5fae015c31482b320a834825c448","impliedFormat":99},{"version":"247b3b8c56f8371ada220c9a9f6add3dfc4fdd2b9071bedb5ed419ea10940452","impliedFormat":99},{"version":"4a76d4e462ed14f907f9481cefebe4ceab9ac5c5b3aa4385c345d8a9f4cda619","impliedFormat":99},{"version":"b1f0deff4fe7bf2f0cb9c21e20be987cbb795315dcadac0b68d9e76c95966ca9","impliedFormat":99},{"version":"ef1a82d8c935053d44d6f528e058d05eef67ddb888eebc3a91834fdcbdba346d","impliedFormat":99},{"version":"eb97b7250139e59ed75255aef10fc86db69cd581bde7e22e6489b0b040f4c6e4","impliedFormat":99},{"version":"8b2c52cb91dcde62bbfa05daf76ba4da979808cd0e689320fc9762376b4ac6c3","impliedFormat":99},{"version":"9eb7631a1e210d6b0909ffc776eade0f1a70008574cbf9c3649168028bc563f1","impliedFormat":99},{"version":"6b88fe55b86bc79c7520b2679c7986923c71a5bc33854175955e31b5b9e6038b","impliedFormat":99},{"version":"069e31ae523cb318e9aae15f78260447ccd27bffa5f319f56489c0a416490eb0","impliedFormat":99},{"version":"1ff0faca356af9440189026e7ead9f4461af4109fff62c9508b8c0ed9a49ce68","impliedFormat":99},{"version":"0bcf85264f800550fdc97d3cb0ff2f8f7d75a943e01c6c15ec377f4b51bb5f02","impliedFormat":99},{"version":"b4f4fc24849f8b8f21fd31bc16d4057ef33af97e8e3cd57b247399ca506152cc","impliedFormat":99},{"version":"dcf64894451cde209d632119dec1e8fce24e4904b284b940d90435a92a2c6385","impliedFormat":99},{"version":"5aeb99822fa7426946e3a084fe3b60cf8d62b9a22399e3991be0826bf8928b8d","impliedFormat":99},{"version":"96880c28fb55d3330569b71bd61ef4d0af993ceaa9db5655becdcf6fb82b3489","impliedFormat":99},{"version":"68f1a4ec2937052ae0dd18407eb8d1b579708970ced79c6e7cfe4a93d0a00385","impliedFormat":99},{"version":"efe0fabfc89403ce6a4a8b1fe3a7633f1161b7e10d9824299560f2d15e4e606e","impliedFormat":99},{"version":"7967fa7a9f6773b95983f48e97e7035febdf1d68e9d6d076e21ea2616c206356","impliedFormat":99},{"version":"b49164adeeee1b545ec30cf015f23d0b6fc7f5721c5b81812cdf394140986ca7","impliedFormat":99},{"version":"39fdb2b6872a2169add72f5d44f397ea69374ea938c5343229e108f007253bf8","impliedFormat":99},{"version":"6bede1e3bc1902af03665eb6935d9619fe485fcb17df7fc647ee6ee74a802a9d","impliedFormat":99},{"version":"4c4cd7a14fe65ee08a34e47c43850496cc8ae8e7cc89ec8a2c8458ac4038ee4a","impliedFormat":99},{"version":"5d5e263808e7c276dd788f1a6ad27f227fd41741346dfa56c70dbe38f9fe6151","impliedFormat":99},{"version":"88a7b0cf5b7e0e2111357089b57302f06fa1b6227dfb0771d3f27a5e9d8dd9be","impliedFormat":99},{"version":"ef7c9468b5a48fa6b69b344224a00b9208ee59133e201e1e97a16c77863ab9af","impliedFormat":99},{"version":"6328ab8645c1d5bb6e8a6842d7948b10f2f3f604a3bb9d3a128323dcb6488d27","impliedFormat":99},{"version":"0eec40d2a72f5ffcd1186d8b777a22757bb5fc63725df49c17930cdc93863278","impliedFormat":99},{"version":"8f2dd4412647aea2f4051ec8b633ab31d777c9b818fc13ddb2b4bd3f14c6ab15","impliedFormat":99},{"version":"725790a23df77a71cb1aa042061abeebf5aca3adf564c3078c6f5bb925c8b8c6","impliedFormat":99},{"version":"5dda0fdf62bcaa5710d1ccd97adea53f875e01e854995e55488256ecba4f84a8","impliedFormat":99},{"version":"57c99c92a7d6b1874c36afbfc38f0a69f40821cb8e5a4c1fc949ab2d0ed9dc48","impliedFormat":99},{"version":"bf0b1e6c1bb4930244203a593c6db7aed456e635c31aba73ee2102c55998861f","impliedFormat":99},{"version":"684fed66904651fd676b78ec044da251651f4dfaedb163df74b2280013d5cd5f","impliedFormat":99},{"version":"1cad8abbc5f25133dea041deb44aa979498ee0b66e1ddc3d00f299e3629d4d6f","impliedFormat":99},{"version":"54dfbe6b81ce997409cc2c0bc37f492eeca1130ad5025e5b9148e857a8e34478","impliedFormat":99},{"version":"4bb6f54e837a952382d05afe37f3fea393c3908b14223cef578b882b00e9b31a","impliedFormat":99},{"version":"f7b3b183e6fbd30930c3e6bf7ce1953433c5cfce3142e1f0247fc4c6c26c5535","impliedFormat":99},{"version":"53c0d5e4b66e6f7fec9b79c3f776b85cd6be1e1d5d62bf57c63ecfde794ec6a5","impliedFormat":99},{"version":"7764e57eda6746e2ddab9b085a0fcb35d2c8ecee5d36759ae21c29038014a824","impliedFormat":99},{"version":"c3bd90fd93652ea125e8ba975bbd68d17f88ccacd0abd408fc2c64d1331a19cc","impliedFormat":99},{"version":"80e2f6580bb45d179d283cfac2863e94ad87c2ddce90e33dfab141ac4115379a","impliedFormat":99},{"version":"c2043b6cddf15439ba19f3293a7d8626ac8f31be86d9d8998c3323af94feeb8c","impliedFormat":99},{"version":"c3ce2db820d63c84554c94c5f929ef7786a4e4a7d61db6fac09bf2e85243e51a","impliedFormat":99},{"version":"8dfeb49bc8ac66938f09bc428ad4285975421bd18558604f0e098932dce8f9da","impliedFormat":99},{"version":"b7c1b2e00df8531e5e0d58efd255a2af435c1b68a04dc6214003a592b6fd5127","impliedFormat":99},{"version":"5d27a5d59ac05633bb38b263a713c2a2b15050dd6037f57efe7b897968778fb8","impliedFormat":99},{"version":"e61ec63942cec5365c27d711a3e47f0189aa2e8dff000f806a91e0a77aa36c10","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"0cd3d259f10d4a23a3d08d75a25160dc6782e75f44513f23f1e36fda7ca9df75","signature":"3ff1401d0cecf3a64b7d4102e48c03fafaac4122bba0e433516328960e80901e"},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},"2165468caad244c3eed37b304fa2a8023fbcad89f1d5f5c7f4c3619ffe92f832",{"version":"9aa8757a3653b462f0459a1af6d384ebb11ae740cebd6f447c53e0a982c74671","signature":"cf09a3fa5240d6d043bea225b3aa7d1216a1f01fa73e19b3d40b711b5c62ffdd"},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},"12b3c4b5cf0f53d8b75ed01673fa10734e0a06e80b57e424988d2b7cd11ba8da","50a31725c97f260da9a3c26a185509dd7c2c74dd905233b0f9befc06f03234af",{"version":"313ca047148bfa91a141d7af31a54fb4cf5ab0728cb793115e10aad04ae1d749","signature":"46e644fcc3450a48892553e217bb468d9225cabb97dc8a0f01d043a7a1927e3d"},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"37c7961117708394f64361ade31a41f96cef7f2a6606300821c72438dd4abda3","impliedFormat":1},{"version":"d519b53ae419dfdb7c9fa4406f15b4f9b75611a243b0880cf8d431e4dae26d97","affectsGlobalScope":true,"impliedFormat":1},{"version":"3d9189f26f01d4e36d3fb380810ef5999992235282e3c293da77d1d8aed09d9f","impliedFormat":1},{"version":"3787007c141f3168eddd3a2f0c1bc7518892336835811c8e1ca0dee48601f66e","impliedFormat":1},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"89121c1bf2990f5219bfd802a3e7fc557de447c62058d6af68d6b6348d64499a","impliedFormat":1},{"version":"79b4369233a12c6fa4a07301ecb7085802c98f3a77cf9ab97eee27e1656f82e6","impliedFormat":1},{"version":"2b37ba54ec067598bf912d56fcb81f6d8ad86a045c757e79440bdef97b52fe1b","impliedFormat":99},{"version":"1bc9dd465634109668661f998485a32da369755d9f32b5a55ed64a525566c94b","impliedFormat":99},{"version":"5702b3c2f5d248290ed99419d77ca1cc3e6c29db5847172377659c50e6303768","impliedFormat":99},{"version":"9764b2eb5b4fc0b8951468fb3dbd6cd922d7752343ef5fbf1a7cd3dfcd54a75e","impliedFormat":99},{"version":"1fc2d3fe8f31c52c802c4dee6c0157c5a1d1f6be44ece83c49174e316cf931ad","impliedFormat":99},{"version":"dc4aae103a0c812121d9db1f7a5ea98231801ed405bf577d1c9c46a893177e36","impliedFormat":99},{"version":"106d3f40907ba68d2ad8ce143a68358bad476e1cc4a5c710c11c7dbaac878308","impliedFormat":99},{"version":"42ad582d92b058b88570d5be95393cf0a6c09a29ba9aa44609465b41d39d2534","impliedFormat":99},{"version":"36e051a1e0d2f2a808dbb164d846be09b5d98e8b782b37922a3b75f57ee66698","impliedFormat":99},{"version":"d4a22007b481fe2a2e6bfd3a42c00cd62d41edb36d30fc4697df2692e9891fc8","impliedFormat":1},{"version":"9d62e577adb05f5aafed137e747b3a1b26f8dce7b20f350d22f6fb3255a3c0ed","impliedFormat":99},{"version":"7ed92bcef308af6e3925b3b61c83ad6157a03ff15c7412cf325f24042fe5d363","impliedFormat":99},{"version":"3da9062d0c762c002b7ab88187d72e1978c0224db61832221edc8f4eb0b54414","impliedFormat":99},{"version":"84dbf6af43b0b5ad42c01e332fddf4c690038248140d7c4ccb74a424e9226d4d","impliedFormat":99},{"version":"00884fc0ea3731a9ffecffcde8b32e181b20e1039977a8ae93ae5bce3ab3d245","impliedFormat":99},{"version":"0bd8b6493d9bf244afe133ccb52d32d293de8d08d15437cca2089beed5f5a6b5","impliedFormat":99},{"version":"7fc3099c95752c6e7b0ea215915464c7203e835fcd6878210f2ce4f0dcbbfe67","impliedFormat":99},{"version":"83b5499dbc74ee1add93aef162f7d44b769dcef3a74afb5f80c70f9a5ce77cc0","impliedFormat":99},{"version":"8bf8b772b38fc4da471248320f49a2219c363a9669938c720e0e0a5a2531eabf","impliedFormat":99},{"version":"7da6e8c98eacf084c961e039255f7ebb9d97a43377e7eee2695cb77fec640c66","impliedFormat":99},{"version":"0b5b064c5145a48cd3e2a5d9528c63f49bac55aa4bc5f5b4e68a160066401375","impliedFormat":99},{"version":"702ff40d28906c05d9d60b23e646c2577ad1cc7cd177d5c0791255a2eab13c07","impliedFormat":99},{"version":"49ff0f30d6e757d865ae0b422103f42737234e624815eee2b7f523240aa0c8f8","impliedFormat":99},{"version":"0389aacf0ffd49a877a46814a21a4770f33fc33e99951a1584de866c8e971993","impliedFormat":99},{"version":"5cb7a51cf151c1056b61f078cf80b811e19787d1f29a33a2a6e4bf00334bbc10","impliedFormat":99},{"version":"215aa8915d707f97ad511b7abbf7eda51d3a7048e9a656955cf0dda767ae7db0","impliedFormat":99},{"version":"0d689a717fbef83da07ab4de33f83db5cbcec9bc4e3b04edb106c538a50a0210","impliedFormat":99},{"version":"d00bc73e8d1f4137f2f6238bb3aa2bbdad8573658cc95920e2cdfa7ad491a8d8","impliedFormat":99},{"version":"e3667aa9f5245d1a99fb4a2a1ac48daf1429040c29cc0d262e3843f9ae3b9d65","impliedFormat":99},{"version":"08c0f3222b50ec2b534be1a59392660102549129246425d33ec43f35aa051dc6","impliedFormat":99},{"version":"612fb780f312e6bb3c40f3cb2b827ea7455b922198f651c799d844fdd44cf2e9","impliedFormat":99},{"version":"bcd98e8f44bc76e4fcb41e4b1a8bab648161a942653a3d1f261775a891d258de","impliedFormat":99},{"version":"5abaa19aa91bb4f63ea58154ada5d021e33b1f39aa026ca56eb95f13b12c497a","impliedFormat":99},{"version":"356a18b0c50f297fee148f4a2c64b0affd352cbd6f21c7b6bfa569d30622c693","impliedFormat":99},{"version":"5876027679fd5257b92eb55d62efee634358012b9f25c5711ad02b918e52c837","impliedFormat":99},{"version":"f5622423ee5642dcf2b92d71b37967b458e8df3cf90b468675ff9fddaa532a0f","impliedFormat":99},{"version":"70265bc75baf24ec0d61f12517b91ea711732b9c349fceef71a446c4ff4a247a","impliedFormat":99},{"version":"41a4b2454b2d3a13b4fc4ec57d6a0a639127369f87da8f28037943019705d619","impliedFormat":99},{"version":"e9b82ac7186490d18dffaafda695f5d975dfee549096c0bf883387a8b6c3ab5a","impliedFormat":99},{"version":"eed9b5f5a6998abe0b408db4b8847a46eb401c9924ddc5b24b1cede3ebf4ee8c","impliedFormat":99},{"version":"af85fde8986fdad68e96e871ae2d5278adaf2922d9879043b9313b18fae920b1","impliedFormat":99},{"version":"8a1f5d2f7cf4bf851cc9baae82056c3316d3c6d29561df28aff525556095554b","impliedFormat":99},{"version":"a5dbd4c9941b614526619bad31047ddd5f504ec4cdad88d6117b549faef34dd3","impliedFormat":99},{"version":"e87873f06fa094e76ac439c7756b264f3c76a41deb8bc7d39c1d30e0f03ef547","impliedFormat":99},{"version":"488861dc4f870c77c2f2f72c1f27a63fa2e81106f308e3fc345581938928f925","impliedFormat":99},{"version":"eff73acfacda1d3e62bb3cb5bc7200bb0257ea0c8857ce45b3fee5bfec38ad12","impliedFormat":99},{"version":"aff4ac6e11917a051b91edbb9a18735fe56bcfd8b1802ea9dbfb394ad8f6ce8e","impliedFormat":99},{"version":"1f68aed2648740ac69c6634c112fcaae4252fbae11379d6eabee09c0fbf00286","impliedFormat":99},{"version":"5e7c2eff249b4a86fb31e6b15e4353c3ddd5c8aefc253f4c3e4d9caeb4a739d4","impliedFormat":99},{"version":"14c8d1819e24a0ccb0aa64f85c61a6436c403eaf44c0e733cdaf1780fed5ec9f","impliedFormat":99},{"version":"d36518bd617ff673c7d9f372706f241932a43f27673187f2a8472e93c40041c6","impliedFormat":99},{"version":"f8eb2909590ec619643841ead2fc4b4b183fbd859848ef051295d35fef9d8469","impliedFormat":99},{"version":"fe784567dd721417e2c4c7c1d7306f4b8611a4f232f5b7ce734382cf34b417d2","impliedFormat":99},{"version":"45d1e8fb4fd3e265b15f5a77866a8e21870eae4c69c473c33289a4b971e93704","impliedFormat":99},{"version":"cd40919f70c875ca07ecc5431cc740e366c008bcbe08ba14b8c78353fb4680df","impliedFormat":99},{"version":"ddfd9196f1f83997873bbe958ce99123f11b062f8309fc09d9c9667b2c284391","impliedFormat":99},{"version":"2999ba314a310f6a333199848166d008d088c6e36d090cbdcc69db67d8ae3154","impliedFormat":99},{"version":"62c1e573cd595d3204dfc02b96eba623020b181d2aa3ce6a33e030bc83bebb41","impliedFormat":99},{"version":"ca1616999d6ded0160fea978088a57df492b6c3f8c457a5879837a7e68d69033","impliedFormat":99},{"version":"835e3d95251bbc48918bb874768c13b8986b87ea60471ad8eceb6e38ddd8845e","impliedFormat":99},{"version":"de54e18f04dbcc892a4b4241b9e4c233cfce9be02ac5f43a631bbc25f479cd84","impliedFormat":99},{"version":"453fb9934e71eb8b52347e581b36c01d7751121a75a5cd1a96e3237e3fd9fc7e","impliedFormat":99},{"version":"bc1a1d0eba489e3eb5c2a4aa8cd986c700692b07a76a60b73a3c31e52c7ef983","impliedFormat":99},{"version":"4098e612efd242b5e203c5c0b9afbf7473209905ab2830598be5c7b3942643d0","impliedFormat":99},{"version":"28410cfb9a798bd7d0327fbf0afd4c4038799b1d6a3f86116dc972e31156b6d2","impliedFormat":99},{"version":"514ae9be6724e2164eb38f2a903ef56cf1d0e6ddb62d0d40f155f32d1317c116","impliedFormat":99},{"version":"970e5e94a9071fd5b5c41e2710c0ef7d73e7f7732911681592669e3f7bd06308","impliedFormat":99},{"version":"491fb8b0e0aef777cec1339cb8f5a1a599ed4973ee22a2f02812dd0f48bd78c1","impliedFormat":99},{"version":"6acf0b3018881977d2cfe4382ac3e3db7e103904c4b634be908f1ade06eb302d","impliedFormat":99},{"version":"2dbb2e03b4b7f6524ad5683e7b5aa2e6aef9c83cab1678afd8467fde6d5a3a92","impliedFormat":99},{"version":"135b12824cd5e495ea0a8f7e29aba52e1adb4581bb1e279fb179304ba60c0a44","impliedFormat":99},{"version":"e4c784392051f4bbb80304d3a909da18c98bc58b093456a09b3e3a1b7b10937f","impliedFormat":99},{"version":"2e87c3480512f057f2e7f44f6498b7e3677196e84e0884618fc9e8b6d6228bed","impliedFormat":99},{"version":"66984309d771b6b085e3369227077da237b40e798570f0a2ddbfea383db39812","impliedFormat":99},{"version":"e41be8943835ad083a4f8a558bd2a89b7fe39619ed99f1880187c75e231d033e","impliedFormat":99},{"version":"260558fff7344e4985cfc78472ae58cbc2487e406d23c1ddaf4d484618ce4cfd","impliedFormat":99},{"version":"413d50bc66826f899c842524e5f50f42d45c8cb3b26fd478a62f26ac8da3d90e","impliedFormat":99},{"version":"d9083e10a491b6f8291c7265555ba0e9d599d1f76282812c399ab7639019f365","impliedFormat":99},{"version":"09de774ebab62974edad71cb3c7c6fa786a3fda2644e6473392bd4b600a9c79c","impliedFormat":99},{"version":"e8bcc823792be321f581fcdd8d0f2639d417894e67604d884c38b699284a1a2a","impliedFormat":99},{"version":"7c99839c518dcf5ab8a741a97c190f0703c0a71e30c6d44f0b7921b0deec9f67","impliedFormat":99},{"version":"44c14e4da99cd71f9fe4e415756585cec74b9e7dc47478a837d5bedfb7db1e04","impliedFormat":99},{"version":"1f46ee2b76d9ae1159deb43d14279d04bcebcb9b75de4012b14b1f7486e36f82","impliedFormat":99},{"version":"2838028b54b421306639f4419606306b940a5c5fcc5bc485954cbb0ab84d90f4","impliedFormat":99},{"version":"7116e0399952e03afe9749a77ceaca29b0e1950989375066a9ddc9cb0b7dd252","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},"618d88deb6fa2d8e19c89c83b6bb160f3a1f3de80b9e78902027e446b5014117","b75dc867e65093746082ddc59e13483be35c60ed336ee80fde8d3d9070eb0e92","990bc8949a497a61a5ee5702557c99ade4f80e51f5e08d03f58c82b0726bfc50",{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},"38a08d8977ff3f9111720a31c01449040d2574d77c5890cc77841e1d35497ff9","e5d55cc726a8a953da863bb577a0626319ab927b2821b80e524920750c743db3",{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},"a9b4296e49ec4a0d5f807884b3a2cefc529a4c7c795de9e2b46ec8a5403743af",{"version":"f67de8039badd18bce93f6baa5a008856e0d6dbe2280c37136455d4bed6346b3","signature":"844b87eab63d55e82693c996c6271c7c3679a5dc878a8ed89fe4374caac0f627"},{"version":"e0b1cf599cf295a63589f3575b139598b41525e650313c94fac95dd7a74f2fb8","signature":"34901c6f20e02c708487cbf1485cef43b52b3d3dda20386e0d4c35151e23bd17"},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"a2e5868416b88203f139bdb6020caa8f788043f4c3e570d109e2633407d80bd4","signature":"335521b83fc375a26ad87fbeabd64267093aa63d75a7c73ecd138856aa91baa4"},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"ceb88e0114c2e972422d9c1a2807da278f2475bcba6e2c4b0dea1fce38a5d28a","signature":"69c4227dccee304e15ea1ffc12d58bc1e7acf904c1dca7c02031c5a024ef73f4"},{"version":"b55677bbdb6b7297e80b8438b15e807ccef6fce8f51b6deb9212def21374e3cf","signature":"236b0bba42b31e64875af7a0f19f9fb4745402678ac7281a7967b55306ccbbd1"},{"version":"feb58f24bf98c8fb14eed41db94ca1434aa146f3c6686c68d43731943b7418c9","signature":"3ccc601af5d2a5bb0812bc4bd1b5b9be6d1a00863a7b04e0cd23d3ead998176b"},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"6a8860221043016b3dc2aa98c96bf6214cf6b5f72af0302b864d9b630bd41089","signature":"cba7c4c924ac1767043ff386964d72e845c25eba0cde2f71740f1b5bf24dcdbd"},"0290d5402f37c7a1bd424e990ac43d7f4657489875f70b016d78b2a598ec7442",{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"f6f39c055c1b2dec6dbb06cc89a75f0444efb4b09c972aa049084b6dc7c89746","signature":"31583c69f61c4a499d3b608abe09b334861b4b2af59ff3737292cb6dccd47b41"},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"ba6efe7a6b73ea3211dac001f61baf319d46f2999d08b9737a219da3da85567d","signature":"4d639abf3ff796dfba8ba2152a9dd5bae72d204971ba9b46e78b4e5d3a1fa1b0"},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"0b4dfa930900495c64a4a5102032c93f569a822e0800bc823652cfce0e952925","signature":"313c717ac8363b2f8fad041c6d9e3602023d2cecccd5a5d78216a19310c23e9b"},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"a58c7c135cc796312a23a59706a1239ab1b62b07f1d896faddbc9a70adf8cc98","signature":"73d30b22f0069c3fce4293cc8ebaa55f72efa470dab1cd257a4c698a042214a2"},{"version":"f6c9a2b758a7eae536427c4b602d675c9d8b7855b2ea5ecfe3894bfbaca0e0c0","signature":"30fa44558bfd7ebaf45bd26e72be535a174aecb8285dbc25555380931791d601"},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},"fb6cb92624a71d3c6f9ae1e1bd100062b6ef2ef7375a88d2b3cd66552c262314",{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},"42d00c1edd006dc836e08da63459b2772e30e4e9db0fdddc7a30ef94ae0414d3",{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},"449a2fba673619c80e6ff2328ddda1f8f2d89c4ecadff375fc3975444397174d","9cb4e67644a537160e8cd1e71d1232cf2d3b07a90bd4541d6e4d41105babf13a",{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"6a77b81315c75678b8c8d7de0e1c3b7d39f0ec7522598691803015e814663d0c","signature":"8343fba056c21a050dfd5a506e7459068c1ef6f429a2a72cbe8e9193a3f5faeb"},"da2b672bd0a6ffd30af489f3cd3fbcad8dc577a01656db8ce6875ae8b77a9ffc","4975152ef204206c9d1fa05c84fad9da69daa95561f084520b57dc0a384aeb6b",{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},"3e6b9dd057a0b1b4d375fc94cb8fe8bca11a6f25d9cc7c1288bd856ce8afc79e",{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"ec23f00161009682ce88521800f20bdc0eea1b666299fc8bcd65610ae424ac01","signature":"d713b7d242c18d1ebcf857fb093e109746fc4bb0fb855de123833aa0d4b753d9"},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"97e0a23ac45763f990b704b66cabbb48df07eddc5bf46054a34d72e350f1088e","impliedFormat":99},{"version":"fe9dd679e568dc2a0e5e6959f77b53f8bc1f126d46b0d17631347ba57470b808","impliedFormat":99},{"version":"86245b010961138b1c4ce2e0610b8b9577157dac3f7eeaf3d20017ee01e7760b","impliedFormat":99},{"version":"126eac20336c7374782d571be802e7b7adb9fc5b24c0dd0dfc37bfc9774d9182","impliedFormat":99},{"version":"760c9ccae9612ff1cd7d39c6eb7cdf913ca528a7f89afeee33f6759d62715e43","impliedFormat":99},{"version":"54e76a6612d9b83fde2b1cc0569f20c5b8d38f7a860b88a1d9d805399bfeead3","impliedFormat":99},{"version":"5a4ddf80b1bdab540fe5d3f837921e9e8dc559a1a319e75451c30f0d5f62ac0f","impliedFormat":99},{"version":"0c6ef3deba595b7dc7b4ee09342435c7a2392fe7752e335acdedfe2476529638","impliedFormat":99},{"version":"00fab36b3130e6d7a2316d0583a2e2a4d328a6f4e01817d90d8b07baad69b4e1","impliedFormat":99},{"version":"9001790195bf5cf382c676ded6da44833812e677bb9f31fcb22fa47d389039f4","impliedFormat":99},{"version":"e9549a400fa6ed33871effcd70b9bc5ab77f24ecc6349c97d8da7ae078e6a25a","impliedFormat":99},{"version":"0007221ceab1fe355d6dbbdf4bb71cad7584ffe9794ab152a1c68a921f2408ca","impliedFormat":99},{"version":"dd7928e76087e0bb029074c20675aeb38eff85513d5f941f440c26d82dd5436c","impliedFormat":99},{"version":"b35f88c4ae41d4b085da718dde3ddff0b176337470275fee82ad0aa84858db07","impliedFormat":99},{"version":"626e531e56621998a9d6488eb25c93f4091fd7a5484724458925b1ef0982a778","impliedFormat":99},{"version":"c9f54e8d99ecfb65a99b9ee67a7fce1295edc57ee9332f6c8bf7fdef1dc0c57b","signature":"0bee72b5ccff3d68eb267b5c8409915740816b381312b1a51915cf8aed7264cc"},"2bbdc3faeb438b0ceaa66a7913b11428fcd6086152ab72c06884c8a500ada603","7f1ca600a24602def60bf42700f0d85a1b84cb5aaaba9305cb73774d61ce294a","f8f51fe7ef6e782ca3f865b6b68f5aa2017a9d9e4f8b199db2cc4435aba15ba4",{"version":"ea4a34fd70b800da3df6fe7f88927fb9f0d79a0318075f5c91922687997ebe79","signature":"3bdb42fa5fa90c8d2ffa9e9e9b93d78e830082ae40236f8de308142f51346c12"},{"version":"3649c5211bd876ed484183b86db4f0d5314be64d707bda3d1b80132fe1e6b6ef","signature":"5cfb0884787a1a06e5afd468dc94fea17ca4b3ab36bfc4c4ee33d51cb6592a02"},"b4fec866aa0ea4289e716354a29227ed9d840c4d59293dd23e587cc4dfb50d9f","ddb76d82cbdb29d8dbedbc72835ebcade5f6797d9d53e7b8fd5c39b1cc681ae4",{"version":"7c7c8c7ac9c9bc8ec47884c5072a9f75dd62a50a4ceafd26e7ba6d1d64f4be17","signature":"035a7b50fd06db685e8942577262e78b229338dc46712109e58d0c5442c3254e"},{"version":"2d30d4dd0291d7c301276ddcb21e17bb35e6219971cb38d337d8c6f1d43003b4","signature":"82bd056c327227a7a4cef136ab9d08f086ee1d1a4c843127d1d7535ee6ddaee3"},{"version":"b79b9ac24cf51475b92378868b8c4c5637e18712232d9c5215d39a9e3a7101a9","signature":"687a79c4110f548c1526750e9d41835bf6f2a8d571ede5d2ff751a642e26616d"},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ccdaa19852d25ecd84eec365c3bfa16e7859cadecf6e9ca6d0dbbbee439743f","affectsGlobalScope":true,"impliedFormat":1},{"version":"438b41419b1df9f1fbe33b5e1b18f5853432be205991d1b19f5b7f351675541e","affectsGlobalScope":true,"impliedFormat":1},{"version":"096116f8fedc1765d5bd6ef360c257b4a9048e5415054b3bf3c41b07f8951b0b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5e01375c9e124a83b52ee4b3244ed1a4d214a6cfb54ac73e164a823a4a7860a","affectsGlobalScope":true,"impliedFormat":1},{"version":"f90ae2bbce1505e67f2f6502392e318f5714bae82d2d969185c4a6cecc8af2fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b58e207b93a8f1c88bbf2a95ddc686ac83962b13830fe8ad3f404ffc7051fb4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1fefabcb2b06736a66d2904074d56268753654805e829989a46a0161cd8412c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"c18a99f01eb788d849ad032b31cafd49de0b19e083fe775370834c5675d7df8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"5247874c2a23b9a62d178ae84f2db6a1d54e6c9a2e7e057e178cc5eea13757fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"487b694c3de27ddf4ad107d4007ad304d29effccf9800c8ae23c2093638d906a","impliedFormat":1},{"version":"3a80bc85f38526ca3b08007ee80712e7bb0601df178b23fbf0bf87036fce40ce","impliedFormat":1},{"version":"ccf4552357ce3c159ef75f0f0114e80401702228f1898bdc9402214c9499e8c0","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"2931540c47ee0ff8a62860e61782eb17b155615db61e36986e54645ec67f67c2","impliedFormat":1},{"version":"ccab02f3920fc75c01174c47fcf67882a11daf16baf9e81701d0a94636e94556","impliedFormat":1},{"version":"f6faf5f74e4c4cc309a6c6a6c4da02dbb840be5d3e92905a23dcd7b2b0bd1986","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"33e981bf6376e939f99bd7f89abec757c64897d33c005036b9a10d9587d80187","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"b41767d372275c154c7ea6c9d5449d9a741b8ce080f640155cc88ba1763e35b3","impliedFormat":1},{"version":"3bacf516d686d08682751a3bd2519ea3b8041a164bfb4f1d35728993e70a2426","impliedFormat":1},{"version":"7fb266686238369442bd1719bc0d7edd0199da4fb8540354e1ff7f16669b4323","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"5b03a034c72146b61573aab280f295b015b9168470f2df05f6080a2122f9b4df","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"54c3e2371e3d016469ad959697fd257e5621e16296fa67082c2575d0bf8eced0","impliedFormat":1},{"version":"beb8233b2c220cfa0feea31fbe9218d89fa02faa81ef744be8dce5acb89bb1fd","impliedFormat":1},{"version":"c183b931b68ad184bc8e8372bf663f3d33304772fb482f29fb91b3c391031f3e","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"48cc3ec153b50985fb95153258a710782b25975b10dd4ac8a4f3920632d10790","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"e1528ca65ac90f6fa0e4a247eb656b4263c470bb22d9033e466463e13395e599","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"866078923a56d026e39243b4392e282c1c63159723996fa89243140e1388a98d","impliedFormat":1},{"version":"c3f5289820990ab66b70c7fb5b63cb674001009ff84b13de40619619a9c8175f","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3275d55fac10b799c9546804126239baf020d220136163f763b55a74e50e750","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa68a0a3b7cb32c00e39ee3cd31f8f15b80cac97dce51b6ee7fc14a1e8deb30b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c36e755bced82df7fb6ce8169265d0a7bb046ab4e2cb6d0da0cb72b22033e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a93de4ff8a63bafe62ba86b89af1df0ccb5e40bb85b0c67d6bbcfdcf96bf3d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"90e85f9bc549dfe2b5749b45fe734144e96cd5d04b38eae244028794e142a77e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0a5deeb610b2a50a6350bd23df6490036a1773a8a71d70f2f9549ab009e67ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"435b3711465425770ed2ee2f1cf00ce071835265e0851a7dc4600ab4b007550e","impliedFormat":1},{"version":"7e49f52a159435fc8df4de9dc377ef5860732ca2dc9efec1640531d3cf5da7a3","impliedFormat":1},{"version":"dd4bde4bdc2e5394aed6855e98cf135dfdf5dd6468cad842e03116d31bbcc9bc","impliedFormat":1},{"version":"4d4e879009a84a47c05350b8dca823036ba3a29a3038efed1be76c9f81e45edf","affectsGlobalScope":true,"impliedFormat":1},{"version":"237ba5ac2a95702a114a309e39c53a5bddff5f6333b325db9764df9b34f3502b","impliedFormat":1},{"version":"9ba13b47cb450a438e3076c4a3f6afb9dc85e17eae50f26d4b2d72c0688c9251","impliedFormat":1},{"version":"b64cd4401633ea4ecadfd700ddc8323a13b63b106ac7127c1d2726f32424622c","impliedFormat":1},{"version":"37c6e5fe5715814412b43cc9b50b24c67a63c4e04e753e0d1305970d65417a60","impliedFormat":1},{"version":"1d024184fb57c58c5c91823f9d10b4915a4867b7934e89115fd0d861a9df27c8","impliedFormat":1},{"version":"ee0e4946247f842c6dd483cbb60a5e6b484fee07996e3a7bc7343dfb68a04c5d","impliedFormat":1},{"version":"ef051f42b7e0ef5ca04552f54c4552eac84099d64b6c5ad0ef4033574b6035b8","impliedFormat":1},{"version":"853a43154f1d01b0173d9cbd74063507ece57170bad7a3b68f3fa1229ad0a92f","impliedFormat":1},{"version":"56231e3c39a031bfb0afb797690b20ed4537670c93c0318b72d5180833d98b72","impliedFormat":1},{"version":"5cc7c39031bfd8b00ad58f32143d59eb6ffc24f5d41a20931269011dccd36c5e","impliedFormat":1},{"version":"b0b69c61b0f0ec8ca15db4c8c41f6e77f4cacb784d42bca948f42dea33e8757e","affectsGlobalScope":true,"impliedFormat":1},{"version":"f96a48183254c00d24575401f1a761b4ce4927d927407e7862a83e06ce5d6964","impliedFormat":1},{"version":"cc25940cfb27aa538e60d465f98bb5068d4d7d33131861ace43f04fe6947d68f","impliedFormat":1},{"version":"f83fb2b1338afbb3f9d733c7d6e8b135826c41b0518867df0c0ace18ae1aa270","impliedFormat":1},{"version":"01ff95aa1443e3f7248974e5a771f513cb2ac158c8898f470a1792f817bee497","impliedFormat":1},{"version":"757227c8b345c57d76f7f0e3bbad7a91ffca23f1b2547cbed9e10025816c9cb7","impliedFormat":1},{"version":"42a05d8f239f74587d4926aba8cc54792eed8e8a442c7adc9b38b516642aadfe","impliedFormat":1},{"version":"5d21b58d60383cc6ab9ad3d3e265d7d25af24a2c9b506247e0e50b0a884920be","impliedFormat":1},{"version":"101f482fd48cb4c7c0468dcc6d62c843d842977aea6235644b1edd05e81fbf22","impliedFormat":1},{"version":"ae6757460f37078884b1571a3de3ebaf724d827d7e1d53626c02b3c2a408ac63","affectsGlobalScope":true,"impliedFormat":1},{"version":"9451a46a89ed209e2e08329e6cac59f89356eae79a7230f916d8cc38725407c7","impliedFormat":1},{"version":"3ef397f12387eff17f550bc484ea7c27d21d43816bbe609d495107f44b97e933","impliedFormat":1},{"version":"1023282e2ba810bc07905d3668349fbd37a26411f0c8f94a70ef3c05fe523fcf","impliedFormat":1},{"version":"b214ebcf76c51b115453f69729ee8aa7b7f8eccdae2a922b568a45c2d7ff52f7","impliedFormat":1},{"version":"429c9cdfa7d126255779efd7e6d9057ced2d69c81859bbab32073bad52e9ba76","impliedFormat":1},{"version":"e236b5eba291f51bdf32c231673e6cab81b5410850e61f51a7a524dddadc0f95","impliedFormat":1},{"version":"f7ba0e839daa0702e3ff1a1a871c0d8ea2d586ce684dd8a72c786c36a680b1d9","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f2c62938251b45715fd2a9887060ec4fbc8724727029d1cbce373747252bdd7","impliedFormat":1},{"version":"e3ace08b6bbd84655d41e244677b474fd995923ffef7149ddb68af8848b60b05","impliedFormat":1},{"version":"132580b0e86c48fab152bab850fc57a4b74fe915c8958d2ccb052b809a44b61c","impliedFormat":1},{"version":"af4ab0aa8908fc9a655bb833d3bc28e117c4f0e1038c5a891546158beb25accb","impliedFormat":1},{"version":"69c9a5a9392e8564bd81116e1ed93b13205201fb44cb35a7fde8c9f9e21c4b23","impliedFormat":1},{"version":"5f8fc37f8434691ffac1bfd8fc2634647da2c0e84253ab5d2dd19a7718915b35","impliedFormat":1},{"version":"5981c2340fd8b076cae8efbae818d42c11ffc615994cb060b1cd390795f1be2b","impliedFormat":1},{"version":"f64deb26664af64dc274637343bde8d82f930c77af05a412c7d310b77207a448","impliedFormat":1},{"version":"ed4f674fc8c0c993cc7e145069ac44129e03519b910c62be206a0cc777bdc60b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0250da3eb85c99624f974e77ef355cdf86f43980251bc371475c2b397ba55bcd","impliedFormat":1},{"version":"f1c93e046fb3d9b7f8249629f4b63dc068dd839b824dd0aa39a5e68476dc9420","impliedFormat":1},{"version":"3d3a5f27ffbc06c885dd4d5f9ee20de61faf877fe2c3a7051c4825903d9a7fdc","impliedFormat":1},{"version":"12806f9f085598ef930edaf2467a5fa1789a878fba077cd27e85dc5851e11834","impliedFormat":1},{"version":"17d06eb5709839c7ce719f0c38ada6f308fb433f2cd6d8c87b35856e07400950","impliedFormat":1},{"version":"a43fe41c33d0a192a0ecaf9b92e87bef3709c9972e6d53c42c49251ccb962d69","impliedFormat":1},{"version":"a177959203c017fad3ecc4f3d96c8757a840957a4959a3ae00dab9d35961ca6c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc727ccf9b36e257ff982ea0badeffbfc2c151802f741bddff00c6af3b784cf","impliedFormat":1},{"version":"2a00d005e3af99cd1cfa75220e60c61b04bfb6be7ca7453bfe2ef6cca37cc03c","impliedFormat":1},{"version":"4844a4c9b4b1e812b257676ed8a80b3f3be0e29bf05e742cc2ea9c3c6865e6c6","impliedFormat":1},{"version":"064878a60367e0407c42fb7ba02a2ea4d83257357dc20088e549bd4d89433e9c","impliedFormat":1},{"version":"14d4bd22d1b05824971b98f7e91b2484c90f1a684805c330476641417c3d9735","impliedFormat":1},{"version":"c3877fef8a43cd434f9728f25a97575b0eb73d92f38b5c87c840daccc3e21d97","impliedFormat":1},{"version":"b484ec11ba00e3a2235562a41898d55372ccabe607986c6fa4f4aba72093749f","impliedFormat":1},{"version":"1dbd83860e7634f9c236647f45dbc5d3c4f9eba8827d87209d6e9826fdf4dbd5","impliedFormat":1},{"version":"41ef7992c555671a8fe54db302788adefa191ded810a50329b79d20a6772d14c","impliedFormat":1},{"version":"041a7781b9127ab568d2cdcce62c58fdea7c7407f40b8c50045d7866a2727130","impliedFormat":1},{"version":"b37f83e7deea729aa9ce5593f78905afb45b7532fdff63041d374f60059e7852","impliedFormat":1},{"version":"e1cb68f3ef3a8dd7b2a9dfb3de482ed6c0f1586ba0db4e7d73c1d2147b6ffc51","impliedFormat":1},{"version":"55cdbeebe76a1fa18bbd7e7bf73350a2173926bd3085bb050cf5a5397025ee4e","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"f9e22729fa06ed20f8b1fe60670b7c74933fdfd44d869ddfb1919c15a5cf12fb","impliedFormat":1},{"version":"d34aa8df2d0b18fb56b1d772ff9b3c7aea7256cf0d692f969be6e1d27b74d660","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"6823ccc7b5b77bbf898d878dbcad18aa45e0fa96bdd0abd0de98d514845d9ed9","affectsGlobalScope":true,"impliedFormat":1},{"version":"689be50b735f145624c6f391042155ae2ff6b90a93bac11ca5712bc866f6010c","impliedFormat":1},{"version":"fb893a0dfc3c9fb0f9ca93d0648694dd95f33cbad2c0f2c629f842981dfd4e2e","impliedFormat":1},{"version":"3eb11dbf3489064a47a2e1cf9d261b1f100ef0b3b50ffca6c44dd99d6dd81ac1","impliedFormat":1},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"a4a39b5714adfcadd3bbea6698ca2e942606d833bde62ad5fb6ec55f5e438ff8","impliedFormat":1},{"version":"bbc1d029093135d7d9bfa4b38cbf8761db505026cc458b5e9c8b74f4000e5e75","impliedFormat":1},{"version":"1f68ab0e055994eb337b67aa87d2a15e0200951e9664959b3866ee6f6b11a0fe","impliedFormat":1},{"version":"5d08a179b846f5ee674624b349ebebe2121c455e3a265dc93da4e8d9e89722b4","impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"cb90077223cc1365fa21ef0911a1f9b8f2f878943523d97350dc557973ca3823","impliedFormat":1},{"version":"18f1541b81b80d806120a3489af683edfb811deb91aeca19735d9bb2613e6311","impliedFormat":1},{"version":"90407bbaa24977b8a6a90861148ac98d8652afe69992a90d823f29e9807fe2d7","affectsGlobalScope":true,"impliedFormat":1},{"version":"232f118ae64ab84dcd26ddb60eaed5a6e44302d36249abf05e9e3fc2cbb701a2","impliedFormat":1},{"version":"b2d0630483bf337ef9dac326c3334a245aa4946e9f60f12baf7da5be44beafbb","impliedFormat":1},{"version":"ee65fe452abe1309389c5f50710f24114e08a302d40708101c4aa950a2a7d044","impliedFormat":1},{"version":"26b7d0cd4b41ab557ef9e3bfeec42dcf24252843633e3d29f38d2c0b13aaa528","impliedFormat":1},{"version":"7fadb2778688ebf3fd5b8d04f63d5bf27a43a3e420bc80732d3c6239067d1a4b","impliedFormat":1},{"version":"916be7d770b0ae0406be9486ac12eb9825f21514961dd050594c4b250617d5a8","impliedFormat":1},{"version":"e85d04f57b46201ddc8ba238a84322432a4803a5d65e0bbd8b3b4f05345edd51","impliedFormat":1},{"version":"fd624f7d7b264922476685870f08c5e1c6d6a0f05dee2429a9747b41f6b699d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"7233cac35711f43b7493061d2fe7636deb6d14f8cb58e4b3ff248be46f0b543d","impliedFormat":1},{"version":"3cef134032da5e1bfabba59a03a58d91ed59f302235034279bb25a5a5b65ca62","affectsGlobalScope":true,"impliedFormat":1},{"version":"199f9ead0daf25ae4c5632e3d1f42570af59685294a38123eef457407e13f365","impliedFormat":1},{"version":"ddef25f825320de051dcb0e62ffce621b41c67712b5b4105740c32fd83f4c449","impliedFormat":1},{"version":"1b3dffaa4ca8e38ac434856843505af767a614d187fb3a5ef4fcebb023c355aa","impliedFormat":1},{"version":"7fa8d75d229eeaee235a801758d9c694e94405013fe77d5d1dd8e3201fc414f1","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[83,[88,90],[97,100],[103,120],[122,124],[133,136],863,867,868,[877,879],[980,982],987,988,[997,999],1002,[1005,1007],1011,1012,1016,1020,1023,1025,1026,1030,1032,1038,1039,[1051,1053],1055,1057,[1077,1087]],"options":{"allowJs":true,"esModuleInterop":true,"jsx":1,"module":99,"skipLibCheck":true,"strict":true,"target":4},"referencedMap":[[1072,1],[1065,2],[1073,3],[1076,4],[1074,5],[1070,6],[1075,2],[1062,7],[1071,8],[1064,9],[168,10],[167,7],[170,11],[169,12],[180,13],[173,14],[181,15],[178,13],[182,16],[176,13],[177,17],[179,18],[175,19],[174,20],[183,21],[171,22],[172,23],[162,7],[163,24],[186,25],[184,26],[185,27],[188,28],[187,29],[165,30],[164,31],[166,32],[1067,7],[1069,33],[1068,33],[844,34],[888,34],[1054,34],[1013,34],[847,34],[1014,34],[848,34],[866,34],[986,34],[1019,34],[1037,34],[983,34],[1008,34],[839,34],[891,34],[881,34],[994,34],[872,34],[880,34],[860,34],[1000,34],[1001,34],[856,34],[1046,34],[1036,34],[1028,34],[854,34],[836,34],[1058,34],[1031,34],[1027,34],[837,34],[1004,34],[862,34],[882,34],[873,34],[984,34],[861,34],[985,34],[869,34],[843,34],[876,34],[1018,34],[864,34],[850,34],[889,34],[1009,34],[1022,34],[1042,34],[1061,34],[865,34],[1059,34],[857,34],[887,34],[1034,34],[858,34],[853,34],[1048,34],[1015,34],[1041,34],[993,34],[989,34],[1035,34],[1029,34],[870,34],[979,34],[1033,34],[1050,34],[1056,34],[838,34],[890,34],[1047,34],[875,34],[992,34],[1003,34],[1017,34],[1010,34],[849,34],[855,34],[1040,34],[874,34],[1049,34],[871,34],[845,34],[991,34],[1045,34],[1044,34],[1021,34],[990,34],[1043,34],[1060,34],[859,34],[841,34],[840,34],[995,34],[842,34],[996,34],[846,34],[851,34],[852,34],[478,35],[477,7],[479,36],[472,37],[471,7],[473,38],[475,39],[474,7],[476,40],[481,41],[480,7],[482,42],[327,43],[324,7],[328,44],[333,45],[332,7],[334,46],[336,47],[335,7],[337,48],[370,49],[369,7],[371,50],[373,51],[372,7],[374,52],[376,53],[375,7],[377,54],[383,55],[382,7],[384,56],[386,57],[385,7],[387,58],[392,59],[391,7],[393,60],[389,61],[388,7],[390,62],[803,63],[804,7],[805,64],[395,65],[394,7],[396,66],[403,67],[402,7],[404,68],[316,69],[315,7],[317,70],[314,71],[313,7],[398,72],[400,26],[397,7],[399,73],[401,74],[421,75],[420,7],[422,76],[406,77],[405,7],[407,78],[409,79],[408,7],[410,80],[412,81],[411,7],[413,82],[415,83],[414,7],[416,84],[418,85],[417,7],[419,86],[426,87],[425,7],[427,88],[339,89],[338,7],[340,90],[429,91],[428,7],[430,92],[625,26],[626,93],[437,94],[436,7],[438,95],[138,7],[139,7],[140,7],[141,7],[142,7],[143,7],[144,7],[145,7],[146,7],[147,7],[158,96],[148,7],[149,7],[150,7],[151,7],[152,7],[153,7],[154,7],[155,7],[156,7],[157,7],[440,97],[439,98],[441,99],[442,100],[443,101],[806,7],[458,102],[457,7],[459,103],[445,104],[444,7],[446,105],[448,106],[447,7],[449,107],[451,108],[450,7],[452,109],[461,110],[460,7],[462,111],[464,112],[463,7],[465,113],[469,114],[468,7],[470,115],[484,116],[483,7],[485,117],[380,118],[381,119],[490,120],[489,7],[491,121],[496,122],[495,7],[497,123],[499,124],[498,125],[493,126],[492,7],[494,127],[501,128],[500,7],[502,129],[504,130],[503,7],[505,131],[507,132],[506,7],[508,133],[826,134],[829,135],[819,136],[820,137],[512,138],[513,7],[514,139],[510,140],[509,7],[511,141],[807,118],[808,142],[516,143],[515,7],[517,144],[319,145],[318,7],[320,146],[519,147],[518,7],[520,148],[525,149],[524,7],[526,150],[522,151],[521,7],[523,152],[835,153],[834,154],[833,155],[535,156],[534,157],[533,7],[529,158],[528,159],[527,7],[488,160],[487,161],[486,7],[532,162],[531,163],[530,7],[312,164],[424,165],[423,7],[538,166],[537,167],[536,7],[541,168],[540,169],[539,7],[562,170],[561,171],[560,7],[550,172],[549,173],[548,7],[544,174],[543,175],[542,7],[553,176],[552,177],[551,7],[547,178],[546,179],[545,7],[556,180],[555,181],[554,7],[559,182],[558,183],[557,7],[565,184],[564,185],[563,7],[576,186],[575,187],[574,7],[568,188],[567,189],[566,7],[570,190],[569,191],[579,192],[578,193],[577,7],[456,194],[455,195],[454,7],[453,7],[583,196],[582,197],[581,7],[580,198],[811,199],[810,200],[809,26],[587,201],[586,202],[585,7],[308,203],[591,204],[590,205],[589,7],[594,206],[593,207],[592,7],[323,208],[322,209],[321,7],[573,210],[572,211],[571,7],[363,212],[366,213],[364,214],[365,7],[361,215],[360,216],[359,26],[602,217],[601,218],[600,7],[599,219],[595,220],[598,221],[596,26],[597,222],[605,223],[604,224],[603,7],[608,225],[607,226],[606,7],[612,227],[611,228],[610,7],[609,229],[615,230],[614,231],[613,7],[467,232],[466,118],[621,233],[620,234],[619,7],[618,235],[617,7],[616,26],[629,236],[628,237],[627,7],[624,238],[623,239],[622,7],[633,240],[632,241],[631,7],[639,242],[638,243],[637,7],[642,244],[641,245],[640,7],[645,246],[643,247],[644,98],[668,248],[666,249],[665,7],[667,26],[648,250],[647,251],[646,7],[651,252],[650,253],[649,7],[654,254],[653,255],[652,7],[657,256],[656,257],[655,7],[660,258],[659,259],[658,7],[664,260],[662,261],[661,7],[663,26],[732,262],[728,263],[733,264],[304,265],[161,7],[734,7],[731,266],[307,267],[729,268],[730,269],[303,7],[305,270],[743,271],[750,7],[748,7],[160,7],[751,272],[744,7],[726,273],[725,274],[735,275],[740,7],[302,7],[749,7],[739,7],[741,276],[742,277],[747,278],[737,279],[738,280],[727,281],[745,7],[746,7],[306,7],[311,282],[310,283],[309,7],[670,284],[669,285],[673,286],[672,287],[671,7],[709,288],[708,289],[707,7],[697,290],[696,291],[695,7],[676,292],[675,293],[674,7],[679,294],[678,295],[677,7],[682,296],[681,297],[680,7],[706,298],[705,299],[704,7],[685,300],[684,301],[683,7],[694,302],[693,303],[689,7],[688,304],[686,305],[687,7],[700,306],[699,307],[698,7],[703,308],[702,309],[701,7],[715,310],[714,311],[713,7],[712,312],[711,313],[710,7],[814,314],[813,315],[812,26],[718,316],[717,317],[716,7],[721,318],[720,319],[719,7],[724,320],[723,321],[722,7],[692,322],[691,323],[690,7],[636,324],[635,325],[634,7],[630,326],[379,327],[331,328],[330,329],[329,7],[831,330],[830,26],[832,331],[368,332],[367,333],[584,334],[588,26],[816,335],[815,7],[756,336],[759,337],[760,34],[763,338],[766,339],[802,340],[769,341],[770,342],[801,343],[773,344],[776,345],[362,333],[779,346],[782,347],[326,348],[791,349],[794,350],[785,351],[797,352],[800,353],[788,354],[821,7],[818,355],[817,118],[235,7],[240,356],[237,357],[236,358],[239,359],[238,358],[191,360],[192,361],[193,362],[190,363],[189,26],[196,364],[197,365],[246,366],[247,7],[248,367],[213,368],[214,369],[264,7],[265,370],[215,364],[216,371],[286,372],[283,7],[284,373],[285,374],[287,375],[249,376],[250,377],[198,378],[736,379],[251,380],[252,381],[208,382],[200,7],[211,383],[212,384],[199,7],[209,379],[210,385],[221,364],[222,386],[273,387],[276,388],[279,7],[280,7],[277,7],[278,389],[271,7],[274,7],[275,7],[272,390],[217,364],[218,391],[219,364],[220,392],[233,7],[234,393],[242,394],[243,395],[290,396],[289,397],[291,7],[293,398],[288,399],[294,400],[292,379],[301,401],[270,402],[269,155],[268,382],[224,403],[223,364],[226,404],[225,364],[282,405],[281,7],[228,406],[227,364],[230,407],[229,364],[245,408],[244,364],[297,409],[299,410],[296,411],[298,7],[295,399],[195,412],[194,382],[254,413],[253,414],[202,415],[206,364],[205,416],[207,417],[203,418],[201,418],[204,419],[267,420],[266,421],[232,422],[231,364],[263,423],[262,7],[259,424],[258,425],[256,7],[257,426],[255,7],[261,427],[260,7],[300,7],[159,26],[754,7],[755,428],[752,7],[753,429],[822,7],[823,430],[757,7],[758,431],[761,7],[762,432],[764,433],[765,434],[824,7],[825,435],[827,7],[828,436],[768,437],[767,7],[772,438],[771,7],[775,439],[774,7],[778,440],[777,441],[781,442],[780,26],[325,26],[790,443],[789,7],[793,444],[792,26],[784,445],[783,26],[796,446],[795,7],[799,447],[798,26],[787,448],[786,7],[358,449],[354,450],[341,7],[357,451],[350,452],[348,453],[347,453],[346,452],[343,453],[344,452],[352,454],[345,453],[342,452],[349,453],[355,455],[356,456],[351,457],[353,453],[96,458],[95,7],[1210,459],[1211,460],[1216,461],[1209,462],[1218,463],[1223,464],[1222,465],[1221,466],[1224,467],[1219,7],[1215,468],[1230,469],[1229,468],[893,470],[1231,26],[1232,7],[1225,7],[1233,471],[1220,7],[903,470],[1226,7],[1217,7],[1234,472],[1149,473],[1150,473],[1151,474],[1090,475],[1152,476],[1153,477],[1154,478],[1088,7],[1155,479],[1156,480],[1157,481],[1158,482],[1159,483],[1160,484],[1161,484],[1162,485],[1163,486],[1164,487],[1165,488],[1091,7],[1089,7],[1166,489],[1167,490],[1168,491],[1208,492],[1169,493],[1170,494],[1171,493],[1172,495],[1173,496],[1174,497],[1175,498],[1176,498],[1177,498],[1178,499],[1179,500],[1180,501],[1181,502],[1182,503],[1183,504],[1184,504],[1185,505],[1186,7],[1187,7],[1188,506],[1189,507],[1190,506],[1191,508],[1192,509],[1193,510],[1194,511],[1195,512],[1196,513],[1197,514],[1198,515],[1199,516],[1200,517],[1201,518],[1202,519],[1203,520],[1204,521],[1205,522],[1092,493],[1093,7],[1094,523],[1095,524],[1096,7],[1097,525],[1098,7],[1140,526],[1141,527],[1142,528],[1143,528],[1144,529],[1145,7],[1146,476],[1147,530],[1148,527],[1206,531],[1207,532],[1235,7],[1236,7],[86,7],[1213,7],[1214,7],[137,26],[1024,26],[1238,533],[1237,7],[1239,534],[431,7],[432,327],[435,535],[433,26],[378,26],[434,327],[84,7],[87,536],[241,26],[1240,7],[1212,537],[1241,538],[1228,539],[1227,540],[1242,462],[892,7],[1243,7],[1244,541],[1066,2],[85,7],[885,542],[886,543],[102,544],[101,7],[92,7],[972,7],[946,545],[945,546],[944,547],[971,548],[970,549],[974,550],[973,551],[976,552],[975,553],[931,554],[905,555],[906,556],[907,556],[908,556],[909,556],[910,556],[911,556],[912,556],[913,556],[914,556],[915,556],[929,557],[916,556],[917,556],[918,556],[919,556],[920,556],[921,556],[922,556],[923,556],[925,556],[926,556],[924,556],[927,556],[928,556],[930,556],[904,558],[969,559],[949,560],[950,560],[951,560],[952,560],[953,560],[954,560],[955,561],[957,560],[956,560],[968,562],[958,560],[960,560],[959,560],[962,560],[961,560],[963,560],[964,560],[965,560],[966,560],[967,560],[948,560],[947,563],[939,564],[937,565],[938,565],[942,566],[940,565],[941,565],[943,565],[936,7],[884,567],[883,7],[935,568],[934,569],[121,570],[132,571],[126,572],[127,573],[129,572],[131,574],[128,575],[125,26],[130,7],[94,576],[91,7],[978,577],[977,578],[933,579],[932,580],[93,7],[1063,7],[900,581],[899,7],[81,7],[82,7],[13,7],[14,7],[16,7],[15,7],[2,7],[17,7],[18,7],[19,7],[20,7],[21,7],[22,7],[23,7],[24,7],[3,7],[25,7],[26,7],[4,7],[27,7],[31,7],[28,7],[29,7],[30,7],[32,7],[33,7],[34,7],[5,7],[35,7],[36,7],[37,7],[38,7],[6,7],[42,7],[39,7],[40,7],[41,7],[43,7],[7,7],[44,7],[49,7],[50,7],[45,7],[46,7],[47,7],[48,7],[8,7],[54,7],[51,7],[52,7],[53,7],[55,7],[9,7],[56,7],[57,7],[58,7],[60,7],[59,7],[61,7],[62,7],[10,7],[63,7],[64,7],[65,7],[11,7],[66,7],[67,7],[68,7],[69,7],[70,7],[1,7],[71,7],[72,7],[12,7],[76,7],[74,7],[79,7],[78,7],[73,7],[77,7],[75,7],[80,7],[1116,582],[1128,583],[1114,584],[1129,585],[1138,586],[1105,587],[1106,588],[1104,589],[1137,472],[1132,590],[1136,591],[1108,592],[1125,593],[1107,594],[1135,595],[1102,596],[1103,590],[1109,597],[1110,7],[1115,598],[1113,597],[1100,599],[1139,600],[1130,601],[1119,602],[1118,597],[1120,603],[1123,604],[1117,605],[1121,606],[1133,472],[1111,607],[1112,608],[1124,609],[1101,585],[1127,610],[1126,597],[1122,611],[1131,7],[1099,7],[1134,612],[902,613],[898,7],[901,614],[895,615],[894,470],[897,616],[896,617],[997,618],[867,619],[88,26],[878,620],[1081,621],[879,622],[83,7],[1052,623],[1025,624],[1084,625],[89,626],[1082,627],[1006,628],[877,629],[1002,630],[999,631],[1005,632],[982,633],[998,634],[987,635],[988,636],[981,637],[1055,638],[1007,639],[1016,640],[1020,641],[1085,642],[1026,643],[1023,644],[1012,645],[90,26],[100,646],[1030,647],[1053,648],[868,649],[1038,650],[1039,651],[1032,652],[1051,653],[103,654],[1077,655],[1011,656],[104,626],[1057,657],[1078,658],[980,659],[1079,660],[1080,661],[1083,662],[120,663],[105,7],[97,7],[122,664],[133,665],[1086,666],[119,7],[123,7],[98,667],[99,668],[115,667],[112,667],[110,667],[114,667],[111,667],[113,667],[108,667],[117,669],[107,667],[106,670],[109,667],[116,670],[134,7],[1087,7],[863,671],[124,672],[118,673],[135,7],[136,7]],"semanticDiagnosticsPerFile":[[868,[{"start":22269,"length":27,"messageText":"This comparison appears to be unintentional because the types '\"error\" | \"idle\" | \"not-available\"' and '\"checking\"' have no overlap.","category":1,"code":2367}]],[980,[{"start":1899,"length":7,"messageText":"Cannot assign to 'current' because it is a read-only property.","category":1,"code":2540}]],[1051,[{"start":47198,"length":5,"code":2339,"category":1,"messageText":"Property 'color' does not exist on type 'Output'."},{"start":47309,"length":5,"code":2339,"category":1,"messageText":"Property 'color' does not exist on type 'Output'."},{"start":47676,"length":8,"code":2339,"category":1,"messageText":"Property 'category' does not exist on type 'Output'."},{"start":47721,"length":5,"code":2339,"category":1,"messageText":"Property 'color' does not exist on type 'Output'."},{"start":47743,"length":5,"code":2339,"category":1,"messageText":"Property 'color' does not exist on type 'Output'."}]],[1078,[{"start":10687,"length":3,"code":2322,"category":1,"messageText":{"messageText":"Type 'RefObject' is not assignable to type 'LegacyRef | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type 'RefObject' is not assignable to type 'RefObject'.","category":1,"code":2322,"next":[{"messageText":"Type 'HTMLDivElement | null' is not assignable to type 'HTMLDivElement'.","category":1,"code":2322,"next":[{"messageText":"Type 'null' is not assignable to type 'HTMLDivElement'.","category":1,"code":2322}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":10381,"length":3,"messageText":"The expected type comes from property 'ref' which is declared here on type 'DetailedHTMLProps, HTMLDivElement>'","category":3,"code":6500}]},{"start":53933,"length":8,"code":2322,"category":1,"messageText":"Type 'string' is not assignable to type 'Language'.","relatedInformation":[{"file":"./src/app/pages/views/codeeditor.tsx","start":680,"length":8,"messageText":"The expected type comes from property 'language' which is declared here on type 'IntrinsicAttributes & Props'","category":3,"code":6500}]}]]],"affectedFilesPendingEmit":[997,867,88,878,1081,879,83,1052,1025,1084,89,1082,1006,877,1002,999,1005,982,998,987,988,981,1055,1007,1016,1020,1085,1026,1023,1012,90,100,1030,1053,868,1038,1039,1032,1051,103,1077,1011,104,1057,1078,980,1079,1080,1083,120,105,97,122,133,1086,119,123,98,99,115,112,110,114,111,113,108,117,107,106,109,116,134,1087,863,124,118],"version":"5.9.3"}
\ No newline at end of file
+{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/typescript/lib/lib.es2024.d.ts","./node_modules/typescript/lib/lib.esnext.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/typescript/lib/lib.es2023.intl.d.ts","./node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2024.collection.d.ts","./node_modules/typescript/lib/lib.es2024.object.d.ts","./node_modules/typescript/lib/lib.es2024.promise.d.ts","./node_modules/typescript/lib/lib.es2024.regexp.d.ts","./node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2024.string.d.ts","./node_modules/typescript/lib/lib.esnext.array.d.ts","./node_modules/typescript/lib/lib.esnext.collection.d.ts","./node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.promise.d.ts","./node_modules/typescript/lib/lib.esnext.decorators.d.ts","./node_modules/typescript/lib/lib.esnext.iterator.d.ts","./node_modules/typescript/lib/lib.esnext.float16.d.ts","./node_modules/typescript/lib/lib.esnext.error.d.ts","./node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./src/app/components/richeditorutils.ts","./node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/prop-types/index.d.ts","./node_modules/@types/react/index.d.ts","./src/app/components/elementselectioncontext.tsx","./src/app/components/usedomelementselector.ts","./node_modules/redux/dist/redux.d.ts","./node_modules/immer/dist/immer.d.ts","./node_modules/reselect/dist/reselect.d.ts","./node_modules/redux-thunk/dist/redux-thunk.d.ts","./node_modules/@reduxjs/toolkit/dist/uncheckedindexed.ts","./node_modules/@reduxjs/toolkit/dist/index.d.mts","./src/shared/config.ts","./src/shared/state/agentsslice.ts","./src/shared/state/dashboardlayoutslice.ts","./src/app/pages/dashboard/capturedashboardthumbnail.ts","./src/app/pages/dashboard/usecanvascontrols.ts","./src/app/pages/dashboard/usedashboardselection.ts","./src/app/pages/dashboard/useoverlayscrollpassthrough.ts","./node_modules/html-to-image/lib/types.d.ts","./node_modules/html-to-image/lib/index.d.ts","./src/app/pages/views/captureviewthumbnail.ts","./src/app/pages/views/useiframeelementselector.ts","./src/shared/browserregistry.ts","./src/shared/state/tempstateslice.ts","./src/shared/state/templatesslice.ts","./src/shared/state/skillsslice.ts","./src/shared/state/toolsslice.ts","./src/shared/state/modesslice.ts","./src/shared/state/settingsslice.ts","./src/shared/state/mcpregistryslice.ts","./src/shared/state/skillregistryslice.ts","./src/shared/state/outputsslice.ts","./src/shared/state/dashboardsslice.ts","./src/shared/state/updateslice.ts","./src/shared/state/store.ts","./src/shared/ws/websocketmanager.ts","./src/shared/resolveurl.ts","./src/shared/browsercommandhandler.ts","./src/shared/dashboardclipboard.ts","./node_modules/react-redux/dist/react-redux.d.ts","./src/shared/hooks.ts","./src/shared/sanitizesvg.ts","./src/shared/usebrowseractivity.ts","./node_modules/react-router/dist/development/router-clsu7khk.d.mts","./node_modules/react-router/dist/development/browser-dzsjabdq.d.mts","./node_modules/react-router/dist/development/dom-export.d.mts","./node_modules/react-router/dist/development/register-cryj3cjg.d.mts","./node_modules/react-router/dist/development/index-react-server-client-ezwjgpn_.d.mts","./node_modules/react-router/node_modules/cookie/dist/index.d.ts","./node_modules/react-router/dist/development/index.d.mts","./node_modules/react-router-dom/dist/index.d.mts","./src/shared/hooks/usekeyboardshortcuts.ts","./src/shared/styles/claudetokens.ts","./src/types/css-modules.d.ts","./src/types/electron.d.ts","./node_modules/@types/react-dom/client.d.ts","./node_modules/@mui/material/esm/colors/amber.d.ts","./node_modules/@mui/material/esm/colors/blue.d.ts","./node_modules/@mui/material/esm/colors/bluegrey.d.ts","./node_modules/@mui/material/esm/colors/brown.d.ts","./node_modules/@mui/material/esm/colors/common.d.ts","./node_modules/@mui/material/esm/colors/cyan.d.ts","./node_modules/@mui/material/esm/colors/deeporange.d.ts","./node_modules/@mui/material/esm/colors/deeppurple.d.ts","./node_modules/@mui/material/esm/colors/green.d.ts","./node_modules/@mui/material/esm/colors/grey.d.ts","./node_modules/@mui/material/esm/colors/indigo.d.ts","./node_modules/@mui/material/esm/colors/lightblue.d.ts","./node_modules/@mui/material/esm/colors/lightgreen.d.ts","./node_modules/@mui/material/esm/colors/lime.d.ts","./node_modules/@mui/material/esm/colors/orange.d.ts","./node_modules/@mui/material/esm/colors/pink.d.ts","./node_modules/@mui/material/esm/colors/purple.d.ts","./node_modules/@mui/material/esm/colors/red.d.ts","./node_modules/@mui/material/esm/colors/teal.d.ts","./node_modules/@mui/material/esm/colors/yellow.d.ts","./node_modules/@mui/material/esm/colors/index.d.ts","./node_modules/@mui/types/esm/index.d.ts","./node_modules/@mui/material/esm/styles/identifier.d.ts","./node_modules/@mui/material/esm/styles/createpalette.d.ts","./node_modules/@emotion/sheet/dist/declarations/src/index.d.ts","./node_modules/@emotion/sheet/dist/emotion-sheet.cjs.d.mts","./node_modules/@emotion/utils/dist/declarations/src/types.d.ts","./node_modules/@emotion/utils/dist/declarations/src/index.d.ts","./node_modules/@emotion/utils/dist/emotion-utils.cjs.d.mts","./node_modules/@emotion/cache/dist/declarations/src/types.d.ts","./node_modules/@emotion/cache/dist/declarations/src/index.d.ts","./node_modules/@emotion/cache/dist/emotion-cache.cjs.default.d.ts","./node_modules/@emotion/cache/dist/emotion-cache.cjs.d.mts","./node_modules/@emotion/serialize/dist/declarations/src/index.d.ts","./node_modules/@emotion/serialize/dist/emotion-serialize.cjs.d.mts","./node_modules/@emotion/react/dist/declarations/src/context.d.ts","./node_modules/@emotion/react/dist/declarations/src/types.d.ts","./node_modules/@emotion/react/dist/declarations/src/theming.d.ts","./node_modules/@emotion/react/dist/declarations/src/jsx-namespace.d.ts","./node_modules/@emotion/react/dist/declarations/src/jsx.d.ts","./node_modules/@emotion/react/dist/declarations/src/global.d.ts","./node_modules/@emotion/react/dist/declarations/src/keyframes.d.ts","./node_modules/@emotion/react/dist/declarations/src/class-names.d.ts","./node_modules/@emotion/react/dist/declarations/src/css.d.ts","./node_modules/@emotion/react/dist/declarations/src/index.d.ts","./node_modules/@emotion/react/dist/emotion-react.cjs.d.mts","./node_modules/@emotion/styled/dist/declarations/src/jsx-namespace.d.ts","./node_modules/@emotion/styled/dist/declarations/src/types.d.ts","./node_modules/@emotion/styled/dist/declarations/src/index.d.ts","./node_modules/@emotion/styled/dist/emotion-styled.cjs.default.d.ts","./node_modules/@emotion/styled/dist/emotion-styled.cjs.d.mts","./node_modules/@mui/styled-engine/esm/styledengineprovider/styledengineprovider.d.ts","./node_modules/@mui/styled-engine/esm/styledengineprovider/index.d.ts","./node_modules/@mui/styled-engine/esm/globalstyles/globalstyles.d.ts","./node_modules/@mui/styled-engine/esm/globalstyles/index.d.ts","./node_modules/@mui/styled-engine/esm/index.d.ts","./node_modules/@mui/system/esm/style/style.d.ts","./node_modules/@mui/system/esm/style/index.d.ts","./node_modules/@mui/system/esm/borders/borders.d.ts","./node_modules/@mui/system/esm/borders/index.d.ts","./node_modules/@mui/system/esm/createbreakpoints/createbreakpoints.d.ts","./node_modules/@mui/system/esm/createtheme/shape.d.ts","./node_modules/@mui/system/esm/createtheme/createspacing.d.ts","./node_modules/@mui/system/esm/stylefunctionsx/standardcssproperties.d.ts","./node_modules/@mui/system/esm/stylefunctionsx/aliasescssproperties.d.ts","./node_modules/@mui/system/esm/stylefunctionsx/overwritecssproperties.d.ts","./node_modules/@mui/system/esm/stylefunctionsx/stylefunctionsx.d.ts","./node_modules/@mui/system/esm/stylefunctionsx/extendsxprop.d.ts","./node_modules/@mui/system/esm/stylefunctionsx/defaultsxconfig.d.ts","./node_modules/@mui/system/esm/stylefunctionsx/index.d.ts","./node_modules/@mui/system/esm/createtheme/applystyles.d.ts","./node_modules/@mui/system/esm/csscontainerqueries/csscontainerqueries.d.ts","./node_modules/@mui/system/esm/csscontainerqueries/index.d.ts","./node_modules/@mui/system/esm/createtheme/createtheme.d.ts","./node_modules/@mui/system/esm/createtheme/index.d.ts","./node_modules/@mui/system/esm/breakpoints/breakpoints.d.ts","./node_modules/@mui/system/esm/breakpoints/index.d.ts","./node_modules/@mui/system/esm/compose/compose.d.ts","./node_modules/@mui/system/esm/compose/index.d.ts","./node_modules/@mui/system/esm/display/display.d.ts","./node_modules/@mui/system/esm/display/index.d.ts","./node_modules/@mui/system/esm/flexbox/flexbox.d.ts","./node_modules/@mui/system/esm/flexbox/index.d.ts","./node_modules/@mui/system/esm/cssgrid/cssgrid.d.ts","./node_modules/@mui/system/esm/cssgrid/index.d.ts","./node_modules/@mui/system/esm/palette/palette.d.ts","./node_modules/@mui/system/esm/palette/index.d.ts","./node_modules/@mui/system/esm/positions/positions.d.ts","./node_modules/@mui/system/esm/positions/index.d.ts","./node_modules/@mui/system/esm/shadows/shadows.d.ts","./node_modules/@mui/system/esm/shadows/index.d.ts","./node_modules/@mui/system/esm/sizing/sizing.d.ts","./node_modules/@mui/system/esm/sizing/index.d.ts","./node_modules/@mui/system/esm/typography/typography.d.ts","./node_modules/@mui/system/esm/typography/index.d.ts","./node_modules/@mui/system/esm/getthemevalue/getthemevalue.d.ts","./node_modules/@mui/system/esm/getthemevalue/index.d.ts","./node_modules/@mui/private-theming/esm/defaulttheme/index.d.ts","./node_modules/@mui/private-theming/esm/themeprovider/themeprovider.d.ts","./node_modules/@mui/private-theming/esm/themeprovider/index.d.ts","./node_modules/@mui/private-theming/esm/usetheme/usetheme.d.ts","./node_modules/@mui/private-theming/esm/usetheme/index.d.ts","./node_modules/@mui/private-theming/esm/index.d.ts","./node_modules/@types/react/jsx-runtime.d.ts","./node_modules/@mui/system/esm/globalstyles/globalstyles.d.ts","./node_modules/@mui/system/esm/globalstyles/index.d.ts","./node_modules/@mui/system/esm/spacing/spacing.d.ts","./node_modules/@mui/system/esm/spacing/index.d.ts","./node_modules/@mui/system/esm/box/box.d.ts","./node_modules/@mui/system/esm/box/boxclasses.d.ts","./node_modules/@mui/system/esm/box/index.d.ts","./node_modules/@mui/system/esm/createbox/createbox.d.ts","./node_modules/@mui/system/esm/createbox/index.d.ts","./node_modules/@mui/system/esm/createstyled/createstyled.d.ts","./node_modules/@mui/system/esm/createstyled/index.d.ts","./node_modules/@mui/system/esm/styled/styled.d.ts","./node_modules/@mui/system/esm/styled/index.d.ts","./node_modules/@mui/system/esm/usethemeprops/usethemeprops.d.ts","./node_modules/@mui/system/esm/usethemeprops/getthemeprops.d.ts","./node_modules/@mui/system/esm/usethemeprops/index.d.ts","./node_modules/@mui/system/esm/usetheme/usetheme.d.ts","./node_modules/@mui/system/esm/usetheme/index.d.ts","./node_modules/@mui/system/esm/usethemewithoutdefault/usethemewithoutdefault.d.ts","./node_modules/@mui/system/esm/usethemewithoutdefault/index.d.ts","./node_modules/@mui/system/esm/usemediaquery/usemediaquery.d.ts","./node_modules/@mui/system/esm/usemediaquery/index.d.ts","./node_modules/@mui/system/esm/colormanipulator/colormanipulator.d.ts","./node_modules/@mui/system/esm/colormanipulator/index.d.ts","./node_modules/@mui/system/esm/themeprovider/themeprovider.d.ts","./node_modules/@mui/system/esm/themeprovider/index.d.ts","./node_modules/@mui/system/esm/memotheme.d.ts","./node_modules/@mui/system/esm/initcolorschemescript/initcolorschemescript.d.ts","./node_modules/@mui/system/esm/initcolorschemescript/index.d.ts","./node_modules/@mui/system/esm/cssvars/localstoragemanager.d.ts","./node_modules/@mui/system/esm/cssvars/usecurrentcolorscheme.d.ts","./node_modules/@mui/system/esm/cssvars/createcssvarsprovider.d.ts","./node_modules/@mui/system/esm/cssvars/preparecssvars.d.ts","./node_modules/@mui/system/esm/cssvars/preparetypographyvars.d.ts","./node_modules/@mui/system/esm/cssvars/createcssvarstheme.d.ts","./node_modules/@mui/system/esm/cssvars/getcolorschemeselector.d.ts","./node_modules/@mui/system/esm/cssvars/index.d.ts","./node_modules/@mui/system/esm/cssvars/creategetcssvar.d.ts","./node_modules/@mui/system/esm/cssvars/cssvarsparser.d.ts","./node_modules/@mui/system/esm/responsiveproptype/responsiveproptype.d.ts","./node_modules/@mui/system/esm/responsiveproptype/index.d.ts","./node_modules/@mui/system/esm/container/containerclasses.d.ts","./node_modules/@mui/system/esm/container/containerprops.d.ts","./node_modules/@mui/system/esm/container/createcontainer.d.ts","./node_modules/@mui/system/esm/container/container.d.ts","./node_modules/@mui/system/esm/container/index.d.ts","./node_modules/@mui/system/esm/grid/gridprops.d.ts","./node_modules/@mui/system/esm/grid/grid.d.ts","./node_modules/@mui/system/esm/grid/creategrid.d.ts","./node_modules/@mui/system/esm/grid/gridclasses.d.ts","./node_modules/@mui/system/esm/grid/traversebreakpoints.d.ts","./node_modules/@mui/system/esm/grid/gridgenerator.d.ts","./node_modules/@mui/system/esm/grid/index.d.ts","./node_modules/@mui/system/esm/stack/stackprops.d.ts","./node_modules/@mui/system/esm/stack/stack.d.ts","./node_modules/@mui/system/esm/stack/createstack.d.ts","./node_modules/@mui/system/esm/stack/stackclasses.d.ts","./node_modules/@mui/system/esm/stack/index.d.ts","./node_modules/@mui/system/esm/version/index.d.ts","./node_modules/@mui/system/esm/index.d.ts","./node_modules/@mui/material/esm/styles/shadows.d.ts","./node_modules/@mui/material/esm/styles/createtransitions.d.ts","./node_modules/@mui/material/esm/styles/createmixins.d.ts","./node_modules/@mui/material/esm/styles/createtypography.d.ts","./node_modules/@mui/material/esm/styles/zindex.d.ts","./node_modules/@mui/material/esm/styles/createthemefoundation.d.ts","./node_modules/@mui/material/esm/overridablecomponent/index.d.ts","./node_modules/@mui/material/esm/svgicon/svgiconclasses.d.ts","./node_modules/@mui/material/esm/svgicon/svgicon.d.ts","./node_modules/@mui/material/esm/svgicon/index.d.ts","./node_modules/@mui/material/esm/internal/index.d.ts","./node_modules/@mui/material/esm/buttonbase/touchrippleclasses.d.ts","./node_modules/@mui/material/esm/buttonbase/touchripple.d.ts","./node_modules/@mui/material/esm/buttonbase/buttonbaseclasses.d.ts","./node_modules/@mui/material/esm/buttonbase/buttonbase.d.ts","./node_modules/@mui/material/esm/buttonbase/index.d.ts","./node_modules/@mui/material/esm/iconbutton/iconbuttonclasses.d.ts","./node_modules/@mui/material/esm/iconbutton/iconbutton.d.ts","./node_modules/@mui/material/esm/iconbutton/index.d.ts","./node_modules/@mui/material/esm/paper/paperclasses.d.ts","./node_modules/@mui/material/esm/paper/paper.d.ts","./node_modules/@mui/material/esm/paper/index.d.ts","./node_modules/@mui/material/esm/alert/alertclasses.d.ts","./node_modules/@mui/utils/esm/types/index.d.ts","./node_modules/@mui/material/esm/utils/types.d.ts","./node_modules/@mui/material/esm/alert/alert.d.ts","./node_modules/@mui/material/esm/alert/index.d.ts","./node_modules/@mui/material/esm/typography/typographyclasses.d.ts","./node_modules/@mui/material/esm/typography/typography.d.ts","./node_modules/@mui/material/esm/typography/index.d.ts","./node_modules/@mui/material/esm/alerttitle/alerttitleclasses.d.ts","./node_modules/@mui/material/esm/alerttitle/alerttitle.d.ts","./node_modules/@mui/material/esm/alerttitle/index.d.ts","./node_modules/@mui/material/esm/appbar/appbarclasses.d.ts","./node_modules/@mui/material/esm/appbar/appbar.d.ts","./node_modules/@mui/material/esm/appbar/index.d.ts","./node_modules/@mui/material/esm/chip/chipclasses.d.ts","./node_modules/@mui/material/esm/chip/chip.d.ts","./node_modules/@mui/material/esm/chip/index.d.ts","./node_modules/@popperjs/core/lib/enums.d.ts","./node_modules/@popperjs/core/lib/modifiers/popperoffsets.d.ts","./node_modules/@popperjs/core/lib/modifiers/flip.d.ts","./node_modules/@popperjs/core/lib/modifiers/hide.d.ts","./node_modules/@popperjs/core/lib/modifiers/offset.d.ts","./node_modules/@popperjs/core/lib/modifiers/eventlisteners.d.ts","./node_modules/@popperjs/core/lib/modifiers/computestyles.d.ts","./node_modules/@popperjs/core/lib/modifiers/arrow.d.ts","./node_modules/@popperjs/core/lib/modifiers/preventoverflow.d.ts","./node_modules/@popperjs/core/lib/modifiers/applystyles.d.ts","./node_modules/@popperjs/core/lib/types.d.ts","./node_modules/@popperjs/core/lib/modifiers/index.d.ts","./node_modules/@popperjs/core/lib/utils/detectoverflow.d.ts","./node_modules/@popperjs/core/lib/createpopper.d.ts","./node_modules/@popperjs/core/lib/popper-lite.d.ts","./node_modules/@popperjs/core/lib/popper.d.ts","./node_modules/@popperjs/core/lib/index.d.ts","./node_modules/@popperjs/core/index.d.ts","./node_modules/@mui/material/esm/portal/portal.types.d.ts","./node_modules/@mui/material/esm/portal/portal.d.ts","./node_modules/@mui/material/esm/portal/index.d.ts","./node_modules/@mui/material/esm/utils/polymorphiccomponent.d.ts","./node_modules/@mui/material/esm/popper/basepopper.types.d.ts","./node_modules/@mui/material/esm/popper/popper.d.ts","./node_modules/@mui/material/esm/popper/popperclasses.d.ts","./node_modules/@mui/material/esm/popper/index.d.ts","./node_modules/@mui/material/esm/useautocomplete/useautocomplete.d.ts","./node_modules/@mui/material/esm/useautocomplete/index.d.ts","./node_modules/@mui/material/esm/autocomplete/autocompleteclasses.d.ts","./node_modules/@mui/material/esm/autocomplete/autocomplete.d.ts","./node_modules/@mui/material/esm/autocomplete/index.d.ts","./node_modules/@mui/material/esm/avatar/avatarclasses.d.ts","./node_modules/@mui/material/esm/avatar/avatar.d.ts","./node_modules/@mui/material/esm/avatar/index.d.ts","./node_modules/@mui/material/esm/avatargroup/avatargroupclasses.d.ts","./node_modules/@mui/material/esm/avatargroup/avatargroup.d.ts","./node_modules/@mui/material/esm/avatargroup/index.d.ts","./node_modules/@types/react-transition-group/transition.d.ts","./node_modules/@mui/material/esm/transitions/transition.d.ts","./node_modules/@mui/material/esm/fade/fade.d.ts","./node_modules/@mui/material/esm/fade/index.d.ts","./node_modules/@mui/material/esm/backdrop/backdropclasses.d.ts","./node_modules/@mui/material/esm/backdrop/backdrop.d.ts","./node_modules/@mui/material/esm/backdrop/index.d.ts","./node_modules/@mui/material/esm/badge/badgeclasses.d.ts","./node_modules/@mui/material/esm/badge/badge.d.ts","./node_modules/@mui/material/esm/badge/index.d.ts","./node_modules/@mui/material/esm/bottomnavigationaction/bottomnavigationactionclasses.d.ts","./node_modules/@mui/material/esm/bottomnavigationaction/bottomnavigationaction.d.ts","./node_modules/@mui/material/esm/bottomnavigationaction/index.d.ts","./node_modules/@mui/material/esm/bottomnavigation/bottomnavigationclasses.d.ts","./node_modules/@mui/material/esm/bottomnavigation/bottomnavigation.d.ts","./node_modules/@mui/material/esm/bottomnavigation/index.d.ts","./node_modules/@mui/material/esm/breadcrumbs/breadcrumbsclasses.d.ts","./node_modules/@mui/material/esm/breadcrumbs/breadcrumbs.d.ts","./node_modules/@mui/material/esm/breadcrumbs/index.d.ts","./node_modules/@mui/material/esm/buttongroup/buttongroupclasses.d.ts","./node_modules/@mui/material/esm/buttongroup/buttongroup.d.ts","./node_modules/@mui/material/esm/buttongroup/buttongroupcontext.d.ts","./node_modules/@mui/material/esm/buttongroup/buttongroupbuttoncontext.d.ts","./node_modules/@mui/material/esm/buttongroup/index.d.ts","./node_modules/@mui/material/esm/button/buttonclasses.d.ts","./node_modules/@mui/material/esm/button/button.d.ts","./node_modules/@mui/material/esm/button/index.d.ts","./node_modules/@mui/material/esm/cardactionarea/cardactionareaclasses.d.ts","./node_modules/@mui/material/esm/cardactionarea/cardactionarea.d.ts","./node_modules/@mui/material/esm/cardactionarea/index.d.ts","./node_modules/@mui/material/esm/cardactions/cardactionsclasses.d.ts","./node_modules/@mui/material/esm/cardactions/cardactions.d.ts","./node_modules/@mui/material/esm/cardactions/index.d.ts","./node_modules/@mui/material/esm/cardcontent/cardcontentclasses.d.ts","./node_modules/@mui/material/esm/cardcontent/cardcontent.d.ts","./node_modules/@mui/material/esm/cardcontent/index.d.ts","./node_modules/@mui/material/esm/cardheader/cardheaderclasses.d.ts","./node_modules/@mui/material/esm/cardheader/cardheader.d.ts","./node_modules/@mui/material/esm/cardheader/index.d.ts","./node_modules/@mui/material/esm/cardmedia/cardmediaclasses.d.ts","./node_modules/@mui/material/esm/cardmedia/cardmedia.d.ts","./node_modules/@mui/material/esm/cardmedia/index.d.ts","./node_modules/@mui/material/esm/card/cardclasses.d.ts","./node_modules/@mui/material/esm/card/card.d.ts","./node_modules/@mui/material/esm/card/index.d.ts","./node_modules/@mui/material/esm/internal/switchbaseclasses.d.ts","./node_modules/@mui/material/esm/internal/switchbase.d.ts","./node_modules/@mui/material/esm/checkbox/checkboxclasses.d.ts","./node_modules/@mui/material/esm/checkbox/checkbox.d.ts","./node_modules/@mui/material/esm/checkbox/index.d.ts","./node_modules/@mui/material/esm/circularprogress/circularprogressclasses.d.ts","./node_modules/@mui/material/esm/circularprogress/circularprogress.d.ts","./node_modules/@mui/material/esm/circularprogress/index.d.ts","./node_modules/@types/react-transition-group/config.d.ts","./node_modules/@types/react-transition-group/csstransition.d.ts","./node_modules/@types/react-transition-group/switchtransition.d.ts","./node_modules/@types/react-transition-group/transitiongroup.d.ts","./node_modules/@types/react-transition-group/index.d.ts","./node_modules/@mui/material/esm/collapse/collapseclasses.d.ts","./node_modules/@mui/material/esm/collapse/collapse.d.ts","./node_modules/@mui/material/esm/collapse/index.d.ts","./node_modules/@mui/material/esm/container/containerclasses.d.ts","./node_modules/@mui/material/esm/container/container.d.ts","./node_modules/@mui/material/esm/container/index.d.ts","./node_modules/@mui/material/esm/cssbaseline/cssbaseline.d.ts","./node_modules/@mui/material/esm/cssbaseline/index.d.ts","./node_modules/@mui/material/esm/dialogactions/dialogactionsclasses.d.ts","./node_modules/@mui/material/esm/dialogactions/dialogactions.d.ts","./node_modules/@mui/material/esm/dialogactions/index.d.ts","./node_modules/@mui/material/esm/dialogcontent/dialogcontentclasses.d.ts","./node_modules/@mui/material/esm/dialogcontent/dialogcontent.d.ts","./node_modules/@mui/material/esm/dialogcontent/index.d.ts","./node_modules/@mui/material/esm/dialogcontenttext/dialogcontenttextclasses.d.ts","./node_modules/@mui/material/esm/dialogcontenttext/dialogcontenttext.d.ts","./node_modules/@mui/material/esm/dialogcontenttext/index.d.ts","./node_modules/@mui/material/esm/modal/modalmanager.d.ts","./node_modules/@mui/material/esm/modal/modalclasses.d.ts","./node_modules/@mui/material/esm/modal/modal.d.ts","./node_modules/@mui/material/esm/modal/index.d.ts","./node_modules/@mui/material/esm/dialog/dialogclasses.d.ts","./node_modules/@mui/material/esm/dialog/dialog.d.ts","./node_modules/@mui/material/esm/dialog/index.d.ts","./node_modules/@mui/material/esm/dialogtitle/dialogtitleclasses.d.ts","./node_modules/@mui/material/esm/dialogtitle/dialogtitle.d.ts","./node_modules/@mui/material/esm/dialogtitle/index.d.ts","./node_modules/@mui/material/esm/divider/dividerclasses.d.ts","./node_modules/@mui/material/esm/divider/divider.d.ts","./node_modules/@mui/material/esm/divider/index.d.ts","./node_modules/@mui/material/esm/slide/slide.d.ts","./node_modules/@mui/material/esm/slide/index.d.ts","./node_modules/@mui/material/esm/drawer/drawerclasses.d.ts","./node_modules/@mui/material/esm/drawer/drawer.d.ts","./node_modules/@mui/material/esm/drawer/index.d.ts","./node_modules/@mui/material/esm/accordionactions/accordionactionsclasses.d.ts","./node_modules/@mui/material/esm/accordionactions/accordionactions.d.ts","./node_modules/@mui/material/esm/accordionactions/index.d.ts","./node_modules/@mui/material/esm/accordiondetails/accordiondetailsclasses.d.ts","./node_modules/@mui/material/esm/accordiondetails/accordiondetails.d.ts","./node_modules/@mui/material/esm/accordiondetails/index.d.ts","./node_modules/@mui/material/esm/accordion/accordionclasses.d.ts","./node_modules/@mui/material/esm/accordion/accordion.d.ts","./node_modules/@mui/material/esm/accordion/index.d.ts","./node_modules/@mui/material/esm/accordionsummary/accordionsummaryclasses.d.ts","./node_modules/@mui/material/esm/accordionsummary/accordionsummary.d.ts","./node_modules/@mui/material/esm/accordionsummary/index.d.ts","./node_modules/@mui/material/esm/fab/fabclasses.d.ts","./node_modules/@mui/material/esm/fab/fab.d.ts","./node_modules/@mui/material/esm/fab/index.d.ts","./node_modules/@mui/material/esm/inputbase/inputbaseclasses.d.ts","./node_modules/@mui/material/esm/inputbase/inputbase.d.ts","./node_modules/@mui/material/esm/inputbase/index.d.ts","./node_modules/@mui/material/esm/filledinput/filledinputclasses.d.ts","./node_modules/@mui/material/esm/filledinput/filledinput.d.ts","./node_modules/@mui/material/esm/filledinput/index.d.ts","./node_modules/@mui/material/esm/formcontrollabel/formcontrollabelclasses.d.ts","./node_modules/@mui/material/esm/formcontrollabel/formcontrollabel.d.ts","./node_modules/@mui/material/esm/formcontrollabel/index.d.ts","./node_modules/@mui/material/esm/formcontrol/formcontrolclasses.d.ts","./node_modules/@mui/material/esm/formcontrol/formcontrol.d.ts","./node_modules/@mui/material/esm/formcontrol/formcontrolcontext.d.ts","./node_modules/@mui/material/esm/formcontrol/useformcontrol.d.ts","./node_modules/@mui/material/esm/formcontrol/index.d.ts","./node_modules/@mui/material/esm/formgroup/formgroupclasses.d.ts","./node_modules/@mui/material/esm/formgroup/formgroup.d.ts","./node_modules/@mui/material/esm/formgroup/index.d.ts","./node_modules/@mui/material/esm/formhelpertext/formhelpertextclasses.d.ts","./node_modules/@mui/material/esm/formhelpertext/formhelpertext.d.ts","./node_modules/@mui/material/esm/formhelpertext/index.d.ts","./node_modules/@mui/material/esm/formlabel/formlabelclasses.d.ts","./node_modules/@mui/material/esm/formlabel/formlabel.d.ts","./node_modules/@mui/material/esm/formlabel/index.d.ts","./node_modules/@mui/material/esm/gridlegacy/gridlegacyclasses.d.ts","./node_modules/@mui/material/esm/gridlegacy/gridlegacy.d.ts","./node_modules/@mui/material/esm/gridlegacy/index.d.ts","./node_modules/@mui/material/esm/grid/grid.d.ts","./node_modules/@mui/material/esm/grid/gridclasses.d.ts","./node_modules/@mui/material/esm/grid/index.d.ts","./node_modules/@mui/material/esm/icon/iconclasses.d.ts","./node_modules/@mui/material/esm/icon/icon.d.ts","./node_modules/@mui/material/esm/icon/index.d.ts","./node_modules/@mui/material/esm/imagelist/imagelistclasses.d.ts","./node_modules/@mui/material/esm/imagelist/imagelist.d.ts","./node_modules/@mui/material/esm/imagelist/index.d.ts","./node_modules/@mui/material/esm/imagelistitembar/imagelistitembarclasses.d.ts","./node_modules/@mui/material/esm/imagelistitembar/imagelistitembar.d.ts","./node_modules/@mui/material/esm/imagelistitembar/index.d.ts","./node_modules/@mui/material/esm/imagelistitem/imagelistitemclasses.d.ts","./node_modules/@mui/material/esm/imagelistitem/imagelistitem.d.ts","./node_modules/@mui/material/esm/imagelistitem/index.d.ts","./node_modules/@mui/material/esm/inputadornment/inputadornmentclasses.d.ts","./node_modules/@mui/material/esm/inputadornment/inputadornment.d.ts","./node_modules/@mui/material/esm/inputadornment/index.d.ts","./node_modules/@mui/material/esm/inputlabel/inputlabelclasses.d.ts","./node_modules/@mui/material/esm/inputlabel/inputlabel.d.ts","./node_modules/@mui/material/esm/inputlabel/index.d.ts","./node_modules/@mui/material/esm/input/inputclasses.d.ts","./node_modules/@mui/material/esm/input/input.d.ts","./node_modules/@mui/material/esm/input/index.d.ts","./node_modules/@mui/material/esm/linearprogress/linearprogressclasses.d.ts","./node_modules/@mui/material/esm/linearprogress/linearprogress.d.ts","./node_modules/@mui/material/esm/linearprogress/index.d.ts","./node_modules/@mui/material/esm/link/linkclasses.d.ts","./node_modules/@mui/material/esm/link/link.d.ts","./node_modules/@mui/material/esm/link/index.d.ts","./node_modules/@mui/material/esm/listitemavatar/listitemavatarclasses.d.ts","./node_modules/@mui/material/esm/listitemavatar/listitemavatar.d.ts","./node_modules/@mui/material/esm/listitemavatar/index.d.ts","./node_modules/@mui/material/esm/listitemicon/listitemiconclasses.d.ts","./node_modules/@mui/material/esm/listitemicon/listitemicon.d.ts","./node_modules/@mui/material/esm/listitemicon/index.d.ts","./node_modules/@mui/material/esm/listitem/listitemclasses.d.ts","./node_modules/@mui/material/esm/listitem/listitem.d.ts","./node_modules/@mui/material/esm/listitem/index.d.ts","./node_modules/@mui/material/esm/listitembutton/listitembuttonclasses.d.ts","./node_modules/@mui/material/esm/listitembutton/listitembutton.d.ts","./node_modules/@mui/material/esm/listitembutton/index.d.ts","./node_modules/@mui/material/esm/listitemsecondaryaction/listitemsecondaryactionclasses.d.ts","./node_modules/@mui/material/esm/listitemsecondaryaction/listitemsecondaryaction.d.ts","./node_modules/@mui/material/esm/listitemsecondaryaction/index.d.ts","./node_modules/@mui/material/esm/listitemtext/listitemtextclasses.d.ts","./node_modules/@mui/material/esm/listitemtext/listitemtext.d.ts","./node_modules/@mui/material/esm/listitemtext/index.d.ts","./node_modules/@mui/material/esm/list/listclasses.d.ts","./node_modules/@mui/material/esm/list/list.d.ts","./node_modules/@mui/material/esm/list/index.d.ts","./node_modules/@mui/material/esm/listsubheader/listsubheaderclasses.d.ts","./node_modules/@mui/material/esm/listsubheader/listsubheader.d.ts","./node_modules/@mui/material/esm/listsubheader/index.d.ts","./node_modules/@mui/material/esm/menuitem/menuitemclasses.d.ts","./node_modules/@mui/material/esm/menuitem/menuitem.d.ts","./node_modules/@mui/material/esm/menuitem/index.d.ts","./node_modules/@mui/material/esm/menulist/menulist.d.ts","./node_modules/@mui/material/esm/menulist/index.d.ts","./node_modules/@mui/material/esm/popover/popoverclasses.d.ts","./node_modules/@mui/material/esm/popover/popover.d.ts","./node_modules/@mui/material/esm/popover/index.d.ts","./node_modules/@mui/material/esm/menu/menuclasses.d.ts","./node_modules/@mui/material/esm/menu/menu.d.ts","./node_modules/@mui/material/esm/menu/index.d.ts","./node_modules/@mui/material/esm/mobilestepper/mobilestepperclasses.d.ts","./node_modules/@mui/material/esm/mobilestepper/mobilestepper.d.ts","./node_modules/@mui/material/esm/mobilestepper/index.d.ts","./node_modules/@mui/material/esm/nativeselect/nativeselectinput.d.ts","./node_modules/@mui/material/esm/nativeselect/nativeselectclasses.d.ts","./node_modules/@mui/material/esm/nativeselect/nativeselect.d.ts","./node_modules/@mui/material/esm/nativeselect/index.d.ts","./node_modules/@mui/material/esm/usemediaquery/index.d.ts","./node_modules/@mui/material/esm/outlinedinput/outlinedinputclasses.d.ts","./node_modules/@mui/material/esm/outlinedinput/outlinedinput.d.ts","./node_modules/@mui/material/esm/outlinedinput/index.d.ts","./node_modules/@mui/material/esm/usepagination/usepagination.d.ts","./node_modules/@mui/material/esm/pagination/paginationclasses.d.ts","./node_modules/@mui/material/esm/pagination/pagination.d.ts","./node_modules/@mui/material/esm/pagination/index.d.ts","./node_modules/@mui/material/esm/paginationitem/paginationitemclasses.d.ts","./node_modules/@mui/material/esm/paginationitem/paginationitem.d.ts","./node_modules/@mui/material/esm/paginationitem/index.d.ts","./node_modules/@mui/material/esm/radiogroup/radiogroup.d.ts","./node_modules/@mui/material/esm/radiogroup/radiogroupcontext.d.ts","./node_modules/@mui/material/esm/radiogroup/useradiogroup.d.ts","./node_modules/@mui/material/esm/radiogroup/radiogroupclasses.d.ts","./node_modules/@mui/material/esm/radiogroup/index.d.ts","./node_modules/@mui/material/esm/radio/radioclasses.d.ts","./node_modules/@mui/material/esm/radio/radio.d.ts","./node_modules/@mui/material/esm/radio/index.d.ts","./node_modules/@mui/material/esm/rating/ratingclasses.d.ts","./node_modules/@mui/material/esm/rating/rating.d.ts","./node_modules/@mui/material/esm/rating/index.d.ts","./node_modules/@mui/material/esm/scopedcssbaseline/scopedcssbaselineclasses.d.ts","./node_modules/@mui/material/esm/scopedcssbaseline/scopedcssbaseline.d.ts","./node_modules/@mui/material/esm/scopedcssbaseline/index.d.ts","./node_modules/@mui/material/esm/select/selectinput.d.ts","./node_modules/@mui/material/esm/select/selectclasses.d.ts","./node_modules/@mui/material/esm/select/select.d.ts","./node_modules/@mui/material/esm/select/index.d.ts","./node_modules/@mui/material/esm/skeleton/skeletonclasses.d.ts","./node_modules/@mui/material/esm/skeleton/skeleton.d.ts","./node_modules/@mui/material/esm/skeleton/index.d.ts","./node_modules/@mui/material/esm/slider/useslider.types.d.ts","./node_modules/@mui/material/esm/slider/slidervaluelabel.types.d.ts","./node_modules/@mui/material/esm/slider/slidervaluelabel.d.ts","./node_modules/@mui/material/esm/slider/sliderclasses.d.ts","./node_modules/@mui/material/esm/slider/slider.d.ts","./node_modules/@mui/material/esm/slider/index.d.ts","./node_modules/@mui/material/esm/snackbarcontent/snackbarcontentclasses.d.ts","./node_modules/@mui/material/esm/snackbarcontent/snackbarcontent.d.ts","./node_modules/@mui/material/esm/snackbarcontent/index.d.ts","./node_modules/@mui/material/esm/clickawaylistener/clickawaylistener.d.ts","./node_modules/@mui/material/esm/clickawaylistener/index.d.ts","./node_modules/@mui/material/esm/snackbar/snackbarclasses.d.ts","./node_modules/@mui/material/esm/snackbar/snackbar.d.ts","./node_modules/@mui/material/esm/snackbar/index.d.ts","./node_modules/@mui/material/esm/transitions/index.d.ts","./node_modules/@mui/material/esm/speeddial/speeddialclasses.d.ts","./node_modules/@mui/material/esm/speeddial/speeddial.d.ts","./node_modules/@mui/material/esm/speeddial/index.d.ts","./node_modules/@mui/material/esm/tooltip/tooltipclasses.d.ts","./node_modules/@mui/material/esm/tooltip/tooltip.d.ts","./node_modules/@mui/material/esm/tooltip/index.d.ts","./node_modules/@mui/material/esm/speeddialaction/speeddialactionclasses.d.ts","./node_modules/@mui/material/esm/speeddialaction/speeddialaction.d.ts","./node_modules/@mui/material/esm/speeddialaction/index.d.ts","./node_modules/@mui/material/esm/speeddialicon/speeddialiconclasses.d.ts","./node_modules/@mui/material/esm/speeddialicon/speeddialicon.d.ts","./node_modules/@mui/material/esm/speeddialicon/index.d.ts","./node_modules/@mui/material/esm/stack/stack.d.ts","./node_modules/@mui/material/esm/stack/stackclasses.d.ts","./node_modules/@mui/material/esm/stack/index.d.ts","./node_modules/@mui/material/esm/stepbutton/stepbuttonclasses.d.ts","./node_modules/@mui/material/esm/stepbutton/stepbutton.d.ts","./node_modules/@mui/material/esm/stepbutton/index.d.ts","./node_modules/@mui/material/esm/stepconnector/stepconnectorclasses.d.ts","./node_modules/@mui/material/esm/stepconnector/stepconnector.d.ts","./node_modules/@mui/material/esm/stepconnector/index.d.ts","./node_modules/@mui/material/esm/stepcontent/stepcontentclasses.d.ts","./node_modules/@mui/material/esm/stepcontent/stepcontent.d.ts","./node_modules/@mui/material/esm/stepcontent/index.d.ts","./node_modules/@mui/material/esm/stepicon/stepiconclasses.d.ts","./node_modules/@mui/material/esm/stepicon/stepicon.d.ts","./node_modules/@mui/material/esm/stepicon/index.d.ts","./node_modules/@mui/material/esm/steplabel/steplabelclasses.d.ts","./node_modules/@mui/material/esm/steplabel/steplabel.d.ts","./node_modules/@mui/material/esm/steplabel/index.d.ts","./node_modules/@mui/material/esm/stepper/stepperclasses.d.ts","./node_modules/@mui/material/esm/stepper/stepper.d.ts","./node_modules/@mui/material/esm/stepper/steppercontext.d.ts","./node_modules/@mui/material/esm/stepper/index.d.ts","./node_modules/@mui/material/esm/step/stepclasses.d.ts","./node_modules/@mui/material/esm/step/step.d.ts","./node_modules/@mui/material/esm/step/stepcontext.d.ts","./node_modules/@mui/material/esm/step/index.d.ts","./node_modules/@mui/material/esm/swipeabledrawer/swipeabledrawer.d.ts","./node_modules/@mui/material/esm/swipeabledrawer/index.d.ts","./node_modules/@mui/material/esm/switch/switchclasses.d.ts","./node_modules/@mui/material/esm/switch/switch.d.ts","./node_modules/@mui/material/esm/switch/index.d.ts","./node_modules/@mui/material/esm/tablebody/tablebodyclasses.d.ts","./node_modules/@mui/material/esm/tablebody/tablebody.d.ts","./node_modules/@mui/material/esm/tablebody/index.d.ts","./node_modules/@mui/material/esm/tablecell/tablecellclasses.d.ts","./node_modules/@mui/material/esm/tablecell/tablecell.d.ts","./node_modules/@mui/material/esm/tablecell/index.d.ts","./node_modules/@mui/material/esm/tablecontainer/tablecontainerclasses.d.ts","./node_modules/@mui/material/esm/tablecontainer/tablecontainer.d.ts","./node_modules/@mui/material/esm/tablecontainer/index.d.ts","./node_modules/@mui/material/esm/tablehead/tableheadclasses.d.ts","./node_modules/@mui/material/esm/tablehead/tablehead.d.ts","./node_modules/@mui/material/esm/tablehead/index.d.ts","./node_modules/@mui/material/esm/tablepaginationactions/tablepaginationactions.d.ts","./node_modules/@mui/material/esm/tablepaginationactions/tablepaginationactionsclasses.d.ts","./node_modules/@mui/material/esm/tablepaginationactions/index.d.ts","./node_modules/@mui/material/esm/tablepagination/tablepaginationclasses.d.ts","./node_modules/@mui/material/esm/toolbar/toolbarclasses.d.ts","./node_modules/@mui/material/esm/toolbar/toolbar.d.ts","./node_modules/@mui/material/esm/toolbar/index.d.ts","./node_modules/@mui/material/esm/tablepagination/tablepagination.d.ts","./node_modules/@mui/material/esm/tablepagination/index.d.ts","./node_modules/@mui/material/esm/table/tableclasses.d.ts","./node_modules/@mui/material/esm/table/table.d.ts","./node_modules/@mui/material/esm/table/index.d.ts","./node_modules/@mui/material/esm/tablerow/tablerowclasses.d.ts","./node_modules/@mui/material/esm/tablerow/tablerow.d.ts","./node_modules/@mui/material/esm/tablerow/index.d.ts","./node_modules/@mui/material/esm/tablesortlabel/tablesortlabelclasses.d.ts","./node_modules/@mui/material/esm/tablesortlabel/tablesortlabel.d.ts","./node_modules/@mui/material/esm/tablesortlabel/index.d.ts","./node_modules/@mui/material/esm/tablefooter/tablefooterclasses.d.ts","./node_modules/@mui/material/esm/tablefooter/tablefooter.d.ts","./node_modules/@mui/material/esm/tablefooter/index.d.ts","./node_modules/@mui/material/esm/tab/tabclasses.d.ts","./node_modules/@mui/material/esm/tab/tab.d.ts","./node_modules/@mui/material/esm/tab/index.d.ts","./node_modules/@mui/material/esm/tabscrollbutton/tabscrollbuttonclasses.d.ts","./node_modules/@mui/material/esm/tabscrollbutton/tabscrollbutton.d.ts","./node_modules/@mui/material/esm/tabscrollbutton/index.d.ts","./node_modules/@mui/material/esm/tabs/tabsclasses.d.ts","./node_modules/@mui/material/esm/tabs/tabs.d.ts","./node_modules/@mui/material/esm/tabs/index.d.ts","./node_modules/@mui/material/esm/textfield/textfieldclasses.d.ts","./node_modules/@mui/material/esm/textfield/textfield.d.ts","./node_modules/@mui/material/esm/textfield/index.d.ts","./node_modules/@mui/material/esm/togglebutton/togglebuttonclasses.d.ts","./node_modules/@mui/material/esm/togglebutton/togglebutton.d.ts","./node_modules/@mui/material/esm/togglebutton/index.d.ts","./node_modules/@mui/material/esm/togglebuttongroup/togglebuttongroupclasses.d.ts","./node_modules/@mui/material/esm/togglebuttongroup/togglebuttongroup.d.ts","./node_modules/@mui/material/esm/togglebuttongroup/index.d.ts","./node_modules/@mui/material/esm/styles/props.d.ts","./node_modules/@mui/material/esm/styles/overrides.d.ts","./node_modules/@mui/material/esm/styles/variants.d.ts","./node_modules/@mui/material/esm/styles/components.d.ts","./node_modules/@mui/material/esm/styles/createthemenovars.d.ts","./node_modules/@mui/material/esm/styles/createthemewithvars.d.ts","./node_modules/@mui/material/esm/styles/createtheme.d.ts","./node_modules/@mui/material/esm/styles/adaptv4theme.d.ts","./node_modules/@mui/material/esm/styles/createcolorscheme.d.ts","./node_modules/@mui/material/esm/styles/createstyles.d.ts","./node_modules/@mui/material/esm/styles/responsivefontsizes.d.ts","./node_modules/@mui/system/esm/createbreakpoints/index.d.ts","./node_modules/@mui/material/esm/styles/usetheme.d.ts","./node_modules/@mui/material/esm/styles/usethemeprops.d.ts","./node_modules/@mui/material/esm/styles/slotshouldforwardprop.d.ts","./node_modules/@mui/material/esm/styles/rootshouldforwardprop.d.ts","./node_modules/@mui/material/esm/styles/styled.d.ts","./node_modules/@mui/material/esm/styles/themeprovider.d.ts","./node_modules/@mui/material/esm/styles/cssutils.d.ts","./node_modules/@mui/material/esm/styles/makestyles.d.ts","./node_modules/@mui/material/esm/styles/withstyles.d.ts","./node_modules/@mui/material/esm/styles/withtheme.d.ts","./node_modules/@mui/material/esm/styles/themeproviderwithvars.d.ts","./node_modules/@mui/material/esm/styles/getoverlayalpha.d.ts","./node_modules/@mui/material/esm/styles/shouldskipgeneratingvar.d.ts","./node_modules/@mui/material/esm/styles/excludevariablesfromroot.d.ts","./node_modules/@mui/material/esm/styles/index.d.ts","./node_modules/@mui/utils/esm/classnamegenerator/classnamegenerator.d.ts","./node_modules/@mui/utils/esm/classnamegenerator/index.d.ts","./node_modules/@mui/utils/esm/capitalize/capitalize.d.ts","./node_modules/@mui/utils/esm/capitalize/index.d.ts","./node_modules/@mui/material/esm/utils/capitalize.d.ts","./node_modules/@mui/utils/esm/createchainedfunction/createchainedfunction.d.ts","./node_modules/@mui/utils/esm/createchainedfunction/index.d.ts","./node_modules/@mui/material/esm/utils/createchainedfunction.d.ts","./node_modules/@mui/material/esm/utils/createsvgicon.d.ts","./node_modules/@mui/utils/esm/debounce/debounce.d.ts","./node_modules/@mui/utils/esm/debounce/index.d.ts","./node_modules/@mui/material/esm/utils/debounce.d.ts","./node_modules/@mui/utils/esm/deprecatedproptype/deprecatedproptype.d.ts","./node_modules/@mui/utils/esm/deprecatedproptype/index.d.ts","./node_modules/@mui/material/esm/utils/deprecatedproptype.d.ts","./node_modules/@mui/utils/esm/ismuielement/ismuielement.d.ts","./node_modules/@mui/utils/esm/ismuielement/index.d.ts","./node_modules/@mui/material/esm/utils/ismuielement.d.ts","./node_modules/@mui/material/esm/utils/memotheme.d.ts","./node_modules/@mui/utils/esm/ownerdocument/ownerdocument.d.ts","./node_modules/@mui/utils/esm/ownerdocument/index.d.ts","./node_modules/@mui/material/esm/utils/ownerdocument.d.ts","./node_modules/@mui/utils/esm/ownerwindow/ownerwindow.d.ts","./node_modules/@mui/utils/esm/ownerwindow/index.d.ts","./node_modules/@mui/material/esm/utils/ownerwindow.d.ts","./node_modules/@mui/utils/esm/requirepropfactory/requirepropfactory.d.ts","./node_modules/@mui/utils/esm/requirepropfactory/index.d.ts","./node_modules/@mui/material/esm/utils/requirepropfactory.d.ts","./node_modules/@mui/utils/esm/setref/setref.d.ts","./node_modules/@mui/utils/esm/setref/index.d.ts","./node_modules/@mui/material/esm/utils/setref.d.ts","./node_modules/@mui/utils/esm/useenhancedeffect/useenhancedeffect.d.ts","./node_modules/@mui/utils/esm/useenhancedeffect/index.d.ts","./node_modules/@mui/material/esm/utils/useenhancedeffect.d.ts","./node_modules/@mui/utils/esm/useid/useid.d.ts","./node_modules/@mui/utils/esm/useid/index.d.ts","./node_modules/@mui/material/esm/utils/useid.d.ts","./node_modules/@mui/utils/esm/unsupportedprop/unsupportedprop.d.ts","./node_modules/@mui/utils/esm/unsupportedprop/index.d.ts","./node_modules/@mui/material/esm/utils/unsupportedprop.d.ts","./node_modules/@mui/utils/esm/usecontrolled/usecontrolled.d.ts","./node_modules/@mui/utils/esm/usecontrolled/index.d.ts","./node_modules/@mui/material/esm/utils/usecontrolled.d.ts","./node_modules/@mui/utils/esm/useeventcallback/useeventcallback.d.ts","./node_modules/@mui/utils/esm/useeventcallback/index.d.ts","./node_modules/@mui/material/esm/utils/useeventcallback.d.ts","./node_modules/@mui/utils/esm/useforkref/useforkref.d.ts","./node_modules/@mui/utils/esm/useforkref/index.d.ts","./node_modules/@mui/material/esm/utils/useforkref.d.ts","./node_modules/@mui/material/esm/utils/mergeslotprops.d.ts","./node_modules/@mui/material/esm/utils/index.d.ts","./node_modules/@mui/material/esm/box/box.d.ts","./node_modules/@mui/material/esm/box/boxclasses.d.ts","./node_modules/@mui/material/esm/box/index.d.ts","./node_modules/@mui/material/esm/darkscrollbar/index.d.ts","./node_modules/@mui/material/esm/grow/grow.d.ts","./node_modules/@mui/material/esm/grow/index.d.ts","./node_modules/@mui/material/esm/nossr/nossr.types.d.ts","./node_modules/@mui/material/esm/nossr/nossr.d.ts","./node_modules/@mui/material/esm/nossr/index.d.ts","./node_modules/@mui/material/esm/textareaautosize/textareaautosize.types.d.ts","./node_modules/@mui/material/esm/textareaautosize/textareaautosize.d.ts","./node_modules/@mui/material/esm/textareaautosize/index.d.ts","./node_modules/@mui/material/esm/usescrolltrigger/usescrolltrigger.d.ts","./node_modules/@mui/material/esm/usescrolltrigger/index.d.ts","./node_modules/@mui/material/esm/zoom/zoom.d.ts","./node_modules/@mui/material/esm/zoom/index.d.ts","./node_modules/@mui/material/esm/globalstyles/globalstyles.d.ts","./node_modules/@mui/material/esm/globalstyles/index.d.ts","./node_modules/@mui/material/esm/version/index.d.ts","./node_modules/@mui/utils/esm/composeclasses/composeclasses.d.ts","./node_modules/@mui/utils/esm/composeclasses/index.d.ts","./node_modules/@mui/utils/esm/generateutilityclass/generateutilityclass.d.ts","./node_modules/@mui/utils/esm/generateutilityclass/index.d.ts","./node_modules/@mui/material/esm/generateutilityclass/index.d.ts","./node_modules/@mui/utils/esm/generateutilityclasses/generateutilityclasses.d.ts","./node_modules/@mui/utils/esm/generateutilityclasses/index.d.ts","./node_modules/@mui/material/esm/generateutilityclasses/index.d.ts","./node_modules/@mui/material/esm/unstable_trapfocus/focustrap.types.d.ts","./node_modules/@mui/material/esm/unstable_trapfocus/focustrap.d.ts","./node_modules/@mui/material/esm/unstable_trapfocus/index.d.ts","./node_modules/@mui/material/esm/initcolorschemescript/initcolorschemescript.d.ts","./node_modules/@mui/material/esm/initcolorschemescript/index.d.ts","./node_modules/@mui/material/esm/index.d.ts","./node_modules/@mui/icons-material/esm/dashboard.d.ts","./node_modules/@mui/icons-material/esm/description.d.ts","./node_modules/@mui/icons-material/esm/psychology.d.ts","./node_modules/@mui/icons-material/esm/build.d.ts","./node_modules/@mui/icons-material/esm/tune.d.ts","./node_modules/@mui/icons-material/esm/viewquilt.d.ts","./node_modules/@mui/icons-material/esm/expandmore.d.ts","./node_modules/@mui/icons-material/esm/add.d.ts","./node_modules/@mui/icons-material/esm/settings.d.ts","./node_modules/@mui/icons-material/esm/extension.d.ts","./node_modules/@mui/icons-material/esm/viewsidebaroutlined.d.ts","./node_modules/@mui/icons-material/esm/arrowbackoutlined.d.ts","./node_modules/@mui/icons-material/esm/arrowforwardoutlined.d.ts","./node_modules/@mui/icons-material/esm/restartalt.d.ts","./node_modules/@mui/icons-material/esm/systemupdatealt.d.ts","./node_modules/@mui/icons-material/esm/close.d.ts","./node_modules/@mui/icons-material/esm/folderopen.d.ts","./node_modules/@mui/icons-material/esm/visibility.d.ts","./node_modules/@mui/icons-material/esm/visibilityoff.d.ts","./node_modules/@mui/icons-material/esm/lightmode.d.ts","./node_modules/@mui/icons-material/esm/darkmode.d.ts","./node_modules/@mui/icons-material/esm/save.d.ts","./node_modules/@mui/icons-material/esm/keyboard.d.ts","./node_modules/@mui/icons-material/esm/language.d.ts","./node_modules/@mui/icons-material/esm/checkcircleoutline.d.ts","./node_modules/@mui/icons-material/esm/erroroutline.d.ts","./node_modules/@mui/icons-material/esm/download.d.ts","./node_modules/@mui/icons-material/esm/openinnew.d.ts","./src/shared/styles/themecontext.tsx","./node_modules/@mui/icons-material/esm/folder.d.ts","./node_modules/@mui/icons-material/esm/insertdrivefileoutlined.d.ts","./node_modules/@mui/icons-material/esm/arrowupward.d.ts","./src/app/components/directorybrowser.tsx","./node_modules/@mui/icons-material/esm/smarttoyoutlined.d.ts","./node_modules/@mui/icons-material/esm/alternateemail.d.ts","./node_modules/@mui/icons-material/esm/terminal.d.ts","./node_modules/@mui/icons-material/esm/buildoutlined.d.ts","./node_modules/@mui/icons-material/esm/viewquiltoutlined.d.ts","./node_modules/@mui/icons-material/esm/questionansweroutlined.d.ts","./node_modules/@mui/icons-material/esm/mapoutlined.d.ts","./node_modules/@mui/icons-material/esm/categoryoutlined.d.ts","./node_modules/@mui/icons-material/esm/tuneoutlined.d.ts","./src/app/components/commandpicker.tsx","./src/app/pages/commands/commands.tsx","./src/app/pages/settings/settings.tsx","./node_modules/@mui/icons-material/esm/expandless.d.ts","./node_modules/@mui/icons-material/esm/notificationsactive.d.ts","./node_modules/@mui/icons-material/esm/stopcircleoutlined.d.ts","./node_modules/@mui/icons-material/esm/send.d.ts","./node_modules/@mui/icons-material/esm/check.d.ts","./node_modules/@mui/icons-material/esm/edit.d.ts","./node_modules/@mui/icons-material/esm/search.d.ts","./node_modules/@mui/icons-material/esm/questionanswer.d.ts","./src/app/pages/agentchat/approvalbar.tsx","./src/app/components/globalapprovaloverlay.tsx","./src/app/components/layout/appshell.tsx","./node_modules/motion-utils/dist/index.d.ts","./node_modules/motion-dom/dist/index.d.ts","./node_modules/framer-motion/dist/types.d-docc-kzb.d.ts","./node_modules/framer-motion/dist/types/index.d.ts","./node_modules/@mui/icons-material/esm/gridviewrounded.d.ts","./node_modules/@mui/icons-material/esm/keyboardarrowdown.d.ts","./src/app/pages/dashboard/dashboardheader.tsx","./node_modules/@mui/icons-material/esm/checkcircle.d.ts","./node_modules/@mui/icons-material/esm/cancel.d.ts","./node_modules/@mui/icons-material/esm/dragindicator.d.ts","./node_modules/@mui/icons-material/esm/keyboardarrowup.d.ts","./node_modules/@mui/icons-material/esm/playarrow.d.ts","./node_modules/@mui/icons-material/esm/editoutlined.d.ts","./node_modules/@mui/icons-material/esm/deleteoutline.d.ts","./node_modules/@mui/icons-material/esm/adsclick.d.ts","./node_modules/@mui/icons-material/esm/folderoutlined.d.ts","./node_modules/@mui/icons-material/esm/psychologyoutlined.d.ts","./node_modules/@types/unist/index.d.ts","./node_modules/@types/hast/index.d.ts","./node_modules/vfile-message/lib/index.d.ts","./node_modules/vfile-message/index.d.ts","./node_modules/vfile/lib/index.d.ts","./node_modules/vfile/index.d.ts","./node_modules/unified/lib/callable-instance.d.ts","./node_modules/trough/lib/index.d.ts","./node_modules/trough/index.d.ts","./node_modules/unified/lib/index.d.ts","./node_modules/unified/index.d.ts","./node_modules/@types/mdast/index.d.ts","./node_modules/mdast-util-to-hast/lib/state.d.ts","./node_modules/mdast-util-to-hast/lib/footer.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/blockquote.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/break.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/code.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/delete.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/emphasis.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/footnote-reference.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/heading.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/html.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/image-reference.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/image.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/inline-code.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/link-reference.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/link.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/list-item.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/list.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/paragraph.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/root.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/strong.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/table.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/table-cell.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/table-row.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/text.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/thematic-break.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/index.d.ts","./node_modules/mdast-util-to-hast/lib/index.d.ts","./node_modules/mdast-util-to-hast/index.d.ts","./node_modules/remark-rehype/lib/index.d.ts","./node_modules/remark-rehype/index.d.ts","./node_modules/react-markdown/lib/index.d.ts","./node_modules/react-markdown/index.d.ts","./node_modules/micromark-util-types/index.d.ts","./node_modules/micromark-extension-gfm-footnote/lib/html.d.ts","./node_modules/micromark-extension-gfm-footnote/lib/syntax.d.ts","./node_modules/micromark-extension-gfm-footnote/index.d.ts","./node_modules/micromark-extension-gfm-strikethrough/lib/html.d.ts","./node_modules/micromark-extension-gfm-strikethrough/lib/syntax.d.ts","./node_modules/micromark-extension-gfm-strikethrough/index.d.ts","./node_modules/micromark-extension-gfm/index.d.ts","./node_modules/mdast-util-from-markdown/lib/types.d.ts","./node_modules/mdast-util-from-markdown/lib/index.d.ts","./node_modules/mdast-util-from-markdown/index.d.ts","./node_modules/mdast-util-to-markdown/lib/types.d.ts","./node_modules/mdast-util-to-markdown/lib/index.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/blockquote.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/break.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/code.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/definition.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/emphasis.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/heading.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/html.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/image.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/image-reference.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/inline-code.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/link.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/link-reference.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/list.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/list-item.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/paragraph.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/root.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/strong.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/text.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/thematic-break.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/index.d.ts","./node_modules/mdast-util-to-markdown/index.d.ts","./node_modules/mdast-util-gfm-footnote/lib/index.d.ts","./node_modules/mdast-util-gfm-footnote/index.d.ts","./node_modules/markdown-table/index.d.ts","./node_modules/mdast-util-gfm-table/lib/index.d.ts","./node_modules/mdast-util-gfm-table/index.d.ts","./node_modules/mdast-util-gfm/lib/index.d.ts","./node_modules/mdast-util-gfm/index.d.ts","./node_modules/remark-gfm/lib/index.d.ts","./node_modules/remark-gfm/index.d.ts","./node_modules/@mui/icons-material/esm/openinfull.d.ts","./src/app/pages/views/viewpreview.tsx","./src/app/pages/agentchat/viewbubble.tsx","./src/app/pages/agentchat/messagebubble.tsx","./node_modules/@mui/icons-material/esm/contentcopy.d.ts","./node_modules/@mui/icons-material/esm/bookmarkborder.d.ts","./node_modules/@mui/icons-material/esm/replay.d.ts","./node_modules/@mui/icons-material/esm/callsplit.d.ts","./node_modules/@mui/icons-material/esm/chevronleft.d.ts","./node_modules/@mui/icons-material/esm/chevronright.d.ts","./src/app/pages/agentchat/messageactionbar.tsx","./node_modules/@mui/icons-material/esm/block.d.ts","./node_modules/@mui/icons-material/esm/email.d.ts","./node_modules/@mui/icons-material/esm/event.d.ts","./node_modules/@mui/icons-material/esm/attachfile.d.ts","./node_modules/@mui/icons-material/esm/touchappoutlined.d.ts","./node_modules/@mui/icons-material/esm/keyboardoutlined.d.ts","./node_modules/@mui/icons-material/esm/cameraaltoutlined.d.ts","./node_modules/@mui/icons-material/esm/articleoutlined.d.ts","./node_modules/@mui/icons-material/esm/accounttreeoutlined.d.ts","./node_modules/@mui/icons-material/esm/codeoutlined.d.ts","./src/app/pages/agentchat/browseragentinlinefeed.tsx","./src/app/pages/agentchat/toolcallbubble.tsx","./src/app/pages/agentchat/toolgroupbubble.tsx","./node_modules/@mui/icons-material/esm/micnoneoutlined.d.ts","./node_modules/@mui/icons-material/esm/stop.d.ts","./src/app/pages/agentchat/templateinvokemodal.tsx","./src/app/pages/agentchat/chatinput.tsx","./node_modules/@mui/icons-material/esm/refresh.d.ts","./node_modules/@mui/icons-material/esm/difference.d.ts","./src/app/pages/agentchat/diffviewer.tsx","./src/app/pages/agentchat/agentchat.tsx","./src/app/pages/dashboard/agentcard.tsx","./node_modules/@mui/icons-material/esm/bolt.d.ts","./node_modules/@mui/icons-material/esm/removecircleoutline.d.ts","./src/app/pages/views/inputschemaform.tsx","./src/app/pages/dashboard/dashboardviewcard.tsx","./node_modules/@mui/icons-material/esm/arrowback.d.ts","./node_modules/@mui/icons-material/esm/arrowforward.d.ts","./node_modules/@mui/icons-material/esm/lock.d.ts","./node_modules/@mui/icons-material/esm/closefullscreen.d.ts","./src/app/pages/dashboard/browseragentoverlay.tsx","./src/app/pages/dashboard/browsercard.tsx","./node_modules/@mui/icons-material/esm/remove.d.ts","./node_modules/@mui/icons-material/esm/fitscreen.d.ts","./node_modules/@mui/icons-material/esm/autoawesome.d.ts","./src/app/pages/dashboard/canvascontrols.tsx","./node_modules/@mui/icons-material/esm/stickynote2outlined.d.ts","./node_modules/@mui/icons-material/esm/historyrounded.d.ts","./src/app/pages/dashboard/dashboardtoolbar.tsx","./node_modules/@types/react-dom/index.d.ts","./src/app/components/selectionoverlay.tsx","./src/app/pages/dashboard/dashboard.tsx","./node_modules/@mui/icons-material/esm/morevert.d.ts","./src/app/pages/dashboardselection/dashboardselection.tsx","./node_modules/@mui/icons-material/esm/delete.d.ts","./src/app/pages/templates/templates.tsx","./node_modules/@mui/icons-material/esm/keyboardarrowright.d.ts","./node_modules/@mui/icons-material/esm/morehoriz.d.ts","./node_modules/@mui/icons-material/esm/code.d.ts","./node_modules/@mui/icons-material/esm/autofixhigh.d.ts","./src/app/pages/skills/skillbuilderchat.tsx","./src/app/pages/skills/skills.tsx","./node_modules/@mui/icons-material/esm/schedule.d.ts","./node_modules/@mui/icons-material/esm/map.d.ts","./node_modules/@mui/icons-material/esm/hourglassempty.d.ts","./node_modules/@mui/icons-material/esm/storefront.d.ts","./node_modules/@mui/icons-material/esm/star.d.ts","./node_modules/@mui/icons-material/esm/sort.d.ts","./node_modules/@mui/icons-material/esm/cloud.d.ts","./node_modules/@mui/icons-material/esm/public.d.ts","./node_modules/@mui/icons-material/esm/link.d.ts","./node_modules/@mui/icons-material/esm/security.d.ts","./node_modules/@mui/icons-material/esm/pantool.d.ts","./src/app/pages/tools/tools.tsx","./src/app/components/richprompteditor.tsx","./src/app/pages/modes/modes.tsx","./src/app/pages/views/viewcard.tsx","./node_modules/@mui/icons-material/esm/dataobject.d.ts","./node_modules/@mui/icons-material/esm/javascript.d.ts","./node_modules/@mui/icons-material/esm/style.d.ts","./node_modules/@mui/icons-material/esm/insertdrivefile.d.ts","./node_modules/@codemirror/state/dist/index.d.ts","./node_modules/style-mod/src/style-mod.d.ts","./node_modules/@codemirror/view/dist/index.d.ts","./node_modules/@codemirror/commands/dist/index.d.ts","./node_modules/codemirror/dist/index.d.ts","./node_modules/@lezer/common/dist/index.d.ts","./node_modules/@lezer/lr/dist/index.d.ts","./node_modules/@lezer/highlight/dist/index.d.ts","./node_modules/@codemirror/language/dist/index.d.ts","./node_modules/@codemirror/theme-one-dark/dist/index.d.ts","./node_modules/@codemirror/autocomplete/dist/index.d.ts","./node_modules/@codemirror/lang-html/dist/index.d.ts","./node_modules/@codemirror/lang-python/dist/index.d.ts","./node_modules/@codemirror/lint/dist/index.d.ts","./node_modules/@codemirror/lang-json/dist/index.d.ts","./src/app/pages/views/codeeditor.tsx","./src/app/pages/views/vieweditor.tsx","./src/app/pages/views/viewrundialog.tsx","./src/app/pages/views/views.tsx","./src/app/pages/customization/customization.tsx","./src/app/components/keyboardshortcutshelp.tsx","./src/app/main.tsx","./src/index.tsx","./src/app/components/slashcommandpicker.tsx","./src/app/pages/agentchat/branchnavigator.tsx","./src/app/pages/dashboard/closeagentdialog.tsx","./src/shared/modals/underconstruction/underconstruction.tsx","./src/shared/styles/getstylevalue.tsx","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/blob.d.ts","./node_modules/@types/node/web-globals/console.d.ts","./node_modules/@types/node/web-globals/crypto.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/encoding.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/undici-types/utility.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client-stats.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/h2c-client.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-call-history.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/snapshot-agent.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/cache-interceptor.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/web-globals/importmeta.d.ts","./node_modules/@types/node/web-globals/messaging.d.ts","./node_modules/@types/node/web-globals/navigator.d.ts","./node_modules/@types/node/web-globals/performance.d.ts","./node_modules/@types/node/web-globals/storage.d.ts","./node_modules/@types/node/web-globals/streams.d.ts","./node_modules/@types/node/web-globals/timers.d.ts","./node_modules/@types/node/web-globals/url.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/inspector/promises.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/path/posix.d.ts","./node_modules/@types/node/path/win32.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/quic.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/test/reporters.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/util/types.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/@types/connect/index.d.ts","./node_modules/@types/body-parser/index.d.ts","./node_modules/@types/bonjour/index.d.ts","./node_modules/@types/send/index.d.ts","./node_modules/@types/qs/index.d.ts","./node_modules/@types/range-parser/index.d.ts","./node_modules/@types/express-serve-static-core/index.d.ts","./node_modules/@types/connect-history-api-fallback/index.d.ts","./node_modules/@types/ms/index.d.ts","./node_modules/@types/debug/index.d.ts","./node_modules/@types/estree/index.d.ts","./node_modules/@types/json-schema/index.d.ts","./node_modules/@types/eslint/use-at-your-own-risk.d.ts","./node_modules/@types/eslint/index.d.ts","./node_modules/@types/eslint-scope/index.d.ts","./node_modules/@types/estree-jsx/index.d.ts","./node_modules/@types/http-errors/index.d.ts","./node_modules/@types/mime/index.d.ts","./node_modules/@types/serve-static/node_modules/@types/send/index.d.ts","./node_modules/@types/serve-static/index.d.ts","./node_modules/@types/express/node_modules/@types/express-serve-static-core/index.d.ts","./node_modules/@types/express/index.d.ts","./node_modules/@types/hoist-non-react-statics/index.d.ts","./node_modules/@types/html-minifier-terser/index.d.ts","./node_modules/@types/http-proxy/index.d.ts","./node_modules/@types/node-forge/index.d.ts","./node_modules/@types/parse-json/index.d.ts","./node_modules/@types/prismjs/index.d.ts","./node_modules/@types/react-redux/node_modules/redux/index.d.ts","./node_modules/@types/react-redux/index.d.ts","./node_modules/@types/react-syntax-highlighter/index.d.ts","./node_modules/@types/retry/index.d.ts","./node_modules/@types/serve-index/index.d.ts","./node_modules/@types/sockjs/index.d.ts","./node_modules/@types/use-sync-external-store/index.d.ts","./node_modules/@types/ws/index.d.ts"],"fileIdsList":[[1081,1083,1086,1111,1173,1181,1185,1188,1190,1191,1192,1204],[1081,1083,1111,1173,1181,1185,1188,1190,1191,1192,1204],[1081,1086,1089,1091,1111,1173,1181,1185,1188,1190,1191,1192,1204],[1083,1089,1094,1111,1173,1181,1185,1188,1190,1191,1192,1204],[1089,1091,1111,1173,1181,1185,1188,1190,1191,1192,1204],[1081,1082,1083,1086,1087,1088,1111,1173,1181,1185,1188,1190,1191,1192,1204],[1111,1173,1181,1185,1188,1190,1191,1192,1204],[1081,1089,1111,1173,1181,1185,1188,1190,1191,1192,1204],[1081,1082,1111,1173,1181,1185,1188,1190,1191,1192,1204],[169,170,1111,1173,1181,1185,1188,1190,1191,1192,1204],[171,172,1111,1173,1181,1185,1188,1190,1191,1192,1204],[171,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,175,178,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,173,1111,1173,1181,1185,1188,1190,1191,1192,1204],[169,175,1111,1173,1181,1185,1188,1190,1191,1192,1204],[173,175,176,177,178,180,181,182,183,184,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,179,1111,1173,1181,1185,1188,1190,1191,1192,1204],[175,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,177,1111,1173,1181,1185,1188,1190,1191,1192,1204],[179,1111,1173,1181,1185,1188,1190,1191,1192,1204],[185,1111,1173,1181,1185,1188,1190,1191,1192,1204],[85,169,1111,1173,1181,1185,1188,1190,1191,1192,1204],[174,1111,1173,1181,1185,1188,1190,1191,1192,1204],[165,1111,1173,1181,1185,1188,1190,1191,1192,1204],[175,186,187,188,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,1111,1173,1181,1185,1188,1190,1191,1192,1204],[175,186,187,1111,1173,1181,1185,1188,1190,1191,1192,1204],[189,190,1111,1173,1181,1185,1188,1190,1191,1192,1204],[189,1111,1173,1181,1185,1188,1190,1191,1192,1204],[167,1111,1173,1181,1185,1188,1190,1191,1192,1204],[166,1111,1173,1181,1185,1188,1190,1191,1192,1204],[168,1111,1173,1181,1185,1188,1190,1191,1192,1204],[1086,1111,1173,1181,1185,1188,1190,1191,1192,1204],[314,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,325,329,382,480,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[480,481,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,315,474,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[474,475,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,315,477,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[477,478,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,320,329,483,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[483,484,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,314,315,323,326,327,329,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[327,330,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,334,335,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[335,336,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,311,325,338,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[338,339,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,315,323,326,329,343,369,371,372,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[372,373,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,311,314,329,375,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[375,376,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,329,377,378,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[378,379,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,329,382,384,385,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[385,386,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,311,329,388,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[388,389,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,394,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[394,395,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,320,329,391,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[391,392,1111,1173,1181,1185,1188,1190,1191,1192,1204],[162,304,311,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[806,807,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,314,329,397,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[397,398,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,311,320,405,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[405,406,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,317,318,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[316,318,319,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,315,316,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,311,400,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,401,1111,1173,1181,1185,1188,1190,1191,1192,1204],[400,401,402,403,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,311,326,423,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[423,424,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,320,329,408,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[408,409,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,315,411,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[411,412,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,414,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[414,415,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,329,334,417,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[417,418,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,420,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[420,421,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,315,329,427,428,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[428,429,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,311,329,341,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[341,342,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,315,431,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[431,432,1111,1173,1181,1185,1188,1190,1191,1192,1204],[628,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,315,329,382,438,439,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[439,440,1111,1173,1181,1185,1188,1190,1191,1192,1204],[141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,442,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[304,1111,1173,1181,1185,1188,1190,1191,1192,1204],[442,443,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[445,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,315,326,329,382,387,459,460,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[460,461,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,315,447,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[447,448,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,315,450,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[450,451,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,334,453,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[453,454,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,334,463,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[463,464,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,311,466,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[466,467,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,315,326,329,382,387,459,470,471,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[471,472,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,311,320,486,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[486,487,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,382,1111,1173,1181,1185,1188,1190,1191,1192,1204],[383,1111,1173,1181,1185,1188,1190,1191,1192,1204],[304,315,491,492,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[492,493,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,311,498,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,499,1111,1173,1181,1185,1188,1190,1191,1192,1204],[498,499,500,501,1111,1173,1181,1185,1188,1190,1191,1192,1204],[500,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,315,329,334,495,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[495,496,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,315,503,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[503,504,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,311,506,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[506,507,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,311,509,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[509,510,1111,1173,1181,1185,1188,1190,1191,1192,1204],[828,1111,1173,1181,1185,1188,1190,1191,1192,1204],[831,1111,1173,1181,1185,1188,1190,1191,1192,1204],[304,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[822,1111,1173,1181,1185,1188,1190,1191,1192,1204],[162,304,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[515,516,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,311,512,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[512,513,1111,1173,1181,1185,1188,1190,1191,1192,1204],[810,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,311,518,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[518,519,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,311,320,321,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[321,322,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,311,521,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[521,522,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,527,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[527,528,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,315,524,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[524,525,1111,1173,1181,1185,1188,1190,1191,1192,1204],[161,314,320,323,326,331,334,337,340,343,364,369,371,374,377,380,384,387,390,393,396,399,404,407,410,413,416,419,422,425,430,433,441,444,446,449,452,455,459,462,465,468,470,473,476,479,482,485,488,491,494,497,502,505,508,511,514,517,520,523,526,529,532,535,538,541,544,547,550,553,556,559,562,565,568,571,573,576,579,582,586,587,590,594,597,602,605,608,611,615,618,624,627,629,632,636,639,642,645,648,651,654,657,660,663,667,671,673,676,679,682,685,688,691,695,697,700,703,706,709,712,715,718,721,724,727,754,805,808,809,811,814,817,819,821,823,824,826,829,832,835,837,1111,1173,1181,1185,1188,1190,1191,1192,1204],[836,1111,1173,1181,1185,1188,1190,1191,1192,1204],[244,1111,1173,1181,1185,1188,1190,1191,1192,1204],[536,537,1111,1173,1181,1185,1188,1190,1191,1192,1204],[304,315,491,536,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[530,531,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,530,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[489,490,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,315,489,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[533,534,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,311,511,533,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[162,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,315,320,329,426,1111,1173,1181,1185,1188,1190,1191,1192,1204],[539,540,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,315,539,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[542,543,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,311,334,542,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[563,564,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,563,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[551,552,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,329,551,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[545,546,1111,1173,1181,1185,1188,1190,1191,1192,1204],[304,315,545,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[554,555,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,320,554,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[548,549,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,315,548,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[557,558,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,315,557,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[560,561,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,315,329,334,560,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[566,567,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,566,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[577,578,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,315,326,329,382,387,459,573,576,577,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[569,570,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,320,569,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[572,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,311,565,1111,1173,1181,1185,1188,1190,1191,1192,1204],[580,581,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,315,326,329,541,580,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[456,457,458,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,311,329,364,387,457,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[584,585,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,315,538,583,584,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[812,813,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,812,1111,1173,1181,1185,1188,1190,1191,1192,1204],[588,589,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,315,329,491,588,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[592,593,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,315,591,592,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[595,596,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,311,329,591,595,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[324,325,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,311,324,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[574,575,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,315,326,328,329,382,387,459,574,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,329,361,364,365,1111,1173,1181,1185,1188,1190,1191,1192,1204],[366,367,368,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,366,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[362,363,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,362,1111,1173,1181,1185,1188,1190,1191,1192,1204],[603,604,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,315,329,427,603,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[598,600,601,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,505,1111,1173,1181,1185,1188,1190,1191,1192,1204],[505,1111,1173,1181,1185,1188,1190,1191,1192,1204],[599,1111,1173,1181,1185,1188,1190,1191,1192,1204],[606,607,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,311,329,606,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[609,610,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,609,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[613,614,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,315,494,538,579,590,612,613,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,579,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[616,617,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,311,616,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[469,1111,1173,1181,1185,1188,1190,1191,1192,1204],[622,623,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,311,329,619,621,622,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,620,1111,1173,1181,1185,1188,1190,1191,1192,1204],[630,631,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,315,329,382,627,629,630,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[625,626,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,315,326,625,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[634,635,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,315,329,488,633,634,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[640,641,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,315,329,488,639,640,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[643,644,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,315,643,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[646,647,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,734,1111,1173,1181,1185,1188,1190,1191,1192,1204],[668,669,670,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,668,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[649,650,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,320,649,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[652,653,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,315,652,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[655,656,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,315,329,382,441,655,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[658,659,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,314,315,658,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[661,662,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,315,329,660,661,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[664,665,666,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,326,664,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[164,304,305,306,307,308,309,728,729,730,734,1111,1173,1181,1185,1188,1190,1191,1192,1204],[728,729,730,1111,1173,1181,1185,1188,1190,1191,1192,1204],[733,1111,1173,1181,1185,1188,1190,1191,1192,1204],[85,304,1111,1173,1181,1185,1188,1190,1191,1192,1204],[164,310,732,733,1111,1173,1181,1185,1188,1190,1191,1192,1204],[162,164,281,304,305,306,307,308,309,1111,1173,1181,1185,1188,1190,1191,1192,1204],[164,304,305,306,307,308,309,310,731,1111,1173,1181,1185,1188,1190,1191,1192,1204],[310,731,732,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,164,307,1111,1173,1181,1185,1188,1190,1191,1192,1204],[307,1111,1173,1181,1185,1188,1190,1191,1192,1204],[162,163,164,281,304,305,306,307,308,309,728,729,730,731,733,734,735,736,737,738,739,740,741,744,745,746,747,748,749,750,751,752,753,1111,1173,1181,1185,1188,1190,1191,1192,1204],[304,314,317,320,323,326,331,334,337,340,343,369,374,377,380,387,390,393,396,399,404,407,410,413,416,419,422,425,430,433,441,444,449,452,455,459,462,465,468,473,476,479,482,485,488,491,494,497,502,505,508,511,514,517,520,523,526,529,532,535,538,541,544,547,550,553,556,559,562,565,568,571,573,576,579,582,586,590,594,597,602,605,608,611,615,618,624,627,632,636,639,642,645,648,651,654,657,660,663,667,671,676,679,682,685,688,691,695,697,700,703,706,709,712,718,721,724,727,728,1111,1173,1181,1185,1188,1190,1191,1192,1204],[314,317,320,323,326,331,334,337,340,343,369,374,377,380,387,390,393,396,399,404,407,410,413,416,419,422,425,430,433,441,444,446,449,452,455,459,462,465,468,473,476,479,482,485,488,491,494,497,502,505,508,511,514,517,520,523,526,529,532,535,538,541,544,547,550,553,556,559,562,565,568,571,573,576,579,582,586,587,590,594,597,602,605,608,611,615,618,624,627,632,636,639,642,645,648,651,654,657,660,663,667,671,673,676,679,682,685,688,691,695,697,700,703,706,709,712,718,721,724,727,1111,1173,1181,1185,1188,1190,1191,1192,1204],[304,308,1111,1173,1181,1185,1188,1190,1191,1192,1204],[304,734,742,743,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,244,281,304,732,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,244,273,304,733,1111,1173,1181,1185,1188,1190,1191,1192,1204],[734,1111,1173,1181,1185,1188,1190,1191,1192,1204],[731,734,1111,1173,1181,1185,1188,1190,1191,1192,1204],[304,728,1111,1173,1181,1185,1188,1190,1191,1192,1204],[312,313,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,311,312,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[672,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,329,473,1111,1173,1181,1185,1188,1190,1191,1192,1204],[674,675,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,315,329,427,674,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[710,711,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,320,710,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[698,699,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,311,698,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[677,678,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,677,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[680,681,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,315,680,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[683,684,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,683,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[707,708,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,707,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[686,687,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,686,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[692,696,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,323,329,571,615,682,691,692,695,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[689,690,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,314,322,1111,1173,1181,1185,1188,1190,1191,1192,1204],[701,702,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,701,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[704,705,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,311,320,329,704,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[716,717,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,311,314,329,715,716,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[713,714,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,314,320,329,713,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[815,816,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,815,1111,1173,1181,1185,1188,1190,1191,1192,1204],[719,720,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,315,329,491,494,502,508,535,538,590,615,719,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[722,723,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,311,320,722,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[725,726,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,315,725,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[693,694,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,311,693,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[637,638,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,304,315,329,369,382,637,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[382,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,381,1111,1173,1181,1185,1188,1190,1191,1192,1204],[332,333,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,304,308,311,332,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,833,1111,1173,1181,1185,1188,1190,1191,1192,1204],[833,834,1111,1173,1181,1185,1188,1190,1191,1192,1204],[370,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,1111,1173,1181,1185,1188,1190,1191,1192,1204],[266,734,1111,1173,1181,1185,1188,1190,1191,1192,1204],[818,1111,1173,1181,1185,1188,1190,1191,1192,1204],[758,1111,1173,1181,1185,1188,1190,1191,1192,1204],[761,1111,1173,1181,1185,1188,1190,1191,1192,1204],[765,1111,1173,1181,1185,1188,1190,1191,1192,1204],[768,1111,1173,1181,1185,1188,1190,1191,1192,1204],[329,756,759,762,763,766,769,772,773,776,779,782,785,788,791,794,797,800,803,804,1111,1173,1181,1185,1188,1190,1191,1192,1204],[771,1111,1173,1181,1185,1188,1190,1191,1192,1204],[196,734,1111,1173,1181,1185,1188,1190,1191,1192,1204],[328,1111,1173,1181,1185,1188,1190,1191,1192,1204],[775,1111,1173,1181,1185,1188,1190,1191,1192,1204],[778,1111,1173,1181,1185,1188,1190,1191,1192,1204],[781,1111,1173,1181,1185,1188,1190,1191,1192,1204],[784,1111,1173,1181,1185,1188,1190,1191,1192,1204],[304,328,754,1111,1173,1181,1185,1188,1190,1191,1192,1204],[793,1111,1173,1181,1185,1188,1190,1191,1192,1204],[796,1111,1173,1181,1185,1188,1190,1191,1192,1204],[787,1111,1173,1181,1185,1188,1190,1191,1192,1204],[799,1111,1173,1181,1185,1188,1190,1191,1192,1204],[802,1111,1173,1181,1185,1188,1190,1191,1192,1204],[790,1111,1173,1181,1185,1188,1190,1191,1192,1204],[820,1111,1173,1181,1185,1188,1190,1191,1192,1204],[238,240,242,1111,1173,1181,1185,1188,1190,1191,1192,1204],[239,1111,1173,1181,1185,1188,1190,1191,1192,1204],[238,1111,1173,1181,1185,1188,1190,1191,1192,1204],[241,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,186,1111,1173,1181,1185,1188,1190,1191,1192,1204],[194,1111,1173,1181,1185,1188,1190,1191,1192,1204],[85,186,191,193,195,1111,1173,1181,1185,1188,1190,1191,1192,1204],[192,1111,1173,1181,1185,1188,1190,1191,1192,1204],[198,1111,1173,1181,1185,1188,1190,1191,1192,1204],[199,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,198,200,210,215,219,221,223,225,227,229,231,233,235,248,1111,1173,1181,1185,1188,1190,1191,1192,1204],[249,250,1111,1173,1181,1185,1188,1190,1191,1192,1204],[196,198,201,210,215,1111,1173,1181,1185,1188,1190,1191,1192,1204],[216,1111,1173,1181,1185,1188,1190,1191,1192,1204],[267,1111,1173,1181,1185,1188,1190,1191,1192,1204],[218,1111,1173,1181,1185,1188,1190,1191,1192,1204],[162,287,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,210,215,286,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,196,215,287,1111,1173,1181,1185,1188,1190,1191,1192,1204],[286,287,289,1111,1173,1181,1185,1188,1190,1191,1192,1204],[162,215,251,1111,1173,1181,1185,1188,1190,1191,1192,1204],[252,1111,1173,1181,1185,1188,1190,1191,1192,1204],[162,1111,1173,1181,1185,1188,1190,1191,1192,1204],[201,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,196,210,215,1111,1173,1181,1185,1188,1190,1191,1192,1204],[254,1111,1173,1181,1185,1188,1190,1191,1192,1204],[196,1111,1173,1181,1185,1188,1190,1191,1192,1204],[196,201,202,203,210,211,213,1111,1173,1181,1185,1188,1190,1191,1192,1204],[211,214,1111,1173,1181,1185,1188,1190,1191,1192,1204],[212,1111,1173,1181,1185,1188,1190,1191,1192,1204],[224,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,273,274,275,1111,1173,1181,1185,1188,1190,1191,1192,1204],[277,1111,1173,1181,1185,1188,1190,1191,1192,1204],[274,276,277,278,279,280,1111,1173,1181,1185,1188,1190,1191,1192,1204],[274,1111,1173,1181,1185,1188,1190,1191,1192,1204],[220,1111,1173,1181,1185,1188,1190,1191,1192,1204],[222,1111,1173,1181,1185,1188,1190,1191,1192,1204],[236,1111,1173,1181,1185,1188,1190,1191,1192,1204],[196,215,244,1111,1173,1181,1185,1188,1190,1191,1192,1204],[245,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,196,262,291,304,1111,1173,1181,1185,1188,1190,1191,1192,1204],[162,291,1111,1173,1181,1185,1188,1190,1191,1192,1204],[201,203,210,291,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,210,215,251,1111,1173,1181,1185,1188,1190,1191,1192,1204],[291,292,293,294,295,296,1111,1173,1181,1185,1188,1190,1191,1192,1204],[196,198,200,201,202,203,210,213,215,217,219,221,223,225,227,229,231,233,235,237,243,246,248,251,253,255,257,260,262,264,266,268,270,271,277,279,281,282,283,285,288,290,297,302,303,1111,1173,1181,1185,1188,1190,1191,1192,1204],[272,1111,1173,1181,1185,1188,1190,1191,1192,1204],[226,1111,1173,1181,1185,1188,1190,1191,1192,1204],[228,1111,1173,1181,1185,1188,1190,1191,1192,1204],[284,1111,1173,1181,1185,1188,1190,1191,1192,1204],[230,1111,1173,1181,1185,1188,1190,1191,1192,1204],[232,1111,1173,1181,1185,1188,1190,1191,1192,1204],[247,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,162,196,201,203,298,304,1111,1173,1181,1185,1188,1190,1191,1192,1204],[298,299,300,301,1111,1173,1181,1185,1188,1190,1191,1192,1204],[162,298,1111,1173,1181,1185,1188,1190,1191,1192,1204],[197,1111,1173,1181,1185,1188,1190,1191,1192,1204],[256,1111,1173,1181,1185,1188,1190,1191,1192,1204],[255,1111,1173,1181,1185,1188,1190,1191,1192,1204],[204,1111,1173,1181,1185,1188,1190,1191,1192,1204],[207,1111,1173,1181,1185,1188,1190,1191,1192,1204],[204,205,206,207,208,209,1111,1173,1181,1185,1188,1190,1191,1192,1204],[85,1111,1173,1181,1185,1188,1190,1191,1192,1204],[85,196,204,205,206,1111,1173,1181,1185,1188,1190,1191,1192,1204],[269,1111,1173,1181,1185,1188,1190,1191,1192,1204],[243,1111,1173,1181,1185,1188,1190,1191,1192,1204],[234,1111,1173,1181,1185,1188,1190,1191,1192,1204],[265,1111,1173,1181,1185,1188,1190,1191,1192,1204],[261,1111,1173,1181,1185,1188,1190,1191,1192,1204],[215,1111,1173,1181,1185,1188,1190,1191,1192,1204],[258,259,1111,1173,1181,1185,1188,1190,1191,1192,1204],[263,1111,1173,1181,1185,1188,1190,1191,1192,1204],[757,1111,1173,1181,1185,1188,1190,1191,1192,1204],[755,1111,1173,1181,1185,1188,1190,1191,1192,1204],[825,1111,1173,1181,1185,1188,1190,1191,1192,1204],[760,1111,1173,1181,1185,1188,1190,1191,1192,1204],[764,1111,1173,1181,1185,1188,1190,1191,1192,1204],[86,1111,1173,1181,1185,1188,1190,1191,1192,1204],[767,1111,1173,1181,1185,1188,1190,1191,1192,1204],[827,1111,1173,1181,1185,1188,1190,1191,1192,1204],[830,1111,1173,1181,1185,1188,1190,1191,1192,1204],[770,1111,1173,1181,1185,1188,1190,1191,1192,1204],[774,1111,1173,1181,1185,1188,1190,1191,1192,1204],[777,1111,1173,1181,1185,1188,1190,1191,1192,1204],[780,1111,1173,1181,1185,1188,1190,1191,1192,1204],[86,87,1111,1173,1181,1185,1188,1190,1191,1192,1204],[783,1111,1173,1181,1185,1188,1190,1191,1192,1204],[792,1111,1173,1181,1185,1188,1190,1191,1192,1204],[795,1111,1173,1181,1185,1188,1190,1191,1192,1204],[786,1111,1173,1181,1185,1188,1190,1191,1192,1204],[798,1111,1173,1181,1185,1188,1190,1191,1192,1204],[801,1111,1173,1181,1185,1188,1190,1191,1192,1204],[789,1111,1173,1181,1185,1188,1190,1191,1192,1204],[360,1111,1173,1181,1185,1188,1190,1191,1192,1204],[354,356,1111,1173,1181,1185,1188,1190,1191,1192,1204],[344,354,355,357,358,359,1111,1173,1181,1185,1188,1190,1191,1192,1204],[354,1111,1173,1181,1185,1188,1190,1191,1192,1204],[344,354,1111,1173,1181,1185,1188,1190,1191,1192,1204],[345,346,347,348,349,350,351,352,353,1111,1173,1181,1185,1188,1190,1191,1192,1204],[345,349,350,353,354,357,1111,1173,1181,1185,1188,1190,1191,1192,1204],[345,346,347,348,349,350,351,352,353,354,355,357,358,1111,1173,1181,1185,1188,1190,1191,1192,1204],[344,345,346,347,348,349,350,351,352,353,1111,1173,1181,1185,1188,1190,1191,1192,1204],[90,91,92,93,94,1111,1173,1181,1185,1188,1190,1191,1192,1204],[1111,1173,1181,1185,1187,1188,1190,1191,1192,1204,1229,1230],[1111,1173,1179,1181,1185,1188,1190,1191,1192,1204,1229],[1111,1173,1181,1185,1188,1190,1191,1192,1204,1221,1229,1236],[1111,1173,1181,1185,1187,1188,1190,1191,1192,1204,1229],[1111,1173,1181,1185,1188,1190,1191,1192,1204,1238],[1111,1173,1181,1185,1188,1190,1191,1192,1204,1240,1243,1245],[1111,1173,1181,1185,1188,1190,1191,1192,1204,1240,1241,1242,1245],[1111,1173,1181,1185,1188,1190,1191,1192,1204,1243],[1111,1173,1181,1185,1188,1190,1191,1192,1204,1240,1245],[1111,1173,1181,1184,1185,1187,1188,1190,1191,1192,1204,1229,1233,1234,1235],[1111,1173,1181,1185,1188,1190,1191,1192,1204,1231,1234,1236,1249,1250],[912,1111,1173,1181,1185,1188,1190,1191,1192,1204],[1111,1173,1181,1184,1185,1187,1188,1189,1190,1191,1192,1194,1204,1209,1221,1229],[1111,1173,1181,1185,1188,1190,1191,1192,1204,1229],[1111,1170,1171,1173,1181,1185,1188,1190,1191,1192,1204],[1111,1172,1173,1181,1185,1188,1190,1191,1192,1204],[1173,1181,1185,1188,1190,1191,1192,1204],[1111,1173,1181,1185,1188,1190,1191,1192,1204,1212],[1111,1173,1174,1179,1181,1184,1185,1188,1190,1191,1192,1194,1204,1209,1221],[1111,1173,1174,1175,1181,1184,1185,1188,1190,1191,1192,1204],[1111,1173,1176,1181,1185,1188,1190,1191,1192,1204,1222],[1111,1173,1177,1178,1181,1185,1188,1190,1191,1192,1195,1204],[1111,1173,1178,1181,1185,1188,1190,1191,1192,1204,1209,1218],[1111,1173,1179,1181,1184,1185,1188,1190,1191,1192,1194,1204],[1111,1172,1173,1180,1181,1185,1188,1190,1191,1192,1204],[1111,1173,1181,1182,1185,1188,1190,1191,1192,1204],[1111,1173,1181,1183,1184,1185,1188,1190,1191,1192,1204],[1111,1172,1173,1181,1184,1185,1188,1190,1191,1192,1204],[1111,1173,1181,1184,1185,1186,1188,1190,1191,1192,1204,1209,1221],[1111,1173,1181,1184,1185,1186,1188,1190,1191,1192,1204,1209,1212],[1111,1160,1173,1181,1184,1185,1187,1188,1190,1191,1192,1194,1204,1209,1221],[1111,1173,1181,1184,1185,1187,1188,1190,1191,1192,1194,1204,1209,1218,1221],[1111,1173,1181,1185,1187,1188,1189,1190,1191,1192,1204,1209,1218,1221],[1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228],[1111,1173,1181,1184,1185,1188,1190,1191,1192,1204],[1111,1173,1181,1185,1188,1190,1192,1204],[1111,1173,1181,1185,1188,1190,1191,1192,1193,1204,1221],[1111,1173,1181,1184,1185,1188,1190,1191,1192,1194,1204,1209],[1111,1173,1181,1185,1188,1190,1191,1192,1195,1204],[1111,1173,1181,1185,1188,1190,1191,1192,1196,1204],[1111,1173,1181,1184,1185,1188,1190,1191,1192,1199,1204],[1111,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228],[1111,1173,1181,1185,1188,1190,1191,1192,1201,1204],[1111,1173,1181,1185,1188,1190,1191,1192,1202,1204],[1111,1173,1178,1181,1185,1188,1190,1191,1192,1194,1204,1212],[1111,1173,1181,1184,1185,1188,1190,1191,1192,1204,1205],[1111,1173,1181,1185,1188,1190,1191,1192,1204,1206,1222,1225],[1111,1173,1181,1184,1185,1188,1190,1191,1192,1204,1209,1211,1212],[1111,1173,1181,1185,1188,1190,1191,1192,1204,1210,1212],[1111,1173,1181,1185,1188,1190,1191,1192,1204,1212,1222],[1111,1173,1181,1185,1188,1190,1191,1192,1204,1213],[1111,1170,1173,1181,1185,1188,1190,1191,1192,1204,1209,1215],[1111,1173,1181,1185,1188,1190,1191,1192,1204,1209,1214],[1111,1173,1181,1184,1185,1188,1190,1191,1192,1204,1216,1217],[1111,1173,1181,1185,1188,1190,1191,1192,1204,1216,1217],[1111,1173,1178,1181,1185,1188,1190,1191,1192,1194,1204,1209,1218],[1111,1173,1181,1185,1188,1190,1191,1192,1204,1219],[1111,1173,1181,1185,1188,1190,1191,1192,1194,1204,1220],[1111,1173,1181,1185,1187,1188,1190,1191,1192,1202,1204,1221],[1111,1173,1181,1185,1188,1190,1191,1192,1204,1222,1223],[1111,1173,1178,1181,1185,1188,1190,1191,1192,1204,1223],[1111,1173,1181,1185,1188,1190,1191,1192,1204,1209,1224],[1111,1173,1181,1185,1188,1190,1191,1192,1193,1204,1225],[1111,1173,1181,1185,1188,1190,1191,1192,1204,1226],[1111,1173,1176,1181,1185,1188,1190,1191,1192,1204],[1111,1173,1178,1181,1185,1188,1190,1191,1192,1204],[1111,1173,1181,1185,1188,1190,1191,1192,1204,1222],[1111,1160,1173,1181,1185,1188,1190,1191,1192,1204],[1111,1173,1181,1185,1188,1190,1191,1192,1204,1221],[1111,1173,1181,1185,1188,1190,1191,1192,1204,1227],[1111,1173,1181,1185,1188,1190,1191,1192,1199,1204],[1111,1173,1181,1185,1188,1190,1191,1192,1204,1217],[1111,1160,1173,1181,1184,1185,1186,1188,1190,1191,1192,1199,1204,1209,1212,1221,1224,1225,1227],[1111,1173,1181,1185,1188,1190,1191,1192,1204,1209,1228],[87,1111,1173,1181,1185,1188,1190,1191,1192,1204,1252,1258],[87,1111,1173,1181,1185,1188,1190,1191,1192,1204,1260],[381,434,435,436,437,1111,1173,1181,1185,1188,1190,1191,1192,1204],[84,85,86,1111,1173,1181,1185,1188,1190,1191,1192,1204],[1111,1173,1181,1185,1188,1190,1191,1192,1204,1209,1229],[1111,1173,1181,1185,1188,1190,1191,1192,1204,1251],[1111,1173,1181,1185,1187,1188,1190,1191,1192,1204,1229,1246,1248],[1111,1173,1181,1185,1188,1190,1191,1192,1204,1209,1229,1247],[1111,1173,1181,1184,1185,1187,1188,1189,1190,1191,1192,1194,1204,1209,1218,1221,1228,1229],[87,896,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,244,895,896,897,1111,1173,1181,1185,1188,1190,1191,1192,1204],[103,1111,1173,1181,1185,1188,1190,1191,1192,1204],[956,959,962,964,965,966,1111,1173,1181,1185,1188,1190,1191,1192,1204],[923,951,956,959,962,964,966,1111,1173,1181,1185,1188,1190,1191,1192,1204],[923,951,956,959,962,966,1111,1173,1181,1185,1188,1190,1191,1192,1204],[989,990,994,1111,1173,1181,1185,1188,1190,1191,1192,1204],[966,989,991,994,1111,1173,1181,1185,1188,1190,1191,1192,1204],[966,989,991,993,1111,1173,1181,1185,1188,1190,1191,1192,1204],[923,951,966,989,991,992,994,1111,1173,1181,1185,1188,1190,1191,1192,1204],[991,994,995,1111,1173,1181,1185,1188,1190,1191,1192,1204],[966,989,991,994,996,1111,1173,1181,1185,1188,1190,1191,1192,1204],[913,923,924,925,949,950,951,1111,1173,1181,1185,1188,1190,1191,1192,1204],[913,924,951,1111,1173,1181,1185,1188,1190,1191,1192,1204],[913,923,924,951,1111,1173,1181,1185,1188,1190,1191,1192,1204],[926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,1111,1173,1181,1185,1188,1190,1191,1192,1204],[913,917,923,925,951,1111,1173,1181,1185,1188,1190,1191,1192,1204],[967,968,988,1111,1173,1181,1185,1188,1190,1191,1192,1204],[923,951,989,991,994,1111,1173,1181,1185,1188,1190,1191,1192,1204],[923,951,1111,1173,1181,1185,1188,1190,1191,1192,1204],[969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,1111,1173,1181,1185,1188,1190,1191,1192,1204],[912,923,951,1111,1173,1181,1185,1188,1190,1191,1192,1204],[956,957,958,962,966,1111,1173,1181,1185,1188,1190,1191,1192,1204],[956,959,962,966,1111,1173,1181,1185,1188,1190,1191,1192,1204],[956,959,960,961,966,1111,1173,1181,1185,1188,1190,1191,1192,1204],[895,1111,1173,1181,1185,1188,1190,1191,1192,1204],[954,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,913,922,951,953,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,90,1111,1173,1181,1185,1188,1190,1191,1192,1204],[130,134,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,128,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,128,129,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,128,129,131,132,133,1111,1173,1181,1185,1188,1190,1191,1192,1204],[128,1111,1173,1181,1185,1188,1190,1191,1192,1204],[90,1111,1173,1181,1185,1188,1190,1191,1192,1204],[963,996,997,1111,1173,1181,1185,1188,1190,1191,1192,1204],[998,1111,1173,1181,1185,1188,1190,1191,1192,1204],[951,952,1111,1173,1181,1185,1188,1190,1191,1192,1204],[913,917,922,923,951,1111,1173,1181,1185,1188,1190,1191,1192,1204],[919,1111,1173,1181,1185,1188,1190,1191,1192,1204],[1111,1126,1129,1132,1133,1173,1181,1185,1188,1190,1191,1192,1204,1221],[1111,1129,1173,1181,1185,1188,1190,1191,1192,1204,1209,1221],[1111,1129,1133,1173,1181,1185,1188,1190,1191,1192,1204,1221],[1111,1173,1181,1185,1188,1190,1191,1192,1204,1209],[1111,1123,1173,1181,1185,1188,1190,1191,1192,1204],[1111,1127,1173,1181,1185,1188,1190,1191,1192,1204],[1111,1125,1126,1129,1173,1181,1185,1188,1190,1191,1192,1204,1221],[1111,1173,1181,1185,1188,1190,1191,1192,1194,1204,1218],[1111,1123,1173,1181,1185,1188,1190,1191,1192,1204,1229],[1111,1125,1129,1173,1181,1185,1188,1190,1191,1192,1194,1204,1221],[1111,1120,1121,1122,1124,1128,1173,1181,1184,1185,1188,1190,1191,1192,1204,1209,1221],[1111,1129,1137,1145,1173,1181,1185,1188,1190,1191,1192,1204],[1111,1121,1127,1173,1181,1185,1188,1190,1191,1192,1204],[1111,1129,1154,1155,1173,1181,1185,1188,1190,1191,1192,1204],[1111,1121,1124,1129,1173,1181,1185,1188,1190,1191,1192,1204,1212,1221,1229],[1111,1129,1173,1181,1185,1188,1190,1191,1192,1204],[1111,1125,1129,1173,1181,1185,1188,1190,1191,1192,1204,1221],[1111,1120,1173,1181,1185,1188,1190,1191,1192,1204],[1111,1123,1124,1125,1127,1128,1129,1130,1131,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1155,1156,1157,1158,1159,1173,1181,1185,1188,1190,1191,1192,1204],[1111,1129,1147,1150,1173,1181,1185,1188,1190,1191,1192,1204],[1111,1129,1137,1138,1139,1173,1181,1185,1188,1190,1191,1192,1204],[1111,1127,1129,1138,1140,1173,1181,1185,1188,1190,1191,1192,1204],[1111,1128,1173,1181,1185,1188,1190,1191,1192,1204],[1111,1121,1123,1129,1173,1181,1185,1188,1190,1191,1192,1204],[1111,1129,1133,1138,1140,1173,1181,1185,1188,1190,1191,1192,1204],[1111,1133,1173,1181,1185,1188,1190,1191,1192,1204],[1111,1127,1129,1132,1173,1181,1185,1188,1190,1191,1192,1204,1221],[1111,1121,1125,1129,1137,1173,1181,1185,1188,1190,1191,1192,1204],[1111,1129,1147,1173,1181,1185,1188,1190,1191,1192,1204],[1111,1140,1173,1181,1185,1188,1190,1191,1192,1204],[1111,1123,1129,1154,1173,1181,1185,1188,1190,1191,1192,1204,1212,1227,1229],[917,921,1111,1173,1181,1185,1188,1190,1191,1192,1204],[912,917,918,920,922,1111,1173,1181,1185,1188,1190,1191,1192,1204],[914,1111,1173,1181,1185,1188,1190,1191,1192,1204],[915,916,1111,1173,1181,1185,1188,1190,1191,1192,1204],[912,915,917,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,111,116,125,314,326,334,808,840,841,862,867,869,872,875,876,877,878,879,880,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,96,113,323,334,399,407,433,449,452,462,465,544,550,556,562,565,721,808,867,868,869,870,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,97,108,125,135,323,334,343,639,808,845,854,867,884,885,886,892,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,334,452,462,465,808,867,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,98,107,108,113,116,117,125,135,323,331,334,407,441,491,541,550,556,562,632,639,808,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,867,883,893,1111,1173,1181,1185,1188,1190,1191,1192,1204],[83,87,109,125,334,808,867,881,1025,1049,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,88,89,1049,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,125,326,334,550,556,562,565,808,840,841,867,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,88,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,113,118,119,124,125,135,136,137,838,867,894,1051,1053,1055,1061,1073,1075,1099,1100,1101,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,97,98,112,120,125,135,323,334,343,629,639,721,808,854,867,871,888,892,900,904,905,906,907,908,1002,1009,1021,1022,1026,1029,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,97,111,125,323,334,343,407,441,721,808,840,842,845,848,854,867,874,884,887,888,889,890,891,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,323,334,808,867,1007,1008,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,95,97,119,125,334,808,862,863,864,866,867,872,875,1014,1015,1016,1017,1018,1019,1111,1173,1181,1185,1188,1190,1191,1192,1204],[83,87,88,96,107,109,112,123,125,323,334,343,433,459,550,562,571,579,639,808,854,855,867,869,870,871,872,877,878,879,880,881,900,909,1013,1023,1024,1025,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,96,323,334,639,808,867,1027,1028,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,323,334,639,808,867,888,889,1003,1004,1005,1006,1007,1008,1111,1173,1181,1185,1188,1190,1191,1192,1204],[83,87,97,323,334,343,407,441,459,639,721,808,845,854,867,869,875,909,910,911,955,998,1001,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,109,334,407,430,449,452,462,465,502,535,562,571,590,615,721,808,867,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,97,98,125,323,334,441,639,808,845,863,864,867,868,874,884,887,890,955,998,1006,1010,1011,1012,1013,1020,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,97,126,323,334,343,441,808,845,863,867,874,884,1021,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,116,125,323,334,441,452,462,520,808,845,854,867,999,1000,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,109,110,111,112,116,125,334,343,808,840,841,861,862,867,869,872,873,874,875,876,881,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,135,334,410,425,808,840,841,842,843,867,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,97,98,102,125,323,334,343,407,639,808,854,867,874,888,892,898,902,903,904,1021,1030,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,97,125,323,334,639,808,863,864,867,872,999,1024,1039,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,88,98,102,107,121,122,125,127,323,334,433,491,541,639,808,846,854,862,867,872,890,1027,1036,1037,1038,1040,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,100,323,334,639,808,846,867,1042,1043,1044,1111,1173,1181,1185,1188,1190,1191,1192,1204],[98,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,407,449,452,455,462,465,867,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,88,89,97,98,99,100,101,108,116,117,119,120,122,123,125,135,334,808,867,871,898,901,1031,1035,1041,1045,1048,1050,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,97,98,100,116,334,808,839,862,867,872,899,900,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,88,97,116,125,137,334,433,491,520,639,754,808,846,862,867,871,890,898,899,1026,1046,1047,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,98,102,116,125,323,334,433,639,808,854,867,899,1000,1027,1032,1034,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,98,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,117,125,135,323,334,407,550,562,571,579,639,721,808,839,846,867,889,890,908,1003,1052,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,109,110,111,112,125,323,334,343,407,413,416,425,430,433,449,452,462,465,502,535,562,568,571,590,615,639,721,808,843,846,848,855,867,871,872,877,878,879,889,1037,1038,1054,1074,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,112,113,118,125,323,331,334,407,433,441,449,452,462,465,502,532,541,571,615,624,632,676,712,718,721,724,727,808,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,871,882,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,96,97,110,125,323,334,407,488,639,808,852,854,860,867,871,1030,1042,1059,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,110,115,125,323,331,334,343,407,433,441,449,452,462,465,532,632,639,721,724,727,808,840,846,856,865,866,867,868,874,889,890,900,955,998,1054,1056,1057,1058,1059,1060,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,109,125,323,334,343,407,433,449,452,462,465,571,721,808,846,867,889,1033,1054,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,96,111,114,116,125,323,331,334,343,377,407,416,425,433,441,449,452,462,465,502,532,535,571,579,615,632,639,676,721,724,727,808,840,842,844,846,847,848,856,865,866,867,874,889,890,891,900,902,1006,1010,1027,1038,1054,1056,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1111,1173,1181,1185,1188,1190,1191,1192,1204],[104,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,867,1081,1083,1084,1085,1090,1092,1093,1095,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,323,334,407,497,502,535,571,615,676,721,808,846,867,1033,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,116,323,334,520,639,808,867,889,906,908,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,88,96,97,105,116,120,125,323,334,343,407,433,441,639,676,712,718,721,808,845,846,860,863,864,867,868,874,906,908,1000,1026,1027,1030,1032,1034,1058,1059,1077,1078,1079,1080,1096,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,88,106,808,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,116,125,334,407,433,449,452,462,465,808,867,1000,1034,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,116,125,135,334,407,808,846,867,1076,1097,1098,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,140,1102,1111,1173,1181,1185,1188,1190,1191,1192,1204],[107,120,121,1111,1173,1181,1185,1188,1190,1191,1192,1204],[101,1111,1173,1181,1185,1188,1190,1191,1192,1204],[119,124,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,97,125,135,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,138,1111,1173,1181,1185,1188,1190,1191,1192,1204],[95,96,1111,1173,1181,1185,1188,1190,1191,1192,1204],[95,96,97,1111,1173,1181,1185,1188,1190,1191,1192,1204],[95,97,98,108,109,110,111,112,113,114,115,116,117,118,1111,1173,1181,1185,1188,1190,1191,1192,1204],[95,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,137,1111,1173,1181,1185,1188,1190,1191,1192,1204],[87,122,1111,1173,1181,1185,1188,1190,1191,1192,1204],[96,97,98,119,1111,1173,1181,1185,1188,1190,1191,1192,1204]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"2ab096661c711e4a81cc464fa1e6feb929a54f5340b46b0a07ac6bbf857471f0","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"73f78680d4c08509933daf80947902f6ff41b6230f94dd002ae372620adb0f60","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5239f5c01bcfa9cd32f37c496cf19c61d69d37e48be9de612b541aac915805b","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"a5518569761e69733409e03ffd2cd6bff7fdd9292cd64ac1c04a384230e66513","signature":"74df101622fa9c7c117d80a2e8eb98f532e80fdf8b3fd4a2c2fc399e670c00fd"},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"87d9d29dbc745f182683f63187bf3d53fd8673e5fca38ad5eaab69798ed29fbc","impliedFormat":1},{"version":"035312d4945d13efa134ae482f6dc56a1a9346f7ac3be7ccbad5741058ce87f3","affectsGlobalScope":true,"impliedFormat":1},{"version":"181f7743fe32daea814e199c9e46c3e1631e6c82e8a4df8c421aa351520bb1b0","signature":"de4cdb9d2408590e680f52964cfd754b7b8e06dbe2c680deb1df58ca708e7835"},{"version":"f6e6081140a906cf79dbe447a0ce36245b8a776e61eeadefbefff057eceb4dd9","signature":"3aa8e3d47bad01dc122187b458b5b071f1b60ca1c24e08b24a2d4d00d0888248"},{"version":"f734b58ea162765ff4d4a36f671ee06da898921e985a2064510f4925ec1ed062","affectsGlobalScope":true,"impliedFormat":1},{"version":"55c0569d0b70dbc0bb9a811469a1e2a7b8e2bab2d70c013f2e40dfb2d2803d05","impliedFormat":1},{"version":"37f96daaddc2dd96712b2e86f3901f477ac01a5c2539b1bc07fd609d62039ee1","impliedFormat":1},{"version":"9c5c84c449a3d74e417343410ba9f1bd8bfeb32abd16945a1b3d0592ded31bc8","impliedFormat":1},{"version":"a7f09d2aaf994dbfd872eda4f2411d619217b04dbe0916202304e7a3d4b0f5f8","impliedFormat":1},{"version":"a66ebe9a1302d167b34d302dd6719a83697897f3104d255fe02ff65c47c5814e","impliedFormat":99},{"version":"90a9b8fbb9d719f76d1aed407acd2fc26add4c9bf151b965c02353ba04b109f5","signature":"6613ff52532f9fcc1be549ffcd6e3fb726c42b79a1b8b10af5b5aaef5a112310"},{"version":"cbdf1dd9f46e95336fe76873cd8fca76fff4d68012900654ec438d6bfbe8f4c0","signature":"34f33132e3b9f1e15b27615d575c0acb930a89e9b271fbbe3e8539184f631014"},{"version":"15e46ced13c0029596710428c157c8f76c8a54e6609dac58f2cc83d2b2b1a76c","signature":"d2084606bba6e50c9b26e8527db0cfe0b5fa06bad741d353b80bcf18bbeefa2f"},"9b0a284490e04f72148742acd8b68a51c3b92ca14b50db19b3cd946bf4fd9363",{"version":"6bf6a8745220e84861a8ec1e33174defe0382caa00e14c8c781b7fe4fe2eacfb","signature":"3dede3743d173a36f0d8fd6ee9528ab23872c62a9ea2ef325b92147eb733c001"},"8724b8dd4ef5d2ecc6bb075c1a673d4e972c89570519b8a8618ddb440bb4ac42",{"version":"a44b398feca4add3385414407baa884e50db39b268ef72185b6cc2bd14f96920","signature":"a954c1cd3efa99b937780d9825c11c1ef8a81af594a073e717144e6d6e5fd172"},{"version":"ee09b9348d02aec6cd1cebb94c27896c10d47efa042a3fbc9c90dd6a7f6af752","impliedFormat":1},{"version":"bf673997a66d2225f43fe1b51cdddd497d0a8c08a990ee331457f2d017563075","impliedFormat":1},{"version":"b6ccbac29e6d17043c49bc900e2574e25b8529ac883cc80da2ebf7983061ba60","signature":"caf5f406fd509e80cfa6bd4fae67cc103efd8e34737e7831d46800e92b57937e"},{"version":"5657d65e69986258a56073ecaef9b67e481f936c2b4d9100da14263b53debe98","signature":"9f50facd72576e205af4e23e60577ecfa9066f94c88359524cb65eaf7d2adc7a"},{"version":"3c545da9e607bb478fc0b15ba6d3d15ee7195b0607ebd51acab1a4b08521ef75","signature":"55cb1462d0b285f537e6c9e89925aafac8036bf119700f9732efc9fb8d553ead"},{"version":"c892cdd669950f198a1c0bedd406684b36986f6de1d0b728590e509667a19f2d","signature":"0488af930bb6e1aeb5a80d07c6af0ce324c293da3e5623797ab276b765f5c11e"},{"version":"934a88597a1c97bb153d9c608fb8a91eb9f75f62f678199cec3c8dc67802e8cd","signature":"f9d833c0d1c00feef58ba15a134e6c5a64e289ec6e934c5448e0cbc95d3020e4"},{"version":"272b1ee0aaebdb31adad232eea206dc3506ca4c67f0dc868fc8ba9ae307daf91","signature":"610fee1fb6bfe24cc042d71a28bbba228d6a2747e556b4e3823e21f106c8c11e"},{"version":"cf4d28bfa361de34db6d273d10d268d249a6416c775226ceed41be2d0126f237","signature":"14102ba9945e01284ae62136e23989aae77fe3d1a421b922188b23ab3bca77f4"},{"version":"82b3f3d21bf6ddc49d87d772a91f3ac013cb7d8d5ddbafb6259f7654d778e588","signature":"a8c9de08e315883c96a7b3c1ad9eed8d38437a61e366caa9ad3679ce47489745"},{"version":"cb512b561bbf64601fede00ca011d8b52ca65fc2ccf698e05971e9b05c8bdaac","signature":"4f0823b39e29ffdcdc9a52e04a56e1085675fe3a377475ec54a10ab0fe95ae5e"},{"version":"9fff4e72433acb3414b18c2262bb9adebfd89eaeb6f34ef8e37efae388a5278b","signature":"6d5f04a5f6a2decbaa59b112158545b2cc5a0961f1864cf93f70674be3330feb"},{"version":"76f2ddd9847d42c0c4c30627cc56a8ab5f34598d8eedf886bdd1373cb10f9813","signature":"2efe0d54d8d30d147b79063f07114802414b51cf2f37d03ae10cebfccc0cd1dd"},{"version":"2008dbd9f521bf99ccd10eacd8014ffdcfa492d74d9dfaa2a0f8265cb649fe3e","signature":"75e7dfb53ff49fef237668f682e61e68b008b8b5335d91ab3230fee3a4000561"},{"version":"dc26d218d1d11196e96a06a621c1d880452454b841a8965f732708308dcb2e5c","signature":"d343e5322085928236661a3b543e9db02841d9e5da8328d49b3301223a10fca1"},{"version":"58d8508d682029500a1a7e9066c8064c1b1b54ad30d3d1a7071aac4d1ca72ce9","signature":"bf97af566ce2388381a3566a0ed04d4bb5aefeaf184ab78167bf263ed85853af"},"7e5473adc564e4a16b8f6413b903ab11118da67ef63bed0bbddb16a721dec12f","3bb28db072324fef800dc5f0149928b9b8e31706dba56eaee69ab63ef543eb28",{"version":"93f45d5979fc1369ca96f3a268df19aeb0b40d7215e1152ca4ac00565be35e17","signature":"9acbf50bc0d7f5983de6e0b2c3d918a893f5013a4397fc749cd2f0c971693097"},{"version":"9cf680db91ecff08148c42139fe017f2bf4ce873b917ff5dfb3f7d777f3357b6","signature":"12afd7e29ea56a6d0ac7851d7df9f0a3e8f4f87f1a95f6a5b1cc02d86cc9f7c7"},"0aba1aaf9fe8ccb221f9cc68eb78fdef449a48195d35f36596b667186be721c5",{"version":"9b643d11b5bca11af760795e56096beae0ed29e9027fec409481f2ee1cb54bbc","impliedFormat":1},"4b5db289b716b8f529e53cd1f137db1ba9062865127675d5f6bd562e970c6592",{"version":"c0a466b289970062647ab96105fdf5a5c4cb2bb7b14caaf182d852d5a7ba4748","signature":"4551b364ef59c268e241ed19050c7e1716a86541605150be714570fcba7e24e1"},{"version":"665f144e22c9022f8982904a30cb264965de0e4f3a99814ae2797a4c69dd4306","signature":"95a6ca8a495f322ee9061de3b3b9c093c687a6e29da271c417919836c387c737"},{"version":"a437d0929fd84e31cd444b8823f4066cc897be005a4003aa74ae946aed3057b1","impliedFormat":99},{"version":"d439306d5d6b8563d53258134ca6bb28d0b6ca6a557bda753ef75829c000a938","impliedFormat":99},{"version":"40af4d2f89f4de15e69d7ff4915a48d54175698870cae94b40a9dd759d5aaffe","affectsGlobalScope":true,"impliedFormat":99},{"version":"ac93729a812a3b6e5e13338dfb98289bed810e88887b37b7aac5b28c6e6287c1","impliedFormat":99},{"version":"a50c9237f37a07b2d5332d6e77160c89624549a5a318108f7ce82ec36b06a3d7","impliedFormat":99},{"version":"79c164aa4f8a8418df7717206ea52508f72743224a6b9c705f10724c6dbb5548","impliedFormat":1},{"version":"65183e393edd53502c199cdfea624c1395461a8c6603a263f695bd309dcf9048","impliedFormat":99},{"version":"9f49b8064f63b7b3275a8247692967da2458734ea9afcf5ffd86b5c177674740","impliedFormat":99},"dc8f349b1673ef15eea7f2e565827312db1c56ba6e16ab6660c6e623ec866c62",{"version":"34928375d6427c429b50caea6afbcce2cfe7f09dd46229fceef33d14b86c0396","signature":"2837d90c5b7d3be23db7294bf715b19b0bfa365ceee189b2a7626f4de6f21e70"},"7c2cabe8d719df7bd72fee16bdef953edc9e06d5b52a2ff4e371366ecd17bf49",{"version":"83ac15040f7b78d6db0867fa23454854f972b982b2efd04af1183b1bf475ed17","affectsGlobalScope":true},{"version":"05321b823dd3781d0b6aac8700bfdc0c9181d56479fe52ba6a40c9196fd661a8","impliedFormat":1},{"version":"deb685eea280337580ecdc1f59ba64df19b8a0a5b26737c152a492d372d75738","impliedFormat":99},{"version":"e8f18d8914599c6b788ab6549287ecf89bd1a9a173e9eb81659edd61f041fc3c","impliedFormat":99},{"version":"6a89c8b199e69d0fa67aa02481d672c80c1077f1668446d995243efd2fc37225","impliedFormat":99},{"version":"e00fc542e2d58412c06217830a0650bc201c706c8eee2d8d27d5ba6b804c6035","impliedFormat":99},{"version":"b46555207d3dbb03ab62585b52a396f48b48a3c40e96723c3ddab672b66ccf2a","impliedFormat":99},{"version":"37b768bac5fe7881c1823e8b8f372b73f2bb4f619e4ed14432df2030f0fd42ae","impliedFormat":99},{"version":"006047b00455c1b865fa1df0ddae8db818bb39a321f3ddda2c2701f893f81aa4","impliedFormat":99},{"version":"537bed5a5d8b5885ebc6f33a2a27bf6af7231a5119410a7c19ca49ece077b985","impliedFormat":99},{"version":"38ef428d44eec84100a2c3d9409607b7d5d79b611b2e9e3b5bf55787fb3cf01a","impliedFormat":99},{"version":"a082dc47e7a81b2075d1be0e1c84abeef96b90f5c4b0df67c882ea36e9b5198a","impliedFormat":99},{"version":"2eb9b16c811eb2e4cc7c088ecafe3dd58d381cb7bcd43c6378f59d6b62343f82","impliedFormat":99},{"version":"0d99404df5e7375c3af5b29e421e971e4d9497f757e08f6d71c55abe12fb4775","impliedFormat":99},{"version":"2ad8375a297254a151082eca24de4880709e22af2b90b5c0a1527a5c34fdfdd8","impliedFormat":99},{"version":"fb1c107b6e709fa8d8183dcb5513a88ef43037b8dfdb148945bb5de406ced872","impliedFormat":99},{"version":"1c6477a91023bd6c797a298f14926e90756eb2d1eddcf04399d003afc3b8c874","impliedFormat":99},{"version":"31881b2ef14f4a800abb5a2e901a380a60890d3e53481f43820e5677e6731071","impliedFormat":99},{"version":"b1ca55067b6f268f36321ef2bcc284d5bd8f728aeb2be639385d9f62bf4a0b3e","impliedFormat":99},{"version":"08415f0037d74b8126615514833ce44bf9e946ee77390b8f68e93df26a905297","impliedFormat":99},{"version":"56c63ffa519c6f7f237f8d4f2475260a32938bf3e0c2287670bce0c5008854cd","impliedFormat":99},{"version":"01a19462afb14049348a4437ca23d8ea8216f2c5a49e2a05bfaaec0acc4987e7","impliedFormat":99},{"version":"18d4f7640b5e7f959234f0226842f5aac95df07414e66afbe0a86624c0317f72","impliedFormat":99},{"version":"c19012befc7fa0dca216cd574620b15da1cf4ad2b62957d835ba6ccdbb1a9c27","impliedFormat":99},{"version":"cc0048f62d66e974d5c563bcc0b94476e8a005406ed07ef41e8693316b2e31bd","impliedFormat":99},{"version":"e97ab9ab0de2905d62b6f01b8929c21c9b66d3caef11e5fe1f024f6b2c168ae7","impliedFormat":99},{"version":"4dcdbdbc992d114e52247e2f960b05cf9d65d3142114bf08552b18938cb3d56b","impliedFormat":1},{"version":"b75d56703daaffcb31a7cdebf190856e07739a9481f01c2919f95bde99be9424","impliedFormat":99},{"version":"ddb5454371b8da3a72ec536ad319f9f4e0a9851ffa961ae174484296a88a70db","impliedFormat":1},{"version":"fb7c8a2d7e2b50ada1e15b223d3bb83690bd34fd764aa0e009918549e440db1d","impliedFormat":1},{"version":"b75d56703daaffcb31a7cdebf190856e07739a9481f01c2919f95bde99be9424","impliedFormat":99},{"version":"9c909c17f69f125976e5c320eded3e693890d21b18cbc4caa246ec4fda260dcd","impliedFormat":1},{"version":"7915d50018073244a9bcb3621e79b8e0ad4eedfb6b053fc945cad60c983bb11b","impliedFormat":1},{"version":"ea7b47bc357858506e6161065b1a8997cfbc5d1dcdf233966da9d01d74721ef8","impliedFormat":1},{"version":"50444daaee4bf4ad85ad8eb52e3ad5c6bba420aad9e2a800043a78f4d8bc436c","impliedFormat":99},{"version":"1fa33d8db2a9d2a7dbfb7a24718cccbcde8364d10cce29b1a7eea4cf3a530cbb","impliedFormat":1},{"version":"b75d56703daaffcb31a7cdebf190856e07739a9481f01c2919f95bde99be9424","impliedFormat":99},{"version":"90300bef1c0e2523c97fdd178b9d50e3f39646ade67faab69be4e445937c862a","impliedFormat":1},{"version":"381437930df37907c030519b23ffea4d8113f46e4431a70bfe008a0c43c63648","impliedFormat":1},{"version":"695cbb89013bc9e87fb24b0df020fe605c54f0ab5c267b5bf0490ed097044197","impliedFormat":1},{"version":"f43780383543bfcdc0a2ee850375e1f03d94bdb1b85091d5b11bb8b2023c8b49","impliedFormat":1},{"version":"303638e9e9378e3cce14c10a276251b2b6baea811f882b0adb6d8b7e44a8245e","impliedFormat":1},{"version":"93fc1a008c4786aa9970b7a4c56295bef4d39c243af63cbfcbd5548ca4fdd535","impliedFormat":1},{"version":"6b91aca1948fd92e4fb32e91e94955e7b7c12fb8cbc0a40eb55f1808886e53e8","impliedFormat":1},{"version":"1e197b6e669b8ece0a68c684af9a4394d8c47e58eaa040391cbdadcc1b5020a0","impliedFormat":1},{"version":"fccfc90c19498513d5c4b9c705706660eba9eb493bc38cdc16a11e9d384cd086","impliedFormat":1},{"version":"b288bbe96ea05e353f008a4d445fb8589a82f2a1c4d4d0bdfc283a19020dc96f","impliedFormat":1},{"version":"b75d56703daaffcb31a7cdebf190856e07739a9481f01c2919f95bde99be9424","impliedFormat":99},{"version":"cf32b34fb9148d541c100a83fd3d204ced00c76871b4811d53b710ff15a948a1","impliedFormat":1},{"version":"6940a178bd12acca76e270f0b0c4d907b9cc469d28833bd59a3276f11668591e","impliedFormat":1},{"version":"22165b22578a128275b69d52c0cacc6ab19e36eb95e10da18f1bca58cd6ac887","impliedFormat":1},{"version":"ea7b47bc357858506e6161065b1a8997cfbc5d1dcdf233966da9d01d74721ef8","impliedFormat":1},{"version":"9dc9c7a268e5b2caa79a5a5040a86ba5ddf1cba20d8715ceaf2b76f79ee444fc","impliedFormat":99},{"version":"9be491a96d84a67f0d94eff72780b05f5d87e72e35ab479d5d178ec3992afa16","impliedFormat":99},{"version":"c048b081418f530417dd4193b47890bc734711378df819f0ff217144f6775afa","impliedFormat":99},{"version":"43d809531ce93c48c965969fbf6a005d509b56bd2cd99c0e77347185ebd8fce0","impliedFormat":99},{"version":"bf0b1e6c1bb4930244203a593c6db7aed456e635c31aba73ee2102c55998861f","impliedFormat":99},{"version":"58e8c4bed19bfa7264f90353b891ff96094228a20416623bb998f1ae441e958a","impliedFormat":99},{"version":"171e17f251c65245d7b0d18da35b9e9c900576ef6db03a59cae533353e222a90","impliedFormat":99},{"version":"76e3666a9f4495c6d15035095a9bb678a4c3e20014dc8eb9c8df8dc091ec8981","impliedFormat":99},{"version":"055bc641ca1f1eed76df9bc84ec55aaff34e65d364fea6ae7f274ba301726768","impliedFormat":99},{"version":"22ebe7ce1ddc8ee5e70f28c41930c63401e178c637d628b9af9f7a9c456e86b0","impliedFormat":99},{"version":"041c4afbee0a17614e9d4a8aa4385ffbbbfa1a5d5148c9aab0dce964be1af0d6","impliedFormat":99},{"version":"00d259e465df20202e848bf8d192056919e460a3de20aa14f59d523d3af38b29","impliedFormat":99},{"version":"9cbb746b8d46880874f6a8f8c64dfa925ec0cf70412d4ad5e00a8756c82edf3c","impliedFormat":99},{"version":"fd23901347e68e39f7043fc6787b2af6c7094d6c7ef6038ee909cfe26da625c1","impliedFormat":99},{"version":"b27d92f5ce61e0ccb00a4f1f19665ff995df3f16b4b7005a651ffe7255c45cab","impliedFormat":99},{"version":"118a23aa24572ae8fe1a2dc0014d73a0ce45d62bdb988a71bcb6c021dc592c26","impliedFormat":99},{"version":"37f91e6110c28b1d1a7a82cdf44c66fe0259b38c74440b8acbf9d14ddfa451ae","impliedFormat":99},{"version":"47ceda52be9bebcfdda6181b496963f530cf61719fda168f052f6ca483add543","impliedFormat":99},{"version":"3eeab58ad93111ccf9287c7f32b1a8037f23d28783e96b93d097290919fe386e","impliedFormat":99},{"version":"5f6442d0a9bbb961b58f45d09690a034734aeea01f2875cb0e7ec31aa3676ef7","impliedFormat":99},{"version":"6511839e63105744b3bb8b340791218b253bdae80c7d57c288dcc85bc6f91317","impliedFormat":99},{"version":"a361409ddb9ecedc609eac1cc6f752383b1a667be212846927b660727e346d85","impliedFormat":99},{"version":"3f01edcdc9641acfb6689126d9506248d3a3afe3e4a23e2f7588988ba693f349","impliedFormat":99},{"version":"8365f863e47c17b2412fc736f8e279ee225129b9436af8ba9b746fd5d59b06ae","impliedFormat":99},{"version":"6ac1b4401d51471ae0d6b6bcce637e550eb78d75b1cfe993b6eaca9898d74976","impliedFormat":99},{"version":"0b4d305552d9cce2397e6c618cb27d241f64eb4e3496e66d926a7f66a8e0c6b3","impliedFormat":99},{"version":"894395299a4761cd4e38c20bf17bfce27a3cbdc2650054e5fc28e692fddc4b4c","impliedFormat":99},{"version":"7568f6aaaf6b62b7f3f72ebd07bbabd95749a0f969dfb15e7789d4a3c8e080a1","impliedFormat":99},{"version":"039d7ce09e9246c255c7acc1c00ba3afe7e98b4767547ccb6b77274109f8a5c1","impliedFormat":99},{"version":"b4b9514c90add4b59499251f760f01aa7fdaacb02894ff0d885286094cef8c2a","impliedFormat":99},{"version":"f670e23ac2377ed32187f39d02be707c9c0cd61e95786a6ba49ea7f860baa50d","impliedFormat":99},{"version":"25f27d8da6c42f1622b0b01fc5c78f48c79c645e10c4849fc8c5521faa9ace29","impliedFormat":99},{"version":"54e17510b0440980e3bc8ce141c9b922adb6c8e77ee81c443870bf684679255a","impliedFormat":99},{"version":"3e9e2f295358fa46f10faa524be6e99a42114752b0e195ae997f550968ea481f","impliedFormat":99},{"version":"74cf1308a1f0de094f0e8567541b0a0e126426ec2eb4ef68c9cd97fa4d0d9272","impliedFormat":99},{"version":"dcd1e783bde43c7d570ce309cc21e9d9d7b3110491aef9c5c5ce87c6a53f7e5d","impliedFormat":99},{"version":"08bc14542d8d34fd138945413e31ecf65668e029f966b5aab5b25e8e421efead","impliedFormat":99},{"version":"17648a898be56a6a9c4a6305e84ba220bc76d4355f0f55696726f1eb1fcd6d4d","impliedFormat":99},{"version":"cc6c1ade000cc9b7f8c79d8bdddb145950bbe7d404e5b3b938537a0bbfba73bd","impliedFormat":99},{"version":"eb97def43c2617552f76eb367e7f5531127fa03fdf991ef12cf5ae8fcc52c7ed","impliedFormat":99},{"version":"f49bde1443de7aaf05371f049ee0710619bde1b7bb7042192512e5cab672b3fc","impliedFormat":99},{"version":"a704c8b701194cc47d333b093f87db332694b124e304fb0167be09ff3304d353","impliedFormat":99},{"version":"358f8d33b436d21a7c313f02e900b805eb1c6abda3d675f703ada38eea3b92d5","impliedFormat":99},{"version":"dbcf8b1a2d94e9a1f0fa3fd5152114a14f83d8dba8d3f8dd773be476adac937f","impliedFormat":99},{"version":"ee63e60be6f56e08cf8d7b5ab750078fc6d08f69cdf70ee43fd0693d10c65d2f","impliedFormat":99},{"version":"4807b8b139747bd82ef181b5eaf8676c1f9012be0ad91feb1173bd57f08aaac8","impliedFormat":99},{"version":"ceee442c1035bd941c9fbddbab08fce2e34d1e23d79d56a48c0444bb45d705b7","impliedFormat":99},{"version":"fb9bcb4ee14feca03c05eaff9f1eb826bb1e75bade5e64f98c65ecc79b910949","impliedFormat":99},{"version":"f8ee6c9ecf3a39cb551db7d6f0aea157cd272ac477c561331efd734a13b34134","impliedFormat":99},{"version":"f72af7f1a38a5b8ae564be5eb68a8c25e5cf9cf4c567ddfa471a481425369c79","impliedFormat":99},{"version":"aef37af42cec810a643f24ba90f2f7d55c3e05ec5e31adca4c3318e578822aa6","impliedFormat":99},{"version":"ce35f35a8d59172dbf5cd945c253512114d6020e7dd30d399d372e473eff2515","impliedFormat":99},{"version":"e9e8a6bbb3819df983667e1bbf9c993e954c009f575c1f5d2063d55c1af47d1a","impliedFormat":99},{"version":"42c169fb8c2d42f4f668c624a9a11e719d5d07dacbebb63cbcf7ef365b0a75b3","impliedFormat":1},{"version":"b6abb79b5ce1a00b991e3568a1f7ddffdafa6f27235d8c41d440ae3e1395024a","impliedFormat":99},{"version":"bf0b1e6c1bb4930244203a593c6db7aed456e635c31aba73ee2102c55998861f","impliedFormat":99},{"version":"44993fcc19de9502ac3f58734809acbe0b7af3f5cca12761dc33d9a77cf02d1b","impliedFormat":99},{"version":"d172b164580892e56129985557aaf73b4e45279e4e0774e1df53282e6fd89427","impliedFormat":99},{"version":"9104e9de24372f5469c59b5df6cf7cb3f8252268a933e4fd6a2dd09610b165a8","impliedFormat":99},{"version":"68f1a4ec2937052ae0dd18407eb8d1b579708970ced79c6e7cfe4a93d0a00385","impliedFormat":99},{"version":"efe0fabfc89403ce6a4a8b1fe3a7633f1161b7e10d9824299560f2d15e4e606e","impliedFormat":99},{"version":"863e3b3ffefbe39c727cf30147ffe04c04f1c94d5e8f4ac846b227bad8152c93","impliedFormat":99},{"version":"e84f2065c605965fd1d44de2cddf0509dce060b4d9e79c01a884a0899fe877db","impliedFormat":99},{"version":"4546ed6a4f9981e2009e8bc0047130eef10c6ad12958a4093d6a6d720548508f","impliedFormat":99},{"version":"16725a633f5f5c1cd82e2baf4b0ae521da7f6055339f837bf2695bc3fd44373f","impliedFormat":99},{"version":"664104ab990ca5d100a69e159f9f8874551d94a187db834309af14fee2d64f4e","impliedFormat":99},{"version":"542e50c2dca6d24f5cb9cb2b7a5c07d450850af21ef253838bb2bbfb175a3e8c","impliedFormat":99},{"version":"b87a5b1b4ef40860bb48923e0abed7183883a6b4bf16ee7d1ddd745e1c52737b","impliedFormat":99},{"version":"2631b7256705a9ace791907cd28a1272f7c46fc33126332011b6e6ec4504763e","impliedFormat":99},{"version":"fd8b58b771380655281dca6ed40019cd8ecd639ef6ec74baa91662ca0e0ae458","impliedFormat":99},{"version":"6a73dc1806928e57c21fc51d00f40e4e92f17dc6b31ddfa95365a837651587c0","impliedFormat":99},{"version":"ce35f35a8d59172dbf5cd945c253512114d6020e7dd30d399d372e473eff2515","impliedFormat":99},{"version":"97912ca64fedc028914d9f1585e30d98a1e1e46a426a06f2190024067b8a534f","impliedFormat":99},{"version":"a9b65aa46a4613eef2bef431366d8f5f166e8226c6fae3688c67ca102c3d6a79","impliedFormat":99},{"version":"45af3936c6c68c1ebf71c6f69375b64df0bb3ff0ee66c9af8ddb4c43f426110a","impliedFormat":99},{"version":"0caecd57de90295669dd561bf9f0e4c4478434e14e0741c2b0fbed44e38563eb","impliedFormat":99},{"version":"9bf450866b0ae8f5539cc364ebcb566c8eac607bd4cb3c6ce786134b4e6815bc","impliedFormat":99},{"version":"78c0f55d5519d39233daf5562c5704a0322dd7abcc1e72afb015cac550be32d3","impliedFormat":99},{"version":"78b8de068c89bd325bad4d1da693b679f57bb2a0f4a0140e9f58f12d7a913fc6","impliedFormat":99},{"version":"f72af7f1a38a5b8ae564be5eb68a8c25e5cf9cf4c567ddfa471a481425369c79","impliedFormat":99},{"version":"205d330174cc427f3002517bae08e2cf8b8e134cfe086cc80fe18a07efeca799","impliedFormat":99},{"version":"f1cd4f713f4437d86a7e618fc260e84bb609de484c7774d3138b0e52f1ea264e","impliedFormat":99},{"version":"03535e283a156874e32846037dc86e32c53995db4e077d392a8b17c6f26e4f8d","impliedFormat":99},{"version":"8e0b721643bbab457fc721978ca39bb210dee3f84f2693e9f2b463a3079de8e2","impliedFormat":99},{"version":"26714a66ea656e9971107607ff771e07c2d92066fad35f41164ce2f8df516900","impliedFormat":99},{"version":"3c8f12fe817e0928ca30f4df324c0941ba057f1c4cff8e53ce88c5156dada27b","impliedFormat":99},{"version":"d35f81ba39296216f0d88d7b28ed0e02d8c628cf70194b108c0e941cda519ab6","impliedFormat":99},{"version":"87621a249f7a938e9d270b70e560b78b55552eafd08ddf71d2fbd80913699488","impliedFormat":99},{"version":"ab92b4094b7db98dc3c59d5a12afd9a8778a7d0f3304ea8a6497d74c41aa95de","impliedFormat":99},{"version":"400402da2b06f5acd7940db2ee5507784fdab53354062fcddfe4934f3ac04340","impliedFormat":99},{"version":"3e80aeb2dad64ce73bb62a404e1db152fd73bd5849b1777d444939d0c1cfc287","impliedFormat":99},{"version":"61f825380b5ff41a275f6d0cedd145a073524cc24b4963f82c4348574325768c","impliedFormat":99},{"version":"1631f72761156e3e1f414db7ea97cc6b6f1f50904b290f3e6985502be9ee016c","impliedFormat":99},{"version":"b41d3caa8c0839223be817bfedea85bfcf1e682182d51414fd11d9ccaf83792f","impliedFormat":99},{"version":"2b5637680ce53987f0335180e79a9dd639ccfa8f20d46332195dcf11c02e9bb7","impliedFormat":99},{"version":"08bee5ad21bf8bf6d1e66f9bcbcf1c790c1873ae5d63068c02567c357ae619fc","impliedFormat":99},{"version":"a50883ca9e4d58a313d8f8614ddb8bcf4a33587ec85ff9998a971334e34dff0c","impliedFormat":99},{"version":"6cbe055efdadb8b2d27ab470fded80fb4d2219e7b1a0140ffcba3f1ff4e6bd14","impliedFormat":99},{"version":"949ccc4add0506d70be23ded8fe17702ce7ecad3f6b9b2948d12be7b7621c008","impliedFormat":99},{"version":"8b5aa4aceca84ffb115eaa92eb511db532a380715fbe40e0f2691399f59779c4","impliedFormat":99},{"version":"3c84fbf2b9676c3b985e56281412906d998acd2ea3b420679179746d2eb158ef","impliedFormat":99},{"version":"04498bab7aa04819b6f85e0a833cac9a90d2c225449e62a500e0d969a980a0f5","impliedFormat":99},{"version":"603c4205a9e69ac7eee80d9967196c5e1be4e5815507c07a6bc7442a7404a35d","impliedFormat":99},{"version":"953be5c29962c02b750c81742c6c8e3ec88f0dca93b490ae0c25d06ec09a336b","impliedFormat":99},{"version":"93c47ea71b8ac6043e85e16a7f5a12fdf28283e0c3e64818b24ef77339dde953","impliedFormat":99},{"version":"c1faba1a4367b207aa0c37ab286daf320200659b052887e5d017f1a19a1bc939","impliedFormat":99},{"version":"0a5c9fcea7d8dfde5b22c26763cf7c8822a99ba7774b87d4faa63fe165f371d3","impliedFormat":99},{"version":"acbbdccb0deb733cb3c04d97084b6d51b2f3f1257fd84005ab982b068d08e084","impliedFormat":99},{"version":"cd80c1f39858c9aaf24cb6cf109d90b16470b4c4af5b712b350e6e18b08c1d7e","impliedFormat":99},{"version":"938cfdec82f866cebaba7a0d8f7d41aec9cf34ba53628c444d4c0edd90123b39","impliedFormat":99},{"version":"ef0a3e581b336ec4522badc01575daa324a63e76b7317ceda2ef887a5168e2e2","impliedFormat":99},{"version":"5a3458dfcbd3d376e91a57ff64ae747c34f8ca1b503b1be1a84f490b56da1638","impliedFormat":99},{"version":"684fed66904651fd676b78ec044da251651f4dfaedb163df74b2280013d5cd5f","impliedFormat":99},{"version":"78156ec80b86cc8f8651968051ed8f9eb4b2f02559500365ee12c689c2febd9e","impliedFormat":99},{"version":"e463bccc0c9e8e19113e8f5684fa1e0d357fd66cbc7a495a3c4854442268ab0b","impliedFormat":99},{"version":"e8c0fce94bf97316262ce31a0946120e9dafdf2dfda1dc9a71b5e7b1c1337b53","impliedFormat":99},{"version":"a16ecd75e1660eebf91b31f0a6e06fbc1cba65a6b6afe313dab362bd1e5b95c1","impliedFormat":99},{"version":"a9e0a480c019837e2634ee2ac49d078e9548032f2f69e9f7c4465ce4e871155f","impliedFormat":99},{"version":"2e415d3626693f39e40f19ad427f6ad173dc4bde2a7c4ef6a655f30d052b61b0","impliedFormat":99},{"version":"07c33a8bf964265d8a37515f8cb754b82ecdb6b2ae1e2ce18b09c14b9d13b704","impliedFormat":99},{"version":"ec031aac2844e250f72acb0123642f6eb9483250ad7389a79b3757963a890504","impliedFormat":99},{"version":"c98069496e78eba403f51c1a7d582ae0e0f338e2d63b6417e561c9f56cbe88c6","impliedFormat":99},{"version":"7263d25edc36d45908af60cedfa14b898f558e17a7e967b2e1fed0082431461b","impliedFormat":99},{"version":"4b0e0173e248db6eab5b9402044f2f1a2d086e99d9d8af6c4a7f46f52cb6d787","impliedFormat":99},{"version":"dab4f30b9d72cb7596989c6cee8787309e45945f236d984db885ad611e59a259","impliedFormat":99},{"version":"a39d68209be7cdeb86ea872366f7c9f3578e657dde3eb1489012833c87028ff3","impliedFormat":99},{"version":"d86678c90586f9e0be0060703cbfce7ae586cae66eac159afc1b355e2dd2f163","impliedFormat":99},{"version":"c5e59270f3237a2bf344ac83ab3095f30c0ad8f3f07e41f266e662ce544520c5","impliedFormat":99},{"version":"71b85fe7dd2be824ca331849424a64b6417214047772f914db895ac812e06b6f","impliedFormat":99},{"version":"1bfb743c928bfe9fbf9ce88bdfaf8235edb1d3ea0b5ab446603d71c4ac87d802","impliedFormat":99},{"version":"b6e92e897f1bd0dab01bb0f64bd70956f574c7752f7bbdc7f107460a074b707d","impliedFormat":99},{"version":"843c0a76abaef274128b61eae8c21f04202905ab2f53b7f03486ea81aa1c0110","impliedFormat":99},{"version":"a3c33f57bb6ce04191478ea23a17293d382cddb7aee7b56bb5aed3ca49c7fa60","impliedFormat":99},{"version":"c9bfc8572556f746686beb2ac476f999356253c4b3fcba189327b25b30c47801","impliedFormat":99},{"version":"b8c88b5a41a26a1b3518415afadf5160e88fa4a4887978b071893a7c64b43014","impliedFormat":99},{"version":"6af214e64dbf7c599257f7f0851cb57b267c6eef97dbca04b1f2d204ac571fdb","impliedFormat":99},{"version":"7197ba787985c196aae100b99b32e5b271627c340a5883a52c83923f796ccce8","impliedFormat":99},{"version":"ac84c9b0786abb646dfce8480f6ebf83370a47a45d8bd7e2bc705f1069bc71b5","impliedFormat":99},{"version":"3e1850cc32b15cc8e9e7617ade862f50d4d4220ba423ed2542915649e84ca483","impliedFormat":99},{"version":"b95e18604b5d61baf87320e5bd776467df49d18a26e93b5ab18599ea37d4e7bc","impliedFormat":99},{"version":"98c33da6fd946601b36415c760e677c1faed100c361fee8c45565d8d6a00aca1","impliedFormat":99},{"version":"afabd37daf4bc1b2604caedd796ec9deb277d7f3f1927ecea80cc9eeda678518","impliedFormat":99},{"version":"0dfe325b190de07f861c28e1027730a186591562f3890a03ee53c66da76a2065","impliedFormat":99},{"version":"c59eee5e50312900effee1403fa07d9386e95dfaf20411a854729acdf6787629","impliedFormat":99},{"version":"8c8b35b1251978c2156c04db23ce6b842f48db71d39b42dd3c537dfa099e5ef9","impliedFormat":99},{"version":"ffe2657207e83f7b1a8ba2def29185ee81571f5e120176f981e544e589192958","impliedFormat":99},{"version":"9b571fa31a14b8e1e8e7412743e6000be66b7d350358938c1e42bcd18701c31f","impliedFormat":99},{"version":"9a14a6f51a079956ce0a7ee0826c7898825dea24be60e10802e18b46f142efc3","impliedFormat":99},{"version":"f3789c8262f633fd3f474f2f7e36537a29c65bb60a351efb2ddf47208909b962","impliedFormat":99},{"version":"f0410c617e9f6d332d7b860a1c3a679f7fa3e00e89699dfbc6b4f563b12b350c","impliedFormat":99},{"version":"7cbe98b14f6634dda9f63a1fbb217b7eee8053c03e28fdd2b9cd6dc27e0a819a","impliedFormat":99},{"version":"f54071d7f4208a2aea12ea153599608607f44f0d8b6d20a47da8f72e30a5dbfd","impliedFormat":99},{"version":"b6b726231178cb2695b8a83519d4fa50a03e800fa9b2dd75193a56bf6cb58a08","impliedFormat":99},{"version":"70a29119482d358ab4f28d28ee2dcd05d6cbf8e678068855d016e10a9256ec12","impliedFormat":1},{"version":"869ac759ae8f304536d609082732cb025a08dcc38237fe619caf3fcdd41dde6f","impliedFormat":1},{"version":"0ea900fe6565f9133e06bce92e3e9a4b5a69234e83d40b7df2e1752b8d2b5002","impliedFormat":1},{"version":"e5408f95ca9ac5997c0fea772d68b1bf390e16c2a8cad62858553409f2b12412","impliedFormat":1},{"version":"3c1332a48695617fc5c8a1aead8f09758c2e73018bd139882283fb5a5b8536a6","impliedFormat":1},{"version":"9260b03453970e98ce9b1ad851275acd9c7d213c26c7d86bae096e8e9db4e62b","impliedFormat":1},{"version":"083838d2f5fea0c28f02ce67087101f43bd6e8697c51fd48029261653095080c","impliedFormat":1},{"version":"969132719f0f5822e669f6da7bd58ea0eb47f7899c1db854f8f06379f753b365","impliedFormat":1},{"version":"94ca5d43ff6f9dc8b1812b0770b761392e6eac1948d99d2da443dc63c32b2ec1","impliedFormat":1},{"version":"2cbc88cf54c50e74ee5642c12217e6fd5415e1b35232d5666d53418bae210b3b","impliedFormat":1},{"version":"ccb226557417c606f8b1bba85d178f4bcea3f8ae67b0e86292709a634a1d389d","impliedFormat":1},{"version":"5ea98f44cc9de1fe05d037afe4813f3dcd3a8c5de43bdd7db24624a364fad8e6","impliedFormat":1},{"version":"5260a62a7d326565c7b42293ed427e4186b9d43d6f160f50e134a18385970d02","impliedFormat":1},{"version":"0b3fc2d2d41ad187962c43cb38117d0aee0d3d515c8a6750aaea467da76b42aa","impliedFormat":1},{"version":"ed219f328224100dad91505388453a8c24a97367d1bc13dcec82c72ab13012b7","impliedFormat":1},{"version":"6847b17c96eb44634daa112849db0c9ade344fe23e6ced190b7eeb862beca9f4","impliedFormat":1},{"version":"d479a5128f27f63b58d57a61e062bd68fa43b684271449a73a4d3e3666a599a7","impliedFormat":1},{"version":"6f308b141358ac799edc3e83e887441852205dc1348310d30b62c69438b93ca0","impliedFormat":1},{"version":"ef5813952c53ea286963133baf66787308c84eed7338d8c61613a8762167bf79","impliedFormat":99},{"version":"5ca32089fa4a40b1369f085635aadc4bf853bc4ea4dd49eac0779bf9f62423a3","impliedFormat":99},{"version":"5a46f69508e086a0f63d8fb15717422e9ea54d1813be3798c2220bbd9c8ef43c","impliedFormat":99},{"version":"21e29420bf5da1147cf6ebcd8cd85afa21dc3cbf04aee331a042ae6f94c1fa63","impliedFormat":99},{"version":"2532ef3d4f071e7d873ccc1c5766f71fc9007f4e768096b9b5bbe9924abc4a85","impliedFormat":99},{"version":"98f2ac6d25c8ed61bc7afa717b56e11c826fcae1d36c9999248dc85d37454947","impliedFormat":99},{"version":"9bab9e8d65ff83bceec753685598d1d522ca1735a2983eb8c881dc8389b6c008","impliedFormat":99},{"version":"0356b906e53157425c8beb4e5673c71fa80d88e1cd32759d4bd57e59698ef88f","impliedFormat":99},{"version":"0d3d2bf02e634ab678adc2916045058d136c4420bfe710c4557a160b67aed36a","impliedFormat":99},{"version":"edca1f05d978d3c2feae191a82e34710dd8fedb83a24c2fab15373be5be8a378","impliedFormat":99},{"version":"36ac04ebfefc210ab3c0148cbfc451f3434e9ca7048b19827a98247875923176","impliedFormat":99},{"version":"866c88db9c98b1497eb50a58cffa811f35d0aa7ae14361e07bab37f1966e7fba","impliedFormat":99},{"version":"d44ad42a40c4e84bcccc9a5db198f86afa6196d42e152cedbe09d513bff01fb5","impliedFormat":99},{"version":"4f20bc9c75b4515c25c3de1cc6c5391972991a25136b796f8c6601a809e80796","impliedFormat":99},{"version":"4f3b2abbe8fbd186f5d599de906c5afd2ec4328b13285dbbab5cddc3cf3b7373","impliedFormat":99},{"version":"2670ba717e7b90210f244401d5fe6f729cf879cb2938b6536c9c118371ef24a2","impliedFormat":99},{"version":"2e86a352fce1cf1df7be54b242d65c5efa3d66a445a60b2a0f7c33a60ed76eeb","impliedFormat":99},{"version":"b85a123b9f8fc782828d80ce35261e7a06f97affb3dde7cb158da6f7bbd17016","impliedFormat":99},{"version":"02e6668da999217b040e0d8d6e41daa96d7f59eda7bd9dc9156378584116b296","impliedFormat":99},{"version":"7c52a6d05a6e68269e63bc63fad6e869368a141ad23a20e2350c831dc499c5f2","impliedFormat":1},{"version":"217de2289fff8451ec63629b4a49eac597c68425b9bac8fceacc861dc7f33989","impliedFormat":99},{"version":"1a45026d00ce38b0e8deb084a105fe02bdcc32b7050195cc6351c2bb5b554c33","impliedFormat":99},{"version":"97bc3fd65336434e6330e0a9141807cbde8ba4045989809632f70ba93f70f6d3","impliedFormat":99},{"version":"d5bcc410b5ab12693f89a3c477f8dba724d881d87498adfa8ed292869b393c7e","impliedFormat":99},{"version":"09938ea562ff26325e6adccda5de5fc7403c28798335cc3d947eee9b6d5940b0","impliedFormat":99},{"version":"9f313a2d30d03a9954269fa7c7f5cca86ffe2ae6c1ea14741c3e2794aa805806","impliedFormat":99},{"version":"2c4945c48f529153672e10dc7b67f414ac7e7678bfcd5d6b79842ae28a330002","impliedFormat":99},{"version":"0e77db673ec8f065fca99ba005c8be50f615ae00c86f340696bf81cf65bce59e","impliedFormat":99},{"version":"ef83f22620073b4b9e666191044faad4f2b3a5b4bb87e8487b8200bcc75102df","impliedFormat":99},{"version":"99cec35e19fac2229b5c6ba317476fd2694f15a0e9a9d38f146c5f5edfe3ada3","impliedFormat":99},{"version":"730a7f1b457f1b6017fb7a000cb9c1ce9798c3f0f247f1cd751ea7d2aebdf1fe","impliedFormat":99},{"version":"98ab624c4bb847ffac693acecf770154c9763eeb7228e28b873aa2d2ec9eacc4","impliedFormat":99},{"version":"6d26c9ddd47ab86552f4d06e7bf051661237856cc0e5cf75d634853bbd562166","impliedFormat":99},{"version":"680d0952320aceb8891190e27707ac15753b603df67c4437ac7b6e9fa64d8744","impliedFormat":99},{"version":"0a202409812f7dd20d61ded10a6984b79882fe264c76364dc53dca951a28c737","impliedFormat":99},{"version":"06d5971c8b4a3bc00bf57f4332d3bfd92636dd4abda4fa0357c7c1dd496b1407","impliedFormat":99},{"version":"16bc3daf1ea7a6d3ce2407e25ca4ae2ba980c9f683f083c7ad6dedec22b64ecb","impliedFormat":99},{"version":"719f559f65d32823f1db11af17b4ee08fbb19d5acd4b6feb7b6610ccc83af179","impliedFormat":99},{"version":"32e457b81fe1c22b636600c5afaeaf9b53610174cf3bfd3ae6163b6b4251424f","impliedFormat":99},{"version":"0e974dacd2db2d61518aa2b96e39cda96fe082f297f1648ac92aa06d22f652e6","impliedFormat":99},{"version":"aa29bfc666c850f62d2d0b1bb1efd7a56074a96b309667e0de5e0f6c9a893957","impliedFormat":99},{"version":"218daa4b2d1f8f6d3c4f022acce45b10b65d04086a1ab74ea7a135814521627d","impliedFormat":99},{"version":"7f7b3faa89da29e2f52f73f7f2dd37b40c7d1e6dd8b820be1f9603bbd37080a0","impliedFormat":99},{"version":"19129eddecdecfc0dd69e7d02bf2adf525f390269f0667af7d9d14fd9933ad53","impliedFormat":99},{"version":"93f2f1257d136a1173e26beddd168ebaa5b50479fc9cdeafd3c3fdee92db670c","impliedFormat":99},{"version":"8a50a838343a8ee7318f5a4a33defa84d325cb035ff67d4cef3f04cc3dbd7c72","impliedFormat":99},{"version":"93f0399b89384f652cb73f597865e287b69db239dbb52c044a6844cb44a45b1b","impliedFormat":99},{"version":"cc545c484b2a0cd1a77e63252fa8bf49064ed577781cc7f273c8b499f231e9d7","impliedFormat":99},{"version":"9553bb2ddc97cadf255d6056236f335fb3d0b34cd3ff34ef7dc170d0004d8f05","impliedFormat":99},{"version":"522651983601a3d0a24eb8104086714d8e9a958810503275e45cd6ff263cf416","impliedFormat":99},{"version":"4a42853bde0c734cab8c5194afa6e78a6875090d310d472127c84110b8468870","impliedFormat":99},{"version":"ddec04cd05ab7614a2d51c3fbafa772b47cec4d7d6be80c1de8d37e4366692d1","impliedFormat":99},{"version":"a28d089808860737ef08c33c36db5e3db57ec5c5fd41acdbeb0f0d1d8f7a1519","impliedFormat":99},{"version":"8bf2591f190490dc2bd3425f53b56b941cf05d0d4e7c69beb67f473a19d1d87b","impliedFormat":99},{"version":"51b1dce48fa5bde70b49e5586d0bf7ba3371e172df994fd6401bba8b436fb852","impliedFormat":99},{"version":"09a2cc054e9070ff418f718c410e0065a56447a91e4770d619b58142b7ca7800","impliedFormat":99},{"version":"c0e40d24064092ec578bc6f7a61e8a20b14e450b69978017a94c1ce30c3d840b","impliedFormat":99},{"version":"aec5756720255bd7045409db869db09031ce31003dc654175f552d59b196313f","impliedFormat":99},{"version":"86892d5bcae518db21850a892aa682878f77bc6ff1fe096f5f706c91e547cde3","impliedFormat":99},{"version":"920fb154685f4ceae115152b5880295f0da66e60674d22852b18424d2828053a","impliedFormat":99},{"version":"d22c80b0d938d2a571dbe1707606222fb97bd1d4bbb46fe42e326bdee6545ca3","impliedFormat":99},{"version":"4053a0866f10634083ba91f2166420b1c29a2509b64803bd192f50baeb221265","impliedFormat":99},{"version":"71748069e3823c2c09f87fd64f2078d2ac74d80c19bb2d44e3d61e9d5342a23a","impliedFormat":99},{"version":"8b5762f3138b2894db972d51cb539f1ff2bf6b231129667cb89962d4711f9c70","impliedFormat":99},{"version":"ffa366f1f2b7ccf00d170f120836a57cc74e8548e3e72b41bd0cee00dab9dd2a","impliedFormat":99},{"version":"8c85e5dbbf569edf4c83e9e2e5cdf69d3e0644c676d22224899f38c0691a158a","impliedFormat":99},{"version":"aa94cdb0dbaac5ab520157f991bdcdc953c2fbb0436cb4ef6252bba926429a34","impliedFormat":99},{"version":"f440eb21669554667141024bf26145e5bf7de56eddf9eaeaff94310b911f4cf0","impliedFormat":99},{"version":"664ea2d1a61cbe738cf3a4cbe619f775868a97d06398cfe2867173356786988a","impliedFormat":99},{"version":"43246e78fc3edad75b54a70ca2298c86f78023d3d26513fa0a2f7dc8f41bccda","impliedFormat":99},{"version":"8ea7b3318983c9b2e3afa2eaf76d0f7c20c15a571c35567920f0f89848b09fec","impliedFormat":99},{"version":"060bc6464f23a8cfe35ff7b91a3ca4ad918b4f760a96e666453ea093b412a336","impliedFormat":99},{"version":"960a68ced7820108787135bdae5265d2cc4b511b7dcfd5b8f213432a8483daf1","impliedFormat":1},{"version":"2e7ebdc7d8af978c263890bbde991e88d6aa31cc29d46735c9c5f45f0a41243b","impliedFormat":1},{"version":"b57fd1c0a680d220e714b76d83eff51a08670f56efcc5d68abc82f5a2684f0c0","impliedFormat":1},{"version":"8cf121e98669f724256d06bebafec912b92bb042a06d4944f7fb27a56c545109","impliedFormat":1},{"version":"1084565c68b2aed5d6d5cea394799bd688afdf4dc99f4e3615957857c15bb231","impliedFormat":1},{"version":"057a6bc4d8d4ebc4817ad261915f898cf589b62194058913ed9eb4c25f14544f","impliedFormat":99},{"version":"ebaccf8f7b32b5e70b50a0f7f85fd1f3274109ff139dd672b151f05281d0fc99","impliedFormat":99},{"version":"90eb37365f7f73460de47970a44dbf4760990badf21b3223e8ce0207ed874903","impliedFormat":99},{"version":"3127a03a881f78c9145d7db821295531e8c577a8a0738847e70af2b6ad9778f3","impliedFormat":99},{"version":"892acb5e07ceaa0b42725ffd0625b833e77cd148f19117e510334bc815b0b3bd","impliedFormat":99},{"version":"1a35bd51a28387166ff9069b79c5b1b45d917efc33381368083a645c78aa5006","impliedFormat":99},{"version":"01805149ab10adad177b7e7d9e446af6c95e1f7f48db2800e050dcdf90ddfafe","impliedFormat":99},{"version":"57afd9ed037a00dd2715e6128c9f305f287c9b29d9c7f556e4daa074d35a90e5","impliedFormat":99},{"version":"221c6bb2c1152e37f7254d5a167f11ffd57f12c734e970ea15cdc59a97f2038e","impliedFormat":99},{"version":"34b2c4b951dc5a34e03fc0eb0181da3890bd7c720cf8296104aeba2111748826","impliedFormat":99},{"version":"5b6c6c22a039478fa3bc034d6d91d10c0e4d20af1829d986b78a85232cbe0d2f","impliedFormat":99},{"version":"ac67258368872db1e2d5a8fd53fa649fe31c5abe6f62786fd4bc6e6ad51ccb9d","impliedFormat":99},{"version":"3c6e09ab22d0aff0db5dd3b434ca44ed623154cfc5625c8739c5a4b380c25dfb","impliedFormat":99},{"version":"1397759591619d547cbcaea8d94cca1ed29e9f6f13beffaffe9f9307e5955861","impliedFormat":99},{"version":"77381f3914dde6135f903652e311c5bb8053dae28607f519a3716ead90429f85","impliedFormat":99},{"version":"03f966b8e3ca8d79f635c66a3217ebb184a9d6bd6ccb20270d35a7177b418889","impliedFormat":99},{"version":"788ec71568d441083686e3c32d5238de15aab63b59481f9b91174d8b4fb71100","impliedFormat":99},{"version":"976851b5b8d431a8c0767507e182658bb195c7d2fa94a2249f653628791e34b8","impliedFormat":99},{"version":"6d9b1602e3d14e16b782dec30666f2e42d287d6a5345fb7ae52111f9a1e1f92d","impliedFormat":99},{"version":"bb94a73f650bed26030748153efe4730ffc5578a5fae54c34e287956e729340d","impliedFormat":99},{"version":"07c9867e04c1628c47fde22389e075d615795c6b7c66ea90af6c281810699d0a","impliedFormat":99},{"version":"75f943dba7fb8f9472368465096d5f536ef3ef477376d83134978110362ce726","impliedFormat":99},{"version":"fda0aedb30d6f3671dd757a418a60b32699a0a9fe545f68b0be1aea21b1bbdab","impliedFormat":99},{"version":"23abf55ba0b7a59b9bfd17491675b818fc178c581686840a7aef27e45205383c","impliedFormat":99},{"version":"06d3015b06f1f22899905d74207c52e54c051f0466975156de9067ceb884ee47","impliedFormat":99},{"version":"badf4bd328dba83445227652bc1fc2a2d33eb30090e2dbf94d04844c48f3fe30","impliedFormat":99},{"version":"3ecd423076cd6107967e1b9187f38919490d790b258df54e8a6572a93ded5f96","impliedFormat":99},{"version":"3544ad39f2a89044a4d79b878d07a10b9380d39adc2aac3e480b75122ed4c570","impliedFormat":99},{"version":"c1c550ec07e285fd750ac5e3c8ac73e6ab28d775c1cbe29bb97820f169dba940","impliedFormat":99},{"version":"242258092f0ed6960f328b9d7a455c6559c7253c6b57b08883a2fb859c4cfdbb","impliedFormat":99},{"version":"d30e1f8098a34d3b71f1681959f993968fd6d16f40c653689705980ff6610e9e","impliedFormat":99},{"version":"848ac64950a137510b1f47d87cb0f1fe15c7eb06c8e1c2823ae63f413430653c","impliedFormat":99},{"version":"b31006747ab661a13d4bd6bd42715aa1fa8c2288d99a8d2bc4d1f8f81be0d7ed","impliedFormat":99},{"version":"b99e048d5bd6cf544e47f48d4b6893d62bae40217b4d477213e4043b11b0d1ce","impliedFormat":99},{"version":"31f800e9c3607ff0e370bd5a2b73501567dfcf03b7c7c9c9e8927c10a0467efd","impliedFormat":99},{"version":"75624353ffcf91bb2b7911b44075d19a7b9283670f2a78938c17e82e50d1c0f3","impliedFormat":99},{"version":"cad130d0060930b3e5108137b6860fb1eec34406d2710233512256e0b857a252","impliedFormat":99},{"version":"f54bb4e54d36037ae537835edc7d64caff0e33b34fac0a2c3e035a418258ab62","impliedFormat":99},{"version":"725e63c5518a0ca69dc44c12dc4cde29218e4bfd8088368ec67836f394cfc7a4","impliedFormat":99},{"version":"f69b380742957c3cb43b061ab3293ac7ba9d2af1771eba33ef2f814de2353140","impliedFormat":99},{"version":"a6c16d7e6060828143259e5ce1ad0228e3a34e2ff2cf35d2300adc78b6fcb130","impliedFormat":99},{"version":"de9ff289e55588add27a015cc023023660d6b8a21da1a64baa237d0f448b2e96","impliedFormat":99},{"version":"2e92b32bb0b1241e6df9676055172700214318acac3047979c4e03cd74286baf","impliedFormat":99},{"version":"2f7d6f80dd8dd07edff2652926a4b8eeaedafb51775bea7c889afbc795d40b4f","impliedFormat":99},{"version":"32a7a268524728eabdef3c3303a884504d020038f4f320105a96ab7e01430c71","impliedFormat":99},{"version":"586e33bd7f51d99245ff9513e6d603b8522379f29a3f0005176411e16ffeb42e","impliedFormat":99},{"version":"0528549bceed39a3d94c2bbefde7eab0778460dae5eef4ff71f04fcb8c8ec6f0","impliedFormat":99},{"version":"17d424fb44cd45655049d153d11a71cb236155abb50d605e1d91c3736799004b","impliedFormat":99},{"version":"715201e7e601dfdfa08c336f663ec650517e74840d7f988d876f841f0816d297","impliedFormat":99},{"version":"03ceff4db920e1831332a5a40c2eaf8056f221b9e3e672bc294ebc89537c9ff8","impliedFormat":99},{"version":"fef81c4e9f1dfb18873d09b8013567fdb97c0b0bbc3ee7a76c1f2a260af72c8b","impliedFormat":99},{"version":"feca50aa0695b84a0e01990e23e6ba7ab6bd81d50378f5089609b17e52ce97e4","impliedFormat":99},{"version":"377862d812238033feb16a3174f3eca5449b5786727572fc546cb6f1e973adef","impliedFormat":99},{"version":"e362bee8c7c56dad6c0f52b2d83316ed53c6aca843ccc4c1a88b7e55382e0b52","impliedFormat":99},{"version":"9ad91c508ec913a91b433a23c6221e74ccd438b96e001050a7a4cef41a2aef8d","impliedFormat":99},{"version":"eb7e19c5a59896a08776f58b63212ebf6b4c52c24cb6f0574c8ad2e462fc1277","impliedFormat":99},{"version":"c5676e6ff4ed5b0069a3dea05479e3a5abd938dedd4f5ca813f744728066fae8","impliedFormat":99},{"version":"eb874afa240860c59d2443e281d8a0437598f65aa84a3eaa9b5a63533a7e3d99","impliedFormat":99},{"version":"7944d3987fda085b3b5a9325ec52f998d0172d4138fcdcbbff60e34b562656cc","impliedFormat":99},{"version":"b944764dcffb404b05669dede7b7008e62b21a8f7c0cc1c021294490a99e555f","impliedFormat":99},{"version":"5e695fcebbb6a7ff65a5413649befc0510bb34c2e8ac4aa86a55daf77256e17a","impliedFormat":99},{"version":"503a8ac885749cc70864c0dfff99302888a41964e4a9fcaf83ab8d01eef3e458","impliedFormat":99},{"version":"015b9884efeea4f3ffbf092e1c1d6eb69ade71d7d79833468e9c18e36545e142","impliedFormat":99},{"version":"8637312eb67001e93cee29113dfcab695b3e12332a5f4d2fba22471d01978b3d","impliedFormat":99},{"version":"8dfeb90bd8f28f690c724ee3c00d2d32ad633884e159fcfb5ce4e82ee5589c5c","impliedFormat":99},{"version":"eb203bc5bcac0edfc18f2079033038917a42d99775d78566f9844810845aa49d","impliedFormat":99},{"version":"f5df5c1a71732a42fdf23542b344d7069a4e0a68adbec151982b93571442b068","impliedFormat":99},{"version":"b532dd989593d814d9bfcb3131b4331de4b35ade064427001676d1fff001ddd9","impliedFormat":99},{"version":"ca6970eff86a31fd8d9c132f80dbd1aa54d2dcd76a5b2a9108ae8c394bd7e7a1","impliedFormat":99},{"version":"3dad5f9d2442b6a1ee26187724f0a1ebdf9f89b5dff0fb3b8ba1eea11db6d7ba","impliedFormat":99},{"version":"5fca4b593907fc70848e8590d14dba0cf0410e6c061e39c177835e700ad089bf","impliedFormat":99},{"version":"9cd0fc5364ed46b35a958c51c45e4bc47dfaf32750d536b16faab83e885f6c1a","impliedFormat":99},{"version":"4876014affafb8fe03898c335c396ec29ff29ec8ae3b50ad5ea5ff98c9323c8d","impliedFormat":99},{"version":"255cfcfd791b6f0dfd44f17f8bf6d4dfd733b4a8fec6c15efed8013d794016c2","impliedFormat":99},{"version":"8c12c27dc0c277c184812b6605f122f971c2a7b0347e32e995c0b410d96d687f","impliedFormat":99},{"version":"d15d43b6b19a969858befe90f60009952298120dcaab7110cff78a388a50f7a0","impliedFormat":99},{"version":"a6c66a8706af12cecf4c42f17508d6a76b78388e849d8d59b7933a68fdd8487c","impliedFormat":99},{"version":"37b5ab7dcd9f3954013a12e1e873953d8be801cc3f97b4e5d9c4dc895d8fc4ac","impliedFormat":99},{"version":"1277bf682a6d071861d20d2df102d950dedc15e49a96f211b1a4d2c87c83a912","impliedFormat":99},{"version":"8cfe0fafb887fb38150159834ac34b3e91d883b250ba4e1154ce88ed057d9fe2","impliedFormat":99},{"version":"f16b5d560b0e248818ee7c18cba59cdf9e4efa20107be3722e8232aa4a05b61b","impliedFormat":99},{"version":"da5d2ad94cbe6ead090c5dabeb266eb81a958354e487442dfe8313beb467f99c","impliedFormat":99},{"version":"1656706a594b924adfc45a7e9088c63caafb5c2ba689fce0d757d1ee5f016b17","impliedFormat":99},{"version":"50ef2957360f31ed9f3aa91a1bb75d927890469424d1713bb2a5c3eb1aacc4b4","impliedFormat":99},{"version":"a050ee6f9c5833d18643f86c0618ffe791cc15e7dd758f21738e305749e9b002","impliedFormat":99},{"version":"d6d3c9c634567472794a7de284b8220174b57c8ac73b351398436c100bf43cc9","impliedFormat":99},{"version":"a3a561696b28f4e190b734060801f98f6b90cf445996871d2a98e96e4802948c","impliedFormat":99},{"version":"bcaf57053cdd116527f18f99ed70085db39bed9a251510fcd6903e99df6910d2","impliedFormat":99},{"version":"522ff1756b55a8c06ccc949b09b4cafe6fe922fbb1e2d780dc04e992673f6375","impliedFormat":99},{"version":"002a3431688069033aec66620393cd1b97a621e2e3f14742cf59eb472970e32e","impliedFormat":99},{"version":"04ea39e4b3e1d6e56bc1f0bd0c7b19aeb4d35b678937b3ad54c63d44b44900c9","impliedFormat":99},{"version":"7a54a284c5fb690b97ce715f0e7d861c3b150765751cb6bffd6c479c8d5b0313","impliedFormat":99},{"version":"68e90b09ebdc70f73bbf7a632837f153a215ec5fa44354061181d706a991a3b6","impliedFormat":99},{"version":"d7fbd0ea7793a151d792f6ad7d7c9a9ab7dbc69d970d0d0e57b408cba59ab91c","impliedFormat":99},{"version":"c59df2ff58c6adc907ed95ae1e0ddc2f6a123ca1189926dbafa3fae1fe8f40b5","impliedFormat":99},{"version":"b9e75acf8c49e675de4d1f0ddc5f9ccead5e31ce10814bc6c3e159f5aedac1f1","impliedFormat":99},{"version":"717c55229509a89e25c3c3a83a1de364e4db51be5002a738800f76f0ac168868","impliedFormat":99},{"version":"72526a38ff02f77db02a437640df162dd7b542026e0cd0c30b80b4847b154be0","impliedFormat":99},{"version":"74645fa7216f163be6da9092526d7ab1aa4c2840830b5e4bfc901fa592853650","impliedFormat":99},{"version":"ec4ec119f797f71ee6d8110930dad93c689a1683484171621a2702b873d8af1f","impliedFormat":99},{"version":"194560fdeec7316cd47bc201df705df31023382e09a022e780abae975795045b","impliedFormat":99},{"version":"afa28e0c1b26066a331fa400dde21e065ff2275238f41a66d931f56804326b2e","impliedFormat":99},{"version":"09c6639e5622dc1693276f4c7684b0f0f4992d5c4e5c0769dd576e95c50635f7","impliedFormat":99},{"version":"0af521e519e48440bd69f5683fd26542d478c8110c1bde2815a732ea790d5448","impliedFormat":99},{"version":"53c73e3bcfdd414d1f43d62801c7bc03c491c7b13a9f8e7decd2a73afff8a10f","impliedFormat":99},{"version":"49062a955da1d4880135873f5c08988c920429c3785349ed1b4e112b9269d8f7","impliedFormat":99},{"version":"334bc494ebf7f62684a30a916455dc63c6895784a74b07b835d28d0297785496","impliedFormat":99},{"version":"1c671fa97ad69902c110c7890527f5720a785a2e0b68efcb77c16f37d6274d67","impliedFormat":99},{"version":"907467198cc07e6eac62f7eb2bcc7afc31e3ee433ae60000eca62213de971e6d","impliedFormat":99},{"version":"4263e62ba6e779cd26752ab3fcfb42249d009efcf110bf7a69412c1f33582e22","impliedFormat":99},{"version":"fff135e7d6bc235d1968beb6e5d061e243ae19a723a9e2d5b79052eb63318590","impliedFormat":99},{"version":"a723cf11acbb7f1d9b620b90a5cdc50f60f9ac8c2ec7bb6f69751729093180b6","impliedFormat":99},{"version":"019bfea6e0ea6051fe1d51f3d0671fccd704731d54ab218d9a8a42afcde54a41","impliedFormat":99},{"version":"3f9f8c7286eb740abc5ab238fe81d3c4fd5fcde423a120cf55fefd480d694743","impliedFormat":99},{"version":"3f854a9e492f56ef132efbc1bdc155896b97618a2c15eb06248bd88478303be2","impliedFormat":99},{"version":"984d0fd8112e3cdde9bc9cf0875f69676cd5a150caabb228cf067741e1241add","impliedFormat":99},{"version":"401914ef3c9067ec980a75be5e0abbed382a42a279d91cf040e6ec9f455e218b","impliedFormat":99},{"version":"6b95bc34efdbe1082609ab0a1522f30f4b79a906e479af1295d4aba7fa887f58","impliedFormat":99},{"version":"c81e7a416c0e77487b511c0f345797d6323214968009b52dc8c2aa5c9faf7210","impliedFormat":99},{"version":"48f5798a88443d6fbcf24be78dd95bcfd0d173b9639bf3772ea499773adf472a","impliedFormat":99},{"version":"0d8ab497f53d6142282bacf32f1538fc607e267e058074286528126fd1c2db6c","impliedFormat":99},{"version":"5b81a34a60401dac6213a45e2bbde3e57060ff06f847cb005337816ff2015189","impliedFormat":99},{"version":"0b7afe6e094ac7b826a680d4a3838166c438d0d9b0a8867766e137bb2eb24a24","impliedFormat":99},{"version":"8ae43e29b6a1b72cec9bd415afd180de9a9d83423c7d7c8f4d61e090f85ad572","impliedFormat":99},{"version":"f8449256f5c820606e9da9e5dcffd574d48981b8b6520c234b15f8a6bc3dfa70","impliedFormat":99},{"version":"c5aa8fd497a5ce7145a9ab4327fa9a86e8cf04abd71957c9b702e118546b72db","impliedFormat":99},{"version":"3de403593b664a953f7b10950653129a6b70e97fbdbcc79ad8292cebd6602274","impliedFormat":99},{"version":"35c011c44b69e88a5798bb61158c26e35ce74df571c095c029b29d182924c2f8","impliedFormat":99},{"version":"fc41464bb043aad346f6c4a9761ca347ca90ee6912d53b38b8fea621626be77e","impliedFormat":99},{"version":"c9bf49c427e33b552a03b20084624635957dc8468eca2a3d461f0582a011c5b8","impliedFormat":99},{"version":"f4d2c3633596eb54d2bb659bc1c60da3d4157c74c6b6e19f8d27965da2b46bf4","impliedFormat":99},{"version":"cf0c6c6b7ae29e49b64116ac726435fa589a9f4181dcf0fa95e5c06ca07a1954","impliedFormat":99},{"version":"53b2c7304bea0d35da3f158365ecd0794a49cbd8882ff2f7122f99a737854993","impliedFormat":99},{"version":"8ba0c3329dd73b8da0be21357da0dcf8c59e56df9378548e2baa7c05ddd1ee7b","impliedFormat":99},{"version":"6f40ad7380099493513c35be209c0b10a531c4e3bf3acf27d5400d030c59971a","impliedFormat":99},{"version":"d2f0d9d92558f5e5406a561675e6437524bee447f554a8ba6f4dbdd627d0b2e5","impliedFormat":99},{"version":"1a6f8bdae8370c07682bd8dbffb161c2430ea51bd25f0384c66919b4da006ff2","impliedFormat":99},{"version":"ef74f47c63b7a4d7a022c1f569f3ca9c14e3277e0385b037587665d69b96be7d","impliedFormat":99},{"version":"4198bc4505f06500bd9b7db780972b9a301cc946896287e0c9da7d140849ea46","impliedFormat":99},{"version":"990241e0a1ce99f55d209b7957d8ad37ef44aadb98a65d771ace925343a53d27","impliedFormat":99},{"version":"b4b440d99a10cbfd6272aac5bfd9aa9622b9c1f9c43f7d5cf79cb43825614958","impliedFormat":99},{"version":"741587fb86739542002fd67fed070c07e34dbfd9bbfde95ca955144b861d00f3","impliedFormat":99},{"version":"85f6fec457861b1cd7267dce1155878bd33d26f4076db4f399376b74ff492410","impliedFormat":99},{"version":"6989d42d669be40f6591a8fdb8e705df5fec8968a38206f5a0047f47c230d1b2","impliedFormat":99},{"version":"c4dc3d6e7fc6a9f92964a638d033397f68eba61f3c250405a93449081b626034","impliedFormat":99},{"version":"a534aae35e31df8c5dfae7d984612adca9d5641b59b49ead295066dee45b4dfe","impliedFormat":99},{"version":"5bde73a7726033c08aa3a1578dac8f1734dddd9a630f9b985d67365049abfdb1","impliedFormat":99},{"version":"d0b1cdaa14a443a383bfe147dc579b4a836b73f8dfe2b3289e58e871fcad0bf8","impliedFormat":99},{"version":"2546d813c0fcb88951aeeb0c59d42fcc188ca463a6b64045cc091cbe01737664","impliedFormat":99},{"version":"fa36613a2eca835645eda5b9d42edcd51ee8caf8b1b9925fb616c3ca9ca2f1eb","impliedFormat":99},{"version":"4e233c71ce329908730909620ef85af24b60fe520d85d0ab6cd0c8fdb209166a","impliedFormat":99},{"version":"aad34743471540dc34740144e1dccc42c9b4a1522a8f60ea6f8bece95f226aa5","impliedFormat":99},{"version":"9286fbfc02a92a99210da22629d15ace72a71714c3204bb1f21d1647340b6a1f","impliedFormat":99},{"version":"3f6ff7fa12f7ae9e51fb3335767a23feb2042397ff6dd78836ab8380ce06b760","impliedFormat":99},{"version":"9ff80c1ff411da4263c981e187df80b25032f1ac386c137fc4e39252d69819c3","impliedFormat":99},{"version":"05e7d52d0f13fc255dae1568da631c3b31ae36097bf4fa7fafa5d4fc0a902d2f","impliedFormat":99},{"version":"9de7ba484e55a135129114a55baf6401450d4dcdf6072a4026e96a6c491c0df1","impliedFormat":99},{"version":"be8c3c8a9be63d5d07ab0916d6a4636b47da24e8f09fa2bd23be05c1b6426598","impliedFormat":99},{"version":"035cdb01dc859990cc531611dd6c7bb0144f5c02a911b06e7dfbf3232ee0bc73","impliedFormat":99},{"version":"1a95f139da85d7daf0a3e6de7aaf243cad13900f61ed2764a9bbdf64d64ac8ce","impliedFormat":99},{"version":"cce8976bec1dfccb5e48ed58df797a393e3c894397b40986884a173e3ef8fb51","impliedFormat":99},{"version":"d1dfa8127d21751115a0a6ae3e0e0e41f70eabf45e23787ba2d327a14669e518","impliedFormat":99},{"version":"ef87c5b95fbe2151e96c89e6c80ad7dcfa895a7001ea9c0cc258eca3eb84ae49","impliedFormat":99},{"version":"2433129fe6d3d67b8268ba54abd4ab1c7c2f7a32444d4c6a68a9a10be06cc617","impliedFormat":99},{"version":"e969d9b9fd9ca2e023ef701519ccd75e207dd52b92f9af22e15c04fea8e719c4","impliedFormat":99},{"version":"22f273ce016495159b7c0ddba1521435c4ae8f05329efe96fcec598508d5a682","impliedFormat":99},{"version":"dd429b03ce8ba91ab6f204d6c2c7ca00fb3cff07b956da1ac8c60360da28d866","impliedFormat":99},{"version":"b7a63ff548e03c363de65f81f7c31bf98f77b73f13054ece8ee2bc1c1ed9cf6b","impliedFormat":99},{"version":"10122199ed1aab7af1a1b1e1836a79d1401f4700bbd5b85aa1a52cc7d5e200d3","impliedFormat":99},{"version":"5f49779e856a15a93dbc55628c6dd22787c4729a6ecd4a3ef0226ce3efa54d6a","impliedFormat":99},{"version":"bb836f3e3bb9cff93ea6cd392b5fcb88aae3d664d7c09171e6ffacc2f0a44759","impliedFormat":99},{"version":"663757479ca123153d940314df55e939999c56e28b2b52f6c7c8a6f00b59a78e","impliedFormat":99},{"version":"02d5344b11cf703ffd698f1874f5298d855ae6a91c3a2d42c3d95b70c2f4e6f7","impliedFormat":99},{"version":"1db8be2061f286903f62930c719d46369a876340c2571ddc2cfa8b65e462001e","impliedFormat":99},{"version":"d6f8d517ec72c416556f8fae1280d2dc202cdf7bf00621827360bed778a8c19b","impliedFormat":99},{"version":"84c6f7ed4db89f3c5b300c81430eb633116492ca46951c6bb5dd45808c71810c","impliedFormat":99},{"version":"3801017d48638edbf32c445143b804711d2bc1a2ef51f0dceb25fe8a5b591bd5","impliedFormat":99},{"version":"2d5537810389a683449de9b0896ca4b130b93a339d8d72836649f08cebd17f1d","impliedFormat":99},{"version":"900fd868eedf9974863b2cc58d7aee9e7730fed6c7787329c66f02ead215f307","impliedFormat":99},{"version":"558d19d1b6743e92b564bfbf3edf3501ed8bdb2d090181b4fe5003b884694c38","impliedFormat":99},{"version":"2dbd8d1b3b34d8ba5f3c9fb13253d08f3b07fc1710138824011f858907e1670c","impliedFormat":99},{"version":"9ac492280c55460036216dacf01dbe5148e3965aa4372b5fdc3edab7f4c49203","impliedFormat":99},{"version":"657b6b8b5d76a9fc986b9330495f3b4fbb9c7b34c271e53deda88eaa8973cfb2","impliedFormat":99},{"version":"17a97fa195741417d6a71aee84fcedf034cbcaa861a61da46fb6e721ce7ae2e0","impliedFormat":99},{"version":"b2051cf12a3afba968a368f700d1b845824955d478807229b25560ceb55abfdc","impliedFormat":99},{"version":"ee2f8c4790ef349e7777b3faaf599823e82e3e59a4bfc2c67c3e1775d3bee50c","impliedFormat":99},{"version":"8effb19bf88f12addeb45df0c5d05e0f6464612d3d6b34f1da8ca8c2c1c5cc12","impliedFormat":99},{"version":"56aaa79117a6b4b58caac3c352370dfac66540c34356b2a0862841c3f6d30db7","impliedFormat":99},{"version":"bec1c0e444418bd6b168ffb15b76b9441c761bb2d243c089fa6ea378b2cc72ef","impliedFormat":99},{"version":"f6655a2e1d991e617b3695cb250f9a997ad09620c5399cb8de06fd685d3643d3","impliedFormat":99},{"version":"5c7d1b8744a3c63cb23db59258fcee28ef638307c6862f51572805162a851b51","impliedFormat":99},{"version":"448a88c8e7eda3d8999b7022cfe4dbd1cf586e71e21e999bdbbcdd436ac58b8d","impliedFormat":99},{"version":"7fcabc4baa02f69019cbf2b48048fd9454a8b7c0c83c776ed9d92bf53df14d6a","impliedFormat":99},{"version":"ceec50190a9d3d13a8500a8e1d1b6f8f5a3f6be45dc8e9f983530d84dbd69cd7","impliedFormat":99},{"version":"42b9d795a3152c6bb0f641da28297b91d5424cdbe936952ad18c20f501bed1f0","impliedFormat":99},{"version":"37488fdc6ffd2d40cb049ddab8ba198c8e887dfe77510c6c83efb6de34e2fe68","impliedFormat":99},{"version":"af582471a53417da3ef5d56ae772d08eaee896dba489a77fb76428f2c0116ea2","impliedFormat":99},{"version":"661b89ea587a659596859486a0123a631c34b5057993284d60ef9b87c015797f","impliedFormat":99},{"version":"0e6f5d456e1b73ad322c4b0bdcf10b0f9a8a0b75414d5b9e00d9f561a43874df","impliedFormat":99},{"version":"8cabe28809e715b1e2633c3e849053c2b9e2449d311d2494df93baeffe7e713f","impliedFormat":99},{"version":"e72931e0fd3c01a2153527880a56b53a2fbbe198421809dc2a7c3a93ea74997f","impliedFormat":99},{"version":"b70eb8f22c1217715e2c34d1a83a75d5fa024c32b1aef4b7c4db3f98645cb395","impliedFormat":99},{"version":"fc86007838a8c03afea1015f1cc20a7aa55fab268c6f6314943289e3e85425cc","impliedFormat":99},{"version":"3a5b6c07dd61016f03d7d4b9b8714fc10e0ecfb2f358783449a6385b930409fd","impliedFormat":99},{"version":"0b70dc15cd46f0b2f0d705744aa3dc4798b87f5113589ca5e1a7053af8edc756","impliedFormat":99},{"version":"02eb91b64a184428de52c5a303bcbe0e7de5a878a74692ca1b777ddf336ca361","impliedFormat":99},{"version":"ae1fc7ed3c72167972acd4f771883d14dd13d635c3b585606218ea4f9f5662c9","impliedFormat":99},{"version":"f0e4cb01dc2ffb699d0d7e4f0f14208d1ba6e5cbc12a83afab2553a8729661fe","impliedFormat":99},{"version":"3608e6f20899db55d817ab7a76390aea19b8e3bf7cb4becb5f3b70b833db038f","impliedFormat":99},{"version":"434af61f55bf25916aba2d8abcec57ceeef35571daff914fe7b54aba771312c1","impliedFormat":99},{"version":"3f31fbb79cd50033ef517ce3296f511ba8654758609015026227740f4892e187","impliedFormat":99},{"version":"38977f661ec68bcec7c0087960fc6fb6d5addb7cd48da0e19d734b5f09e799b3","impliedFormat":99},{"version":"590a91fe582b89a9bad5b5b4d1a6d9747c5287f6e1b23a2a57d1aa60c1a23180","impliedFormat":99},{"version":"ef2c251603129991a413e295b5bce5d0ada22726bba363db26e563f9162d491f","impliedFormat":99},{"version":"42aa868d84ffa9aac2f5d08dbdfe6cb79436b96d227b836bd655159bbfddba5d","impliedFormat":99},{"version":"157a1f916813abf3e1faadae34279ee65110d7dc8146711240196ce0e46cbcec","impliedFormat":99},{"version":"7d0101529b77bd85692b2a831308a7534a478c60b95a1798c07e14d3a14e4b21","impliedFormat":99},{"version":"4a0d53890ed17ea582794de930248bb3a5a16547b9659f46664149a853f8b1ac","impliedFormat":99},{"version":"19ea1b64d140b3fb5d1b699b09f1aaa60ebf32014f6dee279b96d92ca662d871","impliedFormat":99},{"version":"b2d2ab3ab26f446cad62cc23ded652641a44deb9d19280550c74cc81c7cd4263","impliedFormat":99},{"version":"d3bb594337c7b16cd0aa2f54710afd9c5352f24d0ac83bf02a1efce7e731a0b4","impliedFormat":99},{"version":"9afee2d40467087a6aed46b5fef0548c2a1351d533f2aafc68cb47694a81f7c2","impliedFormat":99},{"version":"372c39fd10f96d006497fc2bf9d56d0a602119244ed46d087a2bd5bb037821d9","impliedFormat":99},{"version":"86aab19392ce35fbf19b7beb7968772b78380fb3962b020eab778e2060b68087","impliedFormat":99},{"version":"d9e8f082189fbcd24d1c13275aaffebaf48c9222d20654d61ad7082f6f2df101","impliedFormat":99},{"version":"8f2350543fe05a8d34952c3dae8f9781594751f5ef130384446a729e3dac7bff","impliedFormat":99},{"version":"cc27791842a8f54b24e8c3c631fe842f96421d257d0f7b636ba416f8ea454bc5","impliedFormat":99},{"version":"87622b9b115ff00fdcb1ad2e5c0f6064249dd577cd94140d2429aed76218195d","impliedFormat":99},{"version":"987a12239021ad858813841f22475f2a225d3333a2dfd9beb32222c9e2dc2505","impliedFormat":99},{"version":"ed3f6a7fbdb2e7d6bc2636b3f56c08ed34d2ba80ad3c4d30f03a8b12298ba100","impliedFormat":99},{"version":"f2b4e9551b694795727201a46b5b0d09383c6fc88966d3472aec3df1dab18074","impliedFormat":99},{"version":"ae868f126890affa478b4628684db9c084b00eaea3ac884ece0184e8f9b4041c","impliedFormat":99},{"version":"0aa2fc9a3936aaed64b486dc8efcbd6c62e0afad81ffd72be408cb97867c0b16","impliedFormat":99},{"version":"e0842052caa52cb6702d9dc7d3f90c799a6123e8509bb79465c14957e990b204","impliedFormat":99},{"version":"1caad517833757199ab3830587bca968433d3e1e485c518989e10a3b77f85b24","impliedFormat":99},{"version":"9087d62992fb955a421851106b0e8c815f3e24120b95c56e8373d384e273e0e5","impliedFormat":99},{"version":"7a5bcb70a2b1b72d52636ef8aed8b8c8a374067367667fcb8517e492f37329c3","impliedFormat":99},{"version":"ebdb84450ad6efa9a70dbb78f4c0f9a16888bd798eefc37f6cd04d2572206242","impliedFormat":99},{"version":"f93d43b0832bc9f5e6a3ec0358bfee8dc2f44f748278f3e6a073220844e78c78","impliedFormat":99},{"version":"29d83f8e43a87dc636d0e5764a89d45129c9a0f0f8abfa0e3a58e9a141cb66d8","impliedFormat":99},{"version":"30d463e7ce174f7a529d3a832711f424c984cf517c08f59dbcd2ccd5b16bb6ea","impliedFormat":99},{"version":"6767ab11a8cda8c0ac2ac7e2252bf7be2299410752049237a48d93c62a4a7195","impliedFormat":99},{"version":"21394e045094d440e762a0e3f8bf9b8b58ea9daa89e399d108ea2d6a3d80fb96","impliedFormat":99},{"version":"256cde5dd5a4f0ed7516ef587efd4bef006317e8daffc232974fac0efe47ecee","impliedFormat":99},{"version":"53c4229dc8cd2aa22a2c58537514818d429b6972555241f821cd7e1701c42d38","impliedFormat":99},{"version":"0fcffee63e98cf059b427289b97d6be2e49eafc9d3d19d8f527aefb0f28f047a","impliedFormat":99},{"version":"6745a82126e61c30cb5a8db54d35886159c53ac5a28f5a61d31fee282598f7c2","impliedFormat":99},{"version":"be768a2f53e62d96a980aa56e02861472f7e974862730dd12fa26cb4bc50e348","impliedFormat":99},{"version":"a33c25c4c281b8cd1967ce9f2d2ad451edce03a2254102365f3cdfbcf1b00d3f","impliedFormat":99},{"version":"1bc5d66f065f14c9c6290f6fe09492e60d30901737b68a1e344f2d61ed001e96","impliedFormat":99},{"version":"bf531fe3337bd1315f2dae65b2607363d05e5a862ea50a547702a4d950201094","impliedFormat":99},{"version":"fe896af05f06c4c6257fdc8e8cad8a278c90d4b38ff6b70efc5b5e3ecc880bb4","impliedFormat":99},{"version":"362db1b55e2006226b53ac79a8ddd5a12976bdd4531badad0ddff27b49817de2","impliedFormat":99},{"version":"c3ff132ac57ce2706280f9e145befc0e7ee6060caebb32ff3022e9c154575876","impliedFormat":99},{"version":"8c1e7fe0b90aeba2f3eab5fe6e5fd66e70ddb6cd998a1eda1c5cfdd6336ba94c","impliedFormat":99},{"version":"acf830a1733f75248a8fc2d3dcaff39c6e76f9ddf27c20ba09a584da138f46b9","impliedFormat":99},{"version":"89af4f75c1f204d678637102d01382e0b8b167e0b213a42a6fab2a64826e815d","impliedFormat":99},{"version":"cd8dd8ebf533d787130cd5371f8e7fc4403f94cdb2e0dc2e5acc4ae681091057","impliedFormat":99},{"version":"50d2f4d075114bd15852e0ae28244f897e8fb7109fdb4bb980cd0d3071ffa87e","impliedFormat":99},{"version":"fb29fb3a2e3247167f4e699f19b47cbbe02e3137794c48d08ef6140c13a82a13","impliedFormat":99},{"version":"5a211830f651041b3d3873533d8bd4afa01263306da8ca2fdc1e0e1d593caf93","impliedFormat":99},{"version":"00287f47a7a9ab63f5e218d1db19923519e6761a3ae2ba9222d2c38a21a4bb35","impliedFormat":99},{"version":"17f1776b27b2c29bebba486721f5d9319dd9b651b6e3be83de3fa216085e948e","impliedFormat":99},{"version":"21e8114b92a2d11e1f58e2be0a9c59e6d7a9d2fae4bcbed1353bfdea98043fae","impliedFormat":99},{"version":"7468715152819058c1a2a27ea8688a7ae51f9800f1273e0815a60b53a0c023ac","impliedFormat":99},{"version":"fcaaf555e60e7e4ae4b60408c7bb84c0ef61d656a4315bcb6589cae1c5ef7741","impliedFormat":99},{"version":"9192851be0a7d39b5599d1c5a22cd17343c9dac43cbcfed922809d311423c422","impliedFormat":99},{"version":"9ddf47eb87c7613d5a5bbb577fe6ce87dd34f2c7681dede0ab9fa1d6bcaa7242","impliedFormat":99},{"version":"57b00b8088284b7178fda7be8f5987d5edcdddfa10bd2f777c9910bbb7ac7e97","impliedFormat":99},{"version":"0244571048467de1c966215b7506b1a65f19594084b159e675f7d03bb4da4ea0","impliedFormat":99},{"version":"cf03afdf519792b0f8bcc22c984a5521c5d192c3f46b1caee9d645dc02cc076c","impliedFormat":99},{"version":"8ef260aeed7f688a8c40f0a3480e8e4ff4c1406b0afc44544a8d0087c9f80cd2","impliedFormat":99},{"version":"121a70198c504bdf22f901de9f5c4b2264e1c35ba4979c5126d8dbf91c08b011","impliedFormat":99},{"version":"500265f07d0faf96f8b04ee1c9e0a77a8e5e1ae07b075adf58105c05db2687ac","impliedFormat":99},{"version":"5eafb802b8483ae0fda85920af0802e633178c701f631ad85db80156054a3840","impliedFormat":99},{"version":"30c0d02586f80d0df6dde2b95d7f1769e1590e92bd13e4b798bdd840ae005797","impliedFormat":99},{"version":"41edc9dcb80ada08b64177bd4405650842e2e17f86f2ba905e5a7395b660c1f6","impliedFormat":99},{"version":"282c37fb44ceeb5bcfcf070f383314a1bc33b1c1f089f682f53e79b0bd90ce7b","impliedFormat":99},{"version":"87858dcdd2e39eb46633a5db6666f202258d0d0c2040a90e775010d92776c5c3","impliedFormat":99},{"version":"57d5f16d751884e0a2e97ef772d1a24f256dd1b82b35397041d91baa85e4bd93","impliedFormat":99},{"version":"d5851073cd5047ff38938d853a37c2d709d68a74017bd4df1010187f44541fa2","impliedFormat":99},{"version":"a6c6485b7c9ac65bb8147e2d6a43a49458edf99a3607fbb75c67f0a08f230fb2","impliedFormat":99},{"version":"979fa80f9aa7e1f015e0a019a28baed03f69924db612889d1899b62b4439f8b7","impliedFormat":99},{"version":"67cfa42620d86ad53914cfec05a9d8f90e43fb28fef9323275d25f6dde1d7790","impliedFormat":99},{"version":"f7f586cb700449ac509cc542095a01fa33d21eee19201ef3793abdc393a70ee7","impliedFormat":99},{"version":"08b4120029f17693ae31a695121c2a37fa1b7f98769aeaf4582ec7a7b25bb352","impliedFormat":99},{"version":"78138a90e0027ff8005665cb6375b94140b8050a120e6ff9a61515d439a15a62","impliedFormat":99},{"version":"acf24ed1b0a60dad01e526804173fa7593491db7826bd5f39a5af335786164be","impliedFormat":99},{"version":"7a1f228faa5fa5b29b96c1ad04293e310a20c22ec1b83b5adbd1ee306625ddb1","impliedFormat":99},{"version":"22d5c827159162dd95e53a3a67e0d84b61f08d549589ce83dc650ba2446e4055","impliedFormat":99},{"version":"7719c09b8acc28e6283481e3907a990b7f1e730f830ace38f57eb7cce753717e","impliedFormat":99},{"version":"54ee6720ce787300bf050b24224405696295d9e2f3f42da366a0b62758835451","impliedFormat":99},{"version":"8db5e7a47d3796b48afb5417f16e3c44c9784dffe6b0daca679e3faab69fbc28","impliedFormat":99},{"version":"2fd73846e6a7602ecbcfba95e7ae8c535340bdd49121ec0da552720bd8273e65","impliedFormat":99},{"version":"91a5549884a38ea6510c6b2b2bc3908d7aaa9d93982423635c6d70173002cbe1","impliedFormat":99},{"version":"94fde0116233179a8b9aff97f1c94a774abd836e257d5f43b77a52be83e47fb5","impliedFormat":99},{"version":"0953aa9d052d4e83a8fb3b88c304c420d44ee7e20d1b341ce91e214d06e96fc3","impliedFormat":99},{"version":"80dd0657da599ac1840dd2bb6787c7742bcb7efb1a7e95890a822dbb01ae9471","impliedFormat":99},{"version":"697929cc709ce1a14bfa22637796c90de5a7deac1afc32d703aed10cd148230b","impliedFormat":99},{"version":"a258c163f1cd5155ffdf6bf9334260cad50b42773f79e47c8b67f665f541d580","impliedFormat":99},{"version":"c2bff621d611a1cc7e0cbf6f8bb2e5fd99930b159d80bfc721bd6e2f3ac1af50","impliedFormat":99},{"version":"56e9483c87ffd60f3811152a21d9704384c6539b13fef717ddbf99c5d944c330","impliedFormat":99},{"version":"97cb603e7ca4203c5cf2402a88dc566e2fa1e2206d97016072066387ecf7087a","impliedFormat":99},{"version":"32f816bc6d64a56503bb2398846ba92f6e058d93a57ca8dba27790b8214fc88c","impliedFormat":99},{"version":"99c9b803342e29e16248f6d03fccbc88f202c57852c4ef2f8f37407965cfbb6a","impliedFormat":99},{"version":"9057244241137ab9d0f8e7b2419d26d6b5794c063ff2a390047ab733e17a84f6","impliedFormat":99},{"version":"8c9a39e52635167098f9a8f44fd15c2c93af92caac24dfabeb62975f11518aff","impliedFormat":99},{"version":"497306690b137169dba6d70af7b3db655ea7b115fa565f8a2d1d80675ddf00a8","impliedFormat":99},{"version":"0c46d7c267ba59b302512de340f4c92b97764eafd086c5b13477fedfa953385d","impliedFormat":99},{"version":"0f2e941fbb7fa25b52f407745686b2e905ec03225af1de5285dc8113cf9f38cc","impliedFormat":99},{"version":"a12f3295a92f365c2919a9b128984c35486282b7de8f3ff81fc360b8f137aaa5","impliedFormat":99},{"version":"38b3fcade0a4b61a87c8b6689f8434112bede7832ba491511aa83f519036d7c4","impliedFormat":99},{"version":"c326bb72f933aa18f366a29a27dfd4193749c4c077b0464bb31054134a84aa8b","impliedFormat":99},{"version":"0222992caad46191f90e9a5987e0c92ca95c5bb631f8f953e4c92b700411321e","impliedFormat":99},{"version":"fbb281974839d3fcc1fc0eb70b71f68688d9d2e3c719f7956f02ada2d03b0e2a","impliedFormat":99},{"version":"488bcf6a8b6a65669199f64f11c75102a11518759dc23f7d0bcb3257e830eab7","impliedFormat":99},{"version":"df38839fca3589013d3cd76564185ab4d19ce938593a27602cfd3e50f42424ab","impliedFormat":99},{"version":"c44f3421179cfb7ac73a38b1b9e1d5d229228327e0ede465d9d9a21c5039203d","impliedFormat":99},{"version":"b4d6ec77adcdc6728c52f2739954c7f5ae1c9598c5f0a6b8e3ae73989590e9d5","impliedFormat":99},{"version":"05718aee3a6d1193f2a4b1772a3ef60f1ebc0228a293b94c84a602fbec0ec5e0","impliedFormat":99},{"version":"b62e58a89eb8b818d7422360e5ef6f69038be1cdac57ae5fabe6f1060aa880dd","impliedFormat":99},{"version":"eb4c841c0bf793dd919904718220df9623006e90628e7e332b708239a5cd3c42","impliedFormat":99},{"version":"0dea1946e1a188dcefc1a78bd3e8d206b482bb0e34205c8bee073bcf9e9a81a8","impliedFormat":99},{"version":"57f207358f2409974d35d0c62cb39b0e2122d87f74314ac36f362a591b0eb02e","impliedFormat":99},{"version":"c9d4c7b66b4f74273a4cb6fff0b42833916c043a4cfa450a13a71ab3a261ad6c","impliedFormat":99},{"version":"943e697697e9e73676b145c331f114e733753cb920d08882f8db5faa841e0f41","impliedFormat":99},{"version":"3dc164317289da2ec08166baca1c10ca42b29fa2ea51d4b1769748c3c06d4da1","impliedFormat":99},{"version":"ca92a9ee21c608133d7c5d16e16936e072b6d48b5a7258736eacc19f76beac38","impliedFormat":99},{"version":"db6d9a3de83202ef18f6cabbb064362b6ec796fa5499e18e89cbbd1f22f81902","impliedFormat":99},{"version":"1bc55655e0c89b5d02451cdfd1d11595aa3b4c55ee829fe502ab352218ef6d1c","impliedFormat":99},{"version":"f8c341677219569376d0eb374bc9c8483c7d13a7d9ba7820ddd68aa188e641b6","impliedFormat":99},{"version":"6e8a8d10c8e40378dc5aa955218c5b4f374465eebc313adc4bafb69b9ad4d77d","impliedFormat":99},{"version":"51eb031a7f09d002181adb6a235a49b25995ab954e9f319b9edab0a8dc3f6e8e","impliedFormat":99},{"version":"3bc01a0f49b6a90662942f70139d9d44b8eaf2527ab95bdaf3a1a7d0383e65c2","impliedFormat":99},{"version":"1fc08a76433c326036f4b07b8eabb370f0e4b66429a17a940b2eadf82e4cd0c0","impliedFormat":99},{"version":"9d71b80f4dd663e7be4960a4b4fc48bdff4f1db34ffc9a3c01b3fa7de1ed2330","impliedFormat":99},{"version":"42670fd2d98fce7eaa84ddb1ba6a2bb6015df92db527913f869eb545d94e60f6","impliedFormat":99},{"version":"dcc306d9e63904256ba262f23cfa59fbfcef86f4caeb88835146164ca2a19bc3","impliedFormat":99},{"version":"18cee427b1962391970a74a31bbd4c150ab4bea0118dfa0ce9722fa276f1530b","impliedFormat":99},{"version":"d53ce1daa4010a2195a1710b2da24e464afc8f8b8dbe976ef3626a5a53e3042c","impliedFormat":99},{"version":"1ce643fded91c3a62f16ba0c7f5e607f68d5792a0282c57019aa64ce61df5c05","impliedFormat":99},{"version":"08b9b1b7f590e2b9dce12e29ef7cc0b0257a1aaea8d0fc2cd88233e36f716d5f","impliedFormat":99},{"version":"1e9201bf6f6968b3a2e05fa337b2d824a9de4f8a4fabb43d3a39def1bacc40b9","impliedFormat":99},{"version":"6a2b97a8d4f8d77bfde0ad800d2ca49f274fa0e25036645345168f033a8b559e","impliedFormat":99},{"version":"676ecc05abaf7e2a33686da7f5a998a8812fde2b4b42cb756b8ee63ef22dad55","impliedFormat":99},{"version":"cca1205cd000d7a9a19dda43d3bd5079ed8d70f81ad1f7d3912d2c4d68c19bcc","impliedFormat":99},{"version":"e98020ecd0cca8549262c22e1e566e35232e038650ab9dec76c4d9c343cd22c0","impliedFormat":99},{"version":"ca747835676df2aa94222860024b77a548e1c1507c3c4fafc25f2d92973f1c19","impliedFormat":99},{"version":"c024e4c849cbd9492e428f6f686d5d47c13f8b1978856abc0b11b758d26469d2","impliedFormat":99},{"version":"c392ac93c5e068db0465a6657921c5e7f191abd0b437b4a9c2adc36da94b0c74","impliedFormat":99},{"version":"479d563dabfecd2b14d7ec2537d3511c20d2a3440296fef7196edbb8b494d3dd","impliedFormat":99},{"version":"322131ab9e1654f5213c906962bc32778f54e7d535e82e2230b852d319ae8621","impliedFormat":99},{"version":"6f7065ce4d734d131e3d2c01210d511cff0e5fae015c31482b320a834825c448","impliedFormat":99},{"version":"247b3b8c56f8371ada220c9a9f6add3dfc4fdd2b9071bedb5ed419ea10940452","impliedFormat":99},{"version":"4a76d4e462ed14f907f9481cefebe4ceab9ac5c5b3aa4385c345d8a9f4cda619","impliedFormat":99},{"version":"b1f0deff4fe7bf2f0cb9c21e20be987cbb795315dcadac0b68d9e76c95966ca9","impliedFormat":99},{"version":"ef1a82d8c935053d44d6f528e058d05eef67ddb888eebc3a91834fdcbdba346d","impliedFormat":99},{"version":"eb97b7250139e59ed75255aef10fc86db69cd581bde7e22e6489b0b040f4c6e4","impliedFormat":99},{"version":"8b2c52cb91dcde62bbfa05daf76ba4da979808cd0e689320fc9762376b4ac6c3","impliedFormat":99},{"version":"9eb7631a1e210d6b0909ffc776eade0f1a70008574cbf9c3649168028bc563f1","impliedFormat":99},{"version":"6b88fe55b86bc79c7520b2679c7986923c71a5bc33854175955e31b5b9e6038b","impliedFormat":99},{"version":"069e31ae523cb318e9aae15f78260447ccd27bffa5f319f56489c0a416490eb0","impliedFormat":99},{"version":"1ff0faca356af9440189026e7ead9f4461af4109fff62c9508b8c0ed9a49ce68","impliedFormat":99},{"version":"0bcf85264f800550fdc97d3cb0ff2f8f7d75a943e01c6c15ec377f4b51bb5f02","impliedFormat":99},{"version":"b4f4fc24849f8b8f21fd31bc16d4057ef33af97e8e3cd57b247399ca506152cc","impliedFormat":99},{"version":"dcf64894451cde209d632119dec1e8fce24e4904b284b940d90435a92a2c6385","impliedFormat":99},{"version":"5aeb99822fa7426946e3a084fe3b60cf8d62b9a22399e3991be0826bf8928b8d","impliedFormat":99},{"version":"96880c28fb55d3330569b71bd61ef4d0af993ceaa9db5655becdcf6fb82b3489","impliedFormat":99},{"version":"68f1a4ec2937052ae0dd18407eb8d1b579708970ced79c6e7cfe4a93d0a00385","impliedFormat":99},{"version":"efe0fabfc89403ce6a4a8b1fe3a7633f1161b7e10d9824299560f2d15e4e606e","impliedFormat":99},{"version":"7967fa7a9f6773b95983f48e97e7035febdf1d68e9d6d076e21ea2616c206356","impliedFormat":99},{"version":"b49164adeeee1b545ec30cf015f23d0b6fc7f5721c5b81812cdf394140986ca7","impliedFormat":99},{"version":"39fdb2b6872a2169add72f5d44f397ea69374ea938c5343229e108f007253bf8","impliedFormat":99},{"version":"6bede1e3bc1902af03665eb6935d9619fe485fcb17df7fc647ee6ee74a802a9d","impliedFormat":99},{"version":"4c4cd7a14fe65ee08a34e47c43850496cc8ae8e7cc89ec8a2c8458ac4038ee4a","impliedFormat":99},{"version":"5d5e263808e7c276dd788f1a6ad27f227fd41741346dfa56c70dbe38f9fe6151","impliedFormat":99},{"version":"88a7b0cf5b7e0e2111357089b57302f06fa1b6227dfb0771d3f27a5e9d8dd9be","impliedFormat":99},{"version":"ef7c9468b5a48fa6b69b344224a00b9208ee59133e201e1e97a16c77863ab9af","impliedFormat":99},{"version":"6328ab8645c1d5bb6e8a6842d7948b10f2f3f604a3bb9d3a128323dcb6488d27","impliedFormat":99},{"version":"0eec40d2a72f5ffcd1186d8b777a22757bb5fc63725df49c17930cdc93863278","impliedFormat":99},{"version":"8f2dd4412647aea2f4051ec8b633ab31d777c9b818fc13ddb2b4bd3f14c6ab15","impliedFormat":99},{"version":"725790a23df77a71cb1aa042061abeebf5aca3adf564c3078c6f5bb925c8b8c6","impliedFormat":99},{"version":"5dda0fdf62bcaa5710d1ccd97adea53f875e01e854995e55488256ecba4f84a8","impliedFormat":99},{"version":"57c99c92a7d6b1874c36afbfc38f0a69f40821cb8e5a4c1fc949ab2d0ed9dc48","impliedFormat":99},{"version":"bf0b1e6c1bb4930244203a593c6db7aed456e635c31aba73ee2102c55998861f","impliedFormat":99},{"version":"684fed66904651fd676b78ec044da251651f4dfaedb163df74b2280013d5cd5f","impliedFormat":99},{"version":"1cad8abbc5f25133dea041deb44aa979498ee0b66e1ddc3d00f299e3629d4d6f","impliedFormat":99},{"version":"54dfbe6b81ce997409cc2c0bc37f492eeca1130ad5025e5b9148e857a8e34478","impliedFormat":99},{"version":"4bb6f54e837a952382d05afe37f3fea393c3908b14223cef578b882b00e9b31a","impliedFormat":99},{"version":"f7b3b183e6fbd30930c3e6bf7ce1953433c5cfce3142e1f0247fc4c6c26c5535","impliedFormat":99},{"version":"53c0d5e4b66e6f7fec9b79c3f776b85cd6be1e1d5d62bf57c63ecfde794ec6a5","impliedFormat":99},{"version":"7764e57eda6746e2ddab9b085a0fcb35d2c8ecee5d36759ae21c29038014a824","impliedFormat":99},{"version":"c3bd90fd93652ea125e8ba975bbd68d17f88ccacd0abd408fc2c64d1331a19cc","impliedFormat":99},{"version":"80e2f6580bb45d179d283cfac2863e94ad87c2ddce90e33dfab141ac4115379a","impliedFormat":99},{"version":"c2043b6cddf15439ba19f3293a7d8626ac8f31be86d9d8998c3323af94feeb8c","impliedFormat":99},{"version":"c3ce2db820d63c84554c94c5f929ef7786a4e4a7d61db6fac09bf2e85243e51a","impliedFormat":99},{"version":"8dfeb49bc8ac66938f09bc428ad4285975421bd18558604f0e098932dce8f9da","impliedFormat":99},{"version":"b7c1b2e00df8531e5e0d58efd255a2af435c1b68a04dc6214003a592b6fd5127","impliedFormat":99},{"version":"5d27a5d59ac05633bb38b263a713c2a2b15050dd6037f57efe7b897968778fb8","impliedFormat":99},{"version":"e61ec63942cec5365c27d711a3e47f0189aa2e8dff000f806a91e0a77aa36c10","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"0cd3d259f10d4a23a3d08d75a25160dc6782e75f44513f23f1e36fda7ca9df75","signature":"3ff1401d0cecf3a64b7d4102e48c03fafaac4122bba0e433516328960e80901e"},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"2165468caad244c3eed37b304fa2a8023fbcad89f1d5f5c7f4c3619ffe92f832","signature":"0f09eb23956f5d9942b47e91d5f7f0451b4c7fe2c9288fd0d8c58993aac60001"},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},"7de3463e27178a6e7298f263e8c99320ac6136cef5ab6e88714c5c16b495fb48","c622f6c3b69ab15997c6b520f4c56ddf7daaea61ccbe755df485702d3da1289b","753c71562750f210ae3bc909ea916db4ef664394c2b6d0059fbd050a72cabf78",{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},"12b3c4b5cf0f53d8b75ed01673fa10734e0a06e80b57e424988d2b7cd11ba8da",{"version":"4c2e8b064d481c91793a6541a2a9534455a1da8c2ce06fef52e8535df08974ea","signature":"b607d70fd1e0dff036aec2917a74fb645d36171640c78667bb09faa4e0597816"},"6befe33a9757bd12f8a92fc8c85588d682666c40dccd75fb2b778c9e33c0d468",{"version":"37c7961117708394f64361ade31a41f96cef7f2a6606300821c72438dd4abda3","impliedFormat":1},{"version":"d519b53ae419dfdb7c9fa4406f15b4f9b75611a243b0880cf8d431e4dae26d97","affectsGlobalScope":true,"impliedFormat":1},{"version":"3d9189f26f01d4e36d3fb380810ef5999992235282e3c293da77d1d8aed09d9f","impliedFormat":1},{"version":"3787007c141f3168eddd3a2f0c1bc7518892336835811c8e1ca0dee48601f66e","impliedFormat":1},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"f7cb3450a592eaa1d3e026ec3fe84eec3a2260a71acdaba000a6c1a542bd2073","signature":"fa98b3980448da098892380397b265c9bf4d35f3cc03debb0328088344b7e503"},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"89121c1bf2990f5219bfd802a3e7fc557de447c62058d6af68d6b6348d64499a","impliedFormat":1},{"version":"79b4369233a12c6fa4a07301ecb7085802c98f3a77cf9ab97eee27e1656f82e6","impliedFormat":1},{"version":"2b37ba54ec067598bf912d56fcb81f6d8ad86a045c757e79440bdef97b52fe1b","impliedFormat":99},{"version":"1bc9dd465634109668661f998485a32da369755d9f32b5a55ed64a525566c94b","impliedFormat":99},{"version":"5702b3c2f5d248290ed99419d77ca1cc3e6c29db5847172377659c50e6303768","impliedFormat":99},{"version":"9764b2eb5b4fc0b8951468fb3dbd6cd922d7752343ef5fbf1a7cd3dfcd54a75e","impliedFormat":99},{"version":"1fc2d3fe8f31c52c802c4dee6c0157c5a1d1f6be44ece83c49174e316cf931ad","impliedFormat":99},{"version":"dc4aae103a0c812121d9db1f7a5ea98231801ed405bf577d1c9c46a893177e36","impliedFormat":99},{"version":"106d3f40907ba68d2ad8ce143a68358bad476e1cc4a5c710c11c7dbaac878308","impliedFormat":99},{"version":"42ad582d92b058b88570d5be95393cf0a6c09a29ba9aa44609465b41d39d2534","impliedFormat":99},{"version":"36e051a1e0d2f2a808dbb164d846be09b5d98e8b782b37922a3b75f57ee66698","impliedFormat":99},{"version":"d4a22007b481fe2a2e6bfd3a42c00cd62d41edb36d30fc4697df2692e9891fc8","impliedFormat":1},{"version":"9d62e577adb05f5aafed137e747b3a1b26f8dce7b20f350d22f6fb3255a3c0ed","impliedFormat":99},{"version":"7ed92bcef308af6e3925b3b61c83ad6157a03ff15c7412cf325f24042fe5d363","impliedFormat":99},{"version":"3da9062d0c762c002b7ab88187d72e1978c0224db61832221edc8f4eb0b54414","impliedFormat":99},{"version":"84dbf6af43b0b5ad42c01e332fddf4c690038248140d7c4ccb74a424e9226d4d","impliedFormat":99},{"version":"00884fc0ea3731a9ffecffcde8b32e181b20e1039977a8ae93ae5bce3ab3d245","impliedFormat":99},{"version":"0bd8b6493d9bf244afe133ccb52d32d293de8d08d15437cca2089beed5f5a6b5","impliedFormat":99},{"version":"7fc3099c95752c6e7b0ea215915464c7203e835fcd6878210f2ce4f0dcbbfe67","impliedFormat":99},{"version":"83b5499dbc74ee1add93aef162f7d44b769dcef3a74afb5f80c70f9a5ce77cc0","impliedFormat":99},{"version":"8bf8b772b38fc4da471248320f49a2219c363a9669938c720e0e0a5a2531eabf","impliedFormat":99},{"version":"7da6e8c98eacf084c961e039255f7ebb9d97a43377e7eee2695cb77fec640c66","impliedFormat":99},{"version":"0b5b064c5145a48cd3e2a5d9528c63f49bac55aa4bc5f5b4e68a160066401375","impliedFormat":99},{"version":"702ff40d28906c05d9d60b23e646c2577ad1cc7cd177d5c0791255a2eab13c07","impliedFormat":99},{"version":"49ff0f30d6e757d865ae0b422103f42737234e624815eee2b7f523240aa0c8f8","impliedFormat":99},{"version":"0389aacf0ffd49a877a46814a21a4770f33fc33e99951a1584de866c8e971993","impliedFormat":99},{"version":"5cb7a51cf151c1056b61f078cf80b811e19787d1f29a33a2a6e4bf00334bbc10","impliedFormat":99},{"version":"215aa8915d707f97ad511b7abbf7eda51d3a7048e9a656955cf0dda767ae7db0","impliedFormat":99},{"version":"0d689a717fbef83da07ab4de33f83db5cbcec9bc4e3b04edb106c538a50a0210","impliedFormat":99},{"version":"d00bc73e8d1f4137f2f6238bb3aa2bbdad8573658cc95920e2cdfa7ad491a8d8","impliedFormat":99},{"version":"e3667aa9f5245d1a99fb4a2a1ac48daf1429040c29cc0d262e3843f9ae3b9d65","impliedFormat":99},{"version":"08c0f3222b50ec2b534be1a59392660102549129246425d33ec43f35aa051dc6","impliedFormat":99},{"version":"612fb780f312e6bb3c40f3cb2b827ea7455b922198f651c799d844fdd44cf2e9","impliedFormat":99},{"version":"bcd98e8f44bc76e4fcb41e4b1a8bab648161a942653a3d1f261775a891d258de","impliedFormat":99},{"version":"5abaa19aa91bb4f63ea58154ada5d021e33b1f39aa026ca56eb95f13b12c497a","impliedFormat":99},{"version":"356a18b0c50f297fee148f4a2c64b0affd352cbd6f21c7b6bfa569d30622c693","impliedFormat":99},{"version":"5876027679fd5257b92eb55d62efee634358012b9f25c5711ad02b918e52c837","impliedFormat":99},{"version":"f5622423ee5642dcf2b92d71b37967b458e8df3cf90b468675ff9fddaa532a0f","impliedFormat":99},{"version":"70265bc75baf24ec0d61f12517b91ea711732b9c349fceef71a446c4ff4a247a","impliedFormat":99},{"version":"41a4b2454b2d3a13b4fc4ec57d6a0a639127369f87da8f28037943019705d619","impliedFormat":99},{"version":"e9b82ac7186490d18dffaafda695f5d975dfee549096c0bf883387a8b6c3ab5a","impliedFormat":99},{"version":"eed9b5f5a6998abe0b408db4b8847a46eb401c9924ddc5b24b1cede3ebf4ee8c","impliedFormat":99},{"version":"af85fde8986fdad68e96e871ae2d5278adaf2922d9879043b9313b18fae920b1","impliedFormat":99},{"version":"8a1f5d2f7cf4bf851cc9baae82056c3316d3c6d29561df28aff525556095554b","impliedFormat":99},{"version":"a5dbd4c9941b614526619bad31047ddd5f504ec4cdad88d6117b549faef34dd3","impliedFormat":99},{"version":"e87873f06fa094e76ac439c7756b264f3c76a41deb8bc7d39c1d30e0f03ef547","impliedFormat":99},{"version":"488861dc4f870c77c2f2f72c1f27a63fa2e81106f308e3fc345581938928f925","impliedFormat":99},{"version":"eff73acfacda1d3e62bb3cb5bc7200bb0257ea0c8857ce45b3fee5bfec38ad12","impliedFormat":99},{"version":"aff4ac6e11917a051b91edbb9a18735fe56bcfd8b1802ea9dbfb394ad8f6ce8e","impliedFormat":99},{"version":"1f68aed2648740ac69c6634c112fcaae4252fbae11379d6eabee09c0fbf00286","impliedFormat":99},{"version":"5e7c2eff249b4a86fb31e6b15e4353c3ddd5c8aefc253f4c3e4d9caeb4a739d4","impliedFormat":99},{"version":"14c8d1819e24a0ccb0aa64f85c61a6436c403eaf44c0e733cdaf1780fed5ec9f","impliedFormat":99},{"version":"d36518bd617ff673c7d9f372706f241932a43f27673187f2a8472e93c40041c6","impliedFormat":99},{"version":"f8eb2909590ec619643841ead2fc4b4b183fbd859848ef051295d35fef9d8469","impliedFormat":99},{"version":"fe784567dd721417e2c4c7c1d7306f4b8611a4f232f5b7ce734382cf34b417d2","impliedFormat":99},{"version":"45d1e8fb4fd3e265b15f5a77866a8e21870eae4c69c473c33289a4b971e93704","impliedFormat":99},{"version":"cd40919f70c875ca07ecc5431cc740e366c008bcbe08ba14b8c78353fb4680df","impliedFormat":99},{"version":"ddfd9196f1f83997873bbe958ce99123f11b062f8309fc09d9c9667b2c284391","impliedFormat":99},{"version":"2999ba314a310f6a333199848166d008d088c6e36d090cbdcc69db67d8ae3154","impliedFormat":99},{"version":"62c1e573cd595d3204dfc02b96eba623020b181d2aa3ce6a33e030bc83bebb41","impliedFormat":99},{"version":"ca1616999d6ded0160fea978088a57df492b6c3f8c457a5879837a7e68d69033","impliedFormat":99},{"version":"835e3d95251bbc48918bb874768c13b8986b87ea60471ad8eceb6e38ddd8845e","impliedFormat":99},{"version":"de54e18f04dbcc892a4b4241b9e4c233cfce9be02ac5f43a631bbc25f479cd84","impliedFormat":99},{"version":"453fb9934e71eb8b52347e581b36c01d7751121a75a5cd1a96e3237e3fd9fc7e","impliedFormat":99},{"version":"bc1a1d0eba489e3eb5c2a4aa8cd986c700692b07a76a60b73a3c31e52c7ef983","impliedFormat":99},{"version":"4098e612efd242b5e203c5c0b9afbf7473209905ab2830598be5c7b3942643d0","impliedFormat":99},{"version":"28410cfb9a798bd7d0327fbf0afd4c4038799b1d6a3f86116dc972e31156b6d2","impliedFormat":99},{"version":"514ae9be6724e2164eb38f2a903ef56cf1d0e6ddb62d0d40f155f32d1317c116","impliedFormat":99},{"version":"970e5e94a9071fd5b5c41e2710c0ef7d73e7f7732911681592669e3f7bd06308","impliedFormat":99},{"version":"491fb8b0e0aef777cec1339cb8f5a1a599ed4973ee22a2f02812dd0f48bd78c1","impliedFormat":99},{"version":"6acf0b3018881977d2cfe4382ac3e3db7e103904c4b634be908f1ade06eb302d","impliedFormat":99},{"version":"2dbb2e03b4b7f6524ad5683e7b5aa2e6aef9c83cab1678afd8467fde6d5a3a92","impliedFormat":99},{"version":"135b12824cd5e495ea0a8f7e29aba52e1adb4581bb1e279fb179304ba60c0a44","impliedFormat":99},{"version":"e4c784392051f4bbb80304d3a909da18c98bc58b093456a09b3e3a1b7b10937f","impliedFormat":99},{"version":"2e87c3480512f057f2e7f44f6498b7e3677196e84e0884618fc9e8b6d6228bed","impliedFormat":99},{"version":"66984309d771b6b085e3369227077da237b40e798570f0a2ddbfea383db39812","impliedFormat":99},{"version":"e41be8943835ad083a4f8a558bd2a89b7fe39619ed99f1880187c75e231d033e","impliedFormat":99},{"version":"260558fff7344e4985cfc78472ae58cbc2487e406d23c1ddaf4d484618ce4cfd","impliedFormat":99},{"version":"413d50bc66826f899c842524e5f50f42d45c8cb3b26fd478a62f26ac8da3d90e","impliedFormat":99},{"version":"d9083e10a491b6f8291c7265555ba0e9d599d1f76282812c399ab7639019f365","impliedFormat":99},{"version":"09de774ebab62974edad71cb3c7c6fa786a3fda2644e6473392bd4b600a9c79c","impliedFormat":99},{"version":"e8bcc823792be321f581fcdd8d0f2639d417894e67604d884c38b699284a1a2a","impliedFormat":99},{"version":"7c99839c518dcf5ab8a741a97c190f0703c0a71e30c6d44f0b7921b0deec9f67","impliedFormat":99},{"version":"44c14e4da99cd71f9fe4e415756585cec74b9e7dc47478a837d5bedfb7db1e04","impliedFormat":99},{"version":"1f46ee2b76d9ae1159deb43d14279d04bcebcb9b75de4012b14b1f7486e36f82","impliedFormat":99},{"version":"2838028b54b421306639f4419606306b940a5c5fcc5bc485954cbb0ab84d90f4","impliedFormat":99},{"version":"7116e0399952e03afe9749a77ceaca29b0e1950989375066a9ddc9cb0b7dd252","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"5b740ecbdac8a8d229eb4e937b662dcf34624a8a88022f96ac1ea98d5ac47903","signature":"2eb2e11e23bc3924a490591d4c603fc16cd2ac520d2c2171b2466b5bd5fc5eba"},"5b1ff77f7f472ac829499aca0e7f48a734e5e4b72f9b558b4a23e3857c106f70","6a2c3d40708ff03869e80dce7d95dfba67b0878556cc9bcb98887339ea83d5e4",{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"d521a8cdb47f4c74994edb24feb45d88719f4375a2cfbc41a1b376feebb4761e","signature":"9e9bc7fda2294ee1af17b0ee0dd9c5a82f71659535651fa02fc54d99dcc8d324"},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"bdd1f1a95f9f7621d8004eaec2f50b4ed263c60693307f50faef6eab6f25cd79","signature":"d3711ec2e95d9dd6f6c3a56fef58b5802819e620fca2b0c7ef35db1bc1b9acd8"},{"version":"f9aa78a568457fb87ae424b74fb69a8e9d69daab6b168b11961fc33561099302","signature":"7dc02e80009222e8c0ee4c9aece22696c53a2d9b24b5e5e3a25150c8892d21ca"},"c688d0ad9ecd72528d4a4c310abd7b11f7f5fbbf99c7b8fb107df3fb8880ddc8",{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"f67de8039badd18bce93f6baa5a008856e0d6dbe2280c37136455d4bed6346b3","signature":"844b87eab63d55e82693c996c6271c7c3679a5dc878a8ed89fe4374caac0f627"},{"version":"e0a8dc363306fb9c389d60635c771db16054954d3481521fa478fbf7ab53408b","signature":"5decd20bcf383ad1cf8c14259e5d8261af83a93d2b5729d33748d33ca73fec51"},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"ceb88e0114c2e972422d9c1a2807da278f2475bcba6e2c4b0dea1fce38a5d28a","signature":"69c4227dccee304e15ea1ffc12d58bc1e7acf904c1dca7c02031c5a024ef73f4"},{"version":"d86edd3eb1ff938b5856bc736c223dcc606e2219b6d4814dbab79bf5e54cdbe4","signature":"05edf101294e859dba5539df936b973dd7c4d87b870bcad1045d49dfe67f2ecd"},{"version":"7ce9955f1a53d4c77a01d4baf64d2d9a6d3954d58ad8df8d065559a78b018209","signature":"21de19ca6cb4c6e537d59de8aa4694025b49a2ae069c0c7f184e6a2ff9101468"},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"6a8860221043016b3dc2aa98c96bf6214cf6b5f72af0302b864d9b630bd41089","signature":"cba7c4c924ac1767043ff386964d72e845c25eba0cde2f71740f1b5bf24dcdbd"},"92859d2f5e50b67c95e0572fd9d1cf4936aabf2cba0efe592ffadf812db79319",{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"51abb53a17c48d5a919fc01a0a2adc171b1ea31f2ef24558b076a214fe7202c3","signature":"ad38cacef89b6bbe8d5c739ef454e4862cb7e2c6591d867853cc071156bf3eb3"},{"version":"654d707aecfaf3c1431bbe3496a962479ccbc43e7f7a764e80d13836f171c6cc","signature":"6dd6b08557c972162b6cd57cef4664afc44cce11c520d3267447c94654de3906"},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},"ba6efe7a6b73ea3211dac001f61baf319d46f2999d08b9737a219da3da85567d",{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"35c597f5dcf3a16b6ebe16fd9c9cdbfdbfddd98b7af888f40a9a459fdc35dc31","signature":"313c717ac8363b2f8fad041c6d9e3602023d2cecccd5a5d78216a19310c23e9b"},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"270a1b90e54d767c5b905ee139ac4b97acae7422d6a976bce63beb3bdf480406","signature":"73d30b22f0069c3fce4293cc8ebaa55f72efa470dab1cd257a4c698a042214a2"},{"version":"2e1f0edae2a786aed07fc4ea7a3a288e69b00fef16ba44c68bb120d859472999","signature":"30fa44558bfd7ebaf45bd26e72be535a174aecb8285dbc25555380931791d601"},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},"13e93979a86b0c93eda6326dc6232c85bebbfbc1b9029cac85a549c65aa8bd89",{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},"42d00c1edd006dc836e08da63459b2772e30e4e9db0fdddc7a30ef94ae0414d3",{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},"449a2fba673619c80e6ff2328ddda1f8f2d89c4ecadff375fc3975444397174d","cac107a406d02b98013c6cd3dba45a3e0232fcae479afa632988fdab131e37ec",{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},"dc7a1b33e8dbb2c6add24f2d843cecab4dc514644c502552728a0b4e26b6d20e","bec414f9c7449140e7638fdb7fd9fcaea3b6142e1535bc17a9471b821d071692","e7bea05f086a89538d163b77b654583756d686285e3044168be6e9967f37936c",{"version":"ec23f00161009682ce88521800f20bdc0eea1b666299fc8bcd65610ae424ac01","signature":"d713b7d242c18d1ebcf857fb093e109746fc4bb0fb855de123833aa0d4b753d9"},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"8b6824a01148a5f0b9bac41612d43495cb082b3a8cc2b1f14ea33298d6ac00b8","impliedFormat":99},{"version":"97e0a23ac45763f990b704b66cabbb48df07eddc5bf46054a34d72e350f1088e","impliedFormat":99},{"version":"fe9dd679e568dc2a0e5e6959f77b53f8bc1f126d46b0d17631347ba57470b808","impliedFormat":99},{"version":"86245b010961138b1c4ce2e0610b8b9577157dac3f7eeaf3d20017ee01e7760b","impliedFormat":99},{"version":"126eac20336c7374782d571be802e7b7adb9fc5b24c0dd0dfc37bfc9774d9182","impliedFormat":99},{"version":"760c9ccae9612ff1cd7d39c6eb7cdf913ca528a7f89afeee33f6759d62715e43","impliedFormat":99},{"version":"54e76a6612d9b83fde2b1cc0569f20c5b8d38f7a860b88a1d9d805399bfeead3","impliedFormat":99},{"version":"5a4ddf80b1bdab540fe5d3f837921e9e8dc559a1a319e75451c30f0d5f62ac0f","impliedFormat":99},{"version":"0c6ef3deba595b7dc7b4ee09342435c7a2392fe7752e335acdedfe2476529638","impliedFormat":99},{"version":"00fab36b3130e6d7a2316d0583a2e2a4d328a6f4e01817d90d8b07baad69b4e1","impliedFormat":99},{"version":"9001790195bf5cf382c676ded6da44833812e677bb9f31fcb22fa47d389039f4","impliedFormat":99},{"version":"e9549a400fa6ed33871effcd70b9bc5ab77f24ecc6349c97d8da7ae078e6a25a","impliedFormat":99},{"version":"0007221ceab1fe355d6dbbdf4bb71cad7584ffe9794ab152a1c68a921f2408ca","impliedFormat":99},{"version":"dd7928e76087e0bb029074c20675aeb38eff85513d5f941f440c26d82dd5436c","impliedFormat":99},{"version":"b35f88c4ae41d4b085da718dde3ddff0b176337470275fee82ad0aa84858db07","impliedFormat":99},{"version":"626e531e56621998a9d6488eb25c93f4091fd7a5484724458925b1ef0982a778","impliedFormat":99},{"version":"c9f54e8d99ecfb65a99b9ee67a7fce1295edc57ee9332f6c8bf7fdef1dc0c57b","signature":"0bee72b5ccff3d68eb267b5c8409915740816b381312b1a51915cf8aed7264cc"},"997272a4436299bab97077a4919199ca5472da6754cb3df75c4500cceccebb9c","7f1ca600a24602def60bf42700f0d85a1b84cb5aaaba9305cb73774d61ce294a","b20259dfaf3b88859e58310fa2709dcb6a74e46746af2d5cee0e5c116b20d165",{"version":"01628a432ab2fd18ae12dac3bb7098c21c5e728e33f89b5c8d6fa388ebfa4b49","signature":"3963241d9d7062b87636adce639cbc9ff41747df1d70f1df9d19de45df592bdc"},{"version":"c3a1e0930a7b132826602bf1597a12658b480637a9f8d873c6117829030d392c","signature":"3bdb42fa5fa90c8d2ffa9e9e9b93d78e830082ae40236f8de308142f51346c12"},"d81b53d3bfa30d1e70798e536ccc6d23cd6d80769a1e83bb148569ac13dca92d","b4fec866aa0ea4289e716354a29227ed9d840c4d59293dd23e587cc4dfb50d9f","ddb76d82cbdb29d8dbedbc72835ebcade5f6797d9d53e7b8fd5c39b1cc681ae4",{"version":"0d8c6fdd0771f73866aff7343cd2f956cc96a94f6926583851d312fd9a5fde87","signature":"335521b83fc375a26ad87fbeabd64267093aa63d75a7c73ecd138856aa91baa4"},{"version":"7c7c8c7ac9c9bc8ec47884c5072a9f75dd62a50a4ceafd26e7ba6d1d64f4be17","signature":"035a7b50fd06db685e8942577262e78b229338dc46712109e58d0c5442c3254e"},{"version":"2d30d4dd0291d7c301276ddcb21e17bb35e6219971cb38d337d8c6f1d43003b4","signature":"82bd056c327227a7a4cef136ab9d08f086ee1d1a4c843127d1d7535ee6ddaee3"},{"version":"b79b9ac24cf51475b92378868b8c4c5637e18712232d9c5215d39a9e3a7101a9","signature":"687a79c4110f548c1526750e9d41835bf6f2a8d571ede5d2ff751a642e26616d"},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ccdaa19852d25ecd84eec365c3bfa16e7859cadecf6e9ca6d0dbbbee439743f","affectsGlobalScope":true,"impliedFormat":1},{"version":"438b41419b1df9f1fbe33b5e1b18f5853432be205991d1b19f5b7f351675541e","affectsGlobalScope":true,"impliedFormat":1},{"version":"096116f8fedc1765d5bd6ef360c257b4a9048e5415054b3bf3c41b07f8951b0b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5e01375c9e124a83b52ee4b3244ed1a4d214a6cfb54ac73e164a823a4a7860a","affectsGlobalScope":true,"impliedFormat":1},{"version":"f90ae2bbce1505e67f2f6502392e318f5714bae82d2d969185c4a6cecc8af2fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b58e207b93a8f1c88bbf2a95ddc686ac83962b13830fe8ad3f404ffc7051fb4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1fefabcb2b06736a66d2904074d56268753654805e829989a46a0161cd8412c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"c18a99f01eb788d849ad032b31cafd49de0b19e083fe775370834c5675d7df8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"5247874c2a23b9a62d178ae84f2db6a1d54e6c9a2e7e057e178cc5eea13757fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"487b694c3de27ddf4ad107d4007ad304d29effccf9800c8ae23c2093638d906a","impliedFormat":1},{"version":"3a80bc85f38526ca3b08007ee80712e7bb0601df178b23fbf0bf87036fce40ce","impliedFormat":1},{"version":"ccf4552357ce3c159ef75f0f0114e80401702228f1898bdc9402214c9499e8c0","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"2931540c47ee0ff8a62860e61782eb17b155615db61e36986e54645ec67f67c2","impliedFormat":1},{"version":"ccab02f3920fc75c01174c47fcf67882a11daf16baf9e81701d0a94636e94556","impliedFormat":1},{"version":"f6faf5f74e4c4cc309a6c6a6c4da02dbb840be5d3e92905a23dcd7b2b0bd1986","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"33e981bf6376e939f99bd7f89abec757c64897d33c005036b9a10d9587d80187","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"b41767d372275c154c7ea6c9d5449d9a741b8ce080f640155cc88ba1763e35b3","impliedFormat":1},{"version":"3bacf516d686d08682751a3bd2519ea3b8041a164bfb4f1d35728993e70a2426","impliedFormat":1},{"version":"7fb266686238369442bd1719bc0d7edd0199da4fb8540354e1ff7f16669b4323","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"5b03a034c72146b61573aab280f295b015b9168470f2df05f6080a2122f9b4df","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"54c3e2371e3d016469ad959697fd257e5621e16296fa67082c2575d0bf8eced0","impliedFormat":1},{"version":"beb8233b2c220cfa0feea31fbe9218d89fa02faa81ef744be8dce5acb89bb1fd","impliedFormat":1},{"version":"c183b931b68ad184bc8e8372bf663f3d33304772fb482f29fb91b3c391031f3e","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"48cc3ec153b50985fb95153258a710782b25975b10dd4ac8a4f3920632d10790","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"e1528ca65ac90f6fa0e4a247eb656b4263c470bb22d9033e466463e13395e599","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"866078923a56d026e39243b4392e282c1c63159723996fa89243140e1388a98d","impliedFormat":1},{"version":"c3f5289820990ab66b70c7fb5b63cb674001009ff84b13de40619619a9c8175f","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3275d55fac10b799c9546804126239baf020d220136163f763b55a74e50e750","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa68a0a3b7cb32c00e39ee3cd31f8f15b80cac97dce51b6ee7fc14a1e8deb30b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c36e755bced82df7fb6ce8169265d0a7bb046ab4e2cb6d0da0cb72b22033e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a93de4ff8a63bafe62ba86b89af1df0ccb5e40bb85b0c67d6bbcfdcf96bf3d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"90e85f9bc549dfe2b5749b45fe734144e96cd5d04b38eae244028794e142a77e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0a5deeb610b2a50a6350bd23df6490036a1773a8a71d70f2f9549ab009e67ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"435b3711465425770ed2ee2f1cf00ce071835265e0851a7dc4600ab4b007550e","impliedFormat":1},{"version":"7e49f52a159435fc8df4de9dc377ef5860732ca2dc9efec1640531d3cf5da7a3","impliedFormat":1},{"version":"dd4bde4bdc2e5394aed6855e98cf135dfdf5dd6468cad842e03116d31bbcc9bc","impliedFormat":1},{"version":"4d4e879009a84a47c05350b8dca823036ba3a29a3038efed1be76c9f81e45edf","affectsGlobalScope":true,"impliedFormat":1},{"version":"237ba5ac2a95702a114a309e39c53a5bddff5f6333b325db9764df9b34f3502b","impliedFormat":1},{"version":"9ba13b47cb450a438e3076c4a3f6afb9dc85e17eae50f26d4b2d72c0688c9251","impliedFormat":1},{"version":"b64cd4401633ea4ecadfd700ddc8323a13b63b106ac7127c1d2726f32424622c","impliedFormat":1},{"version":"37c6e5fe5715814412b43cc9b50b24c67a63c4e04e753e0d1305970d65417a60","impliedFormat":1},{"version":"1d024184fb57c58c5c91823f9d10b4915a4867b7934e89115fd0d861a9df27c8","impliedFormat":1},{"version":"ee0e4946247f842c6dd483cbb60a5e6b484fee07996e3a7bc7343dfb68a04c5d","impliedFormat":1},{"version":"ef051f42b7e0ef5ca04552f54c4552eac84099d64b6c5ad0ef4033574b6035b8","impliedFormat":1},{"version":"853a43154f1d01b0173d9cbd74063507ece57170bad7a3b68f3fa1229ad0a92f","impliedFormat":1},{"version":"56231e3c39a031bfb0afb797690b20ed4537670c93c0318b72d5180833d98b72","impliedFormat":1},{"version":"5cc7c39031bfd8b00ad58f32143d59eb6ffc24f5d41a20931269011dccd36c5e","impliedFormat":1},{"version":"b0b69c61b0f0ec8ca15db4c8c41f6e77f4cacb784d42bca948f42dea33e8757e","affectsGlobalScope":true,"impliedFormat":1},{"version":"f96a48183254c00d24575401f1a761b4ce4927d927407e7862a83e06ce5d6964","impliedFormat":1},{"version":"cc25940cfb27aa538e60d465f98bb5068d4d7d33131861ace43f04fe6947d68f","impliedFormat":1},{"version":"f83fb2b1338afbb3f9d733c7d6e8b135826c41b0518867df0c0ace18ae1aa270","impliedFormat":1},{"version":"01ff95aa1443e3f7248974e5a771f513cb2ac158c8898f470a1792f817bee497","impliedFormat":1},{"version":"757227c8b345c57d76f7f0e3bbad7a91ffca23f1b2547cbed9e10025816c9cb7","impliedFormat":1},{"version":"42a05d8f239f74587d4926aba8cc54792eed8e8a442c7adc9b38b516642aadfe","impliedFormat":1},{"version":"5d21b58d60383cc6ab9ad3d3e265d7d25af24a2c9b506247e0e50b0a884920be","impliedFormat":1},{"version":"101f482fd48cb4c7c0468dcc6d62c843d842977aea6235644b1edd05e81fbf22","impliedFormat":1},{"version":"ae6757460f37078884b1571a3de3ebaf724d827d7e1d53626c02b3c2a408ac63","affectsGlobalScope":true,"impliedFormat":1},{"version":"9451a46a89ed209e2e08329e6cac59f89356eae79a7230f916d8cc38725407c7","impliedFormat":1},{"version":"3ef397f12387eff17f550bc484ea7c27d21d43816bbe609d495107f44b97e933","impliedFormat":1},{"version":"1023282e2ba810bc07905d3668349fbd37a26411f0c8f94a70ef3c05fe523fcf","impliedFormat":1},{"version":"b214ebcf76c51b115453f69729ee8aa7b7f8eccdae2a922b568a45c2d7ff52f7","impliedFormat":1},{"version":"429c9cdfa7d126255779efd7e6d9057ced2d69c81859bbab32073bad52e9ba76","impliedFormat":1},{"version":"e236b5eba291f51bdf32c231673e6cab81b5410850e61f51a7a524dddadc0f95","impliedFormat":1},{"version":"f7ba0e839daa0702e3ff1a1a871c0d8ea2d586ce684dd8a72c786c36a680b1d9","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f2c62938251b45715fd2a9887060ec4fbc8724727029d1cbce373747252bdd7","impliedFormat":1},{"version":"e3ace08b6bbd84655d41e244677b474fd995923ffef7149ddb68af8848b60b05","impliedFormat":1},{"version":"132580b0e86c48fab152bab850fc57a4b74fe915c8958d2ccb052b809a44b61c","impliedFormat":1},{"version":"af4ab0aa8908fc9a655bb833d3bc28e117c4f0e1038c5a891546158beb25accb","impliedFormat":1},{"version":"69c9a5a9392e8564bd81116e1ed93b13205201fb44cb35a7fde8c9f9e21c4b23","impliedFormat":1},{"version":"5f8fc37f8434691ffac1bfd8fc2634647da2c0e84253ab5d2dd19a7718915b35","impliedFormat":1},{"version":"5981c2340fd8b076cae8efbae818d42c11ffc615994cb060b1cd390795f1be2b","impliedFormat":1},{"version":"f64deb26664af64dc274637343bde8d82f930c77af05a412c7d310b77207a448","impliedFormat":1},{"version":"ed4f674fc8c0c993cc7e145069ac44129e03519b910c62be206a0cc777bdc60b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0250da3eb85c99624f974e77ef355cdf86f43980251bc371475c2b397ba55bcd","impliedFormat":1},{"version":"f1c93e046fb3d9b7f8249629f4b63dc068dd839b824dd0aa39a5e68476dc9420","impliedFormat":1},{"version":"3d3a5f27ffbc06c885dd4d5f9ee20de61faf877fe2c3a7051c4825903d9a7fdc","impliedFormat":1},{"version":"12806f9f085598ef930edaf2467a5fa1789a878fba077cd27e85dc5851e11834","impliedFormat":1},{"version":"17d06eb5709839c7ce719f0c38ada6f308fb433f2cd6d8c87b35856e07400950","impliedFormat":1},{"version":"a43fe41c33d0a192a0ecaf9b92e87bef3709c9972e6d53c42c49251ccb962d69","impliedFormat":1},{"version":"a177959203c017fad3ecc4f3d96c8757a840957a4959a3ae00dab9d35961ca6c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc727ccf9b36e257ff982ea0badeffbfc2c151802f741bddff00c6af3b784cf","impliedFormat":1},{"version":"2a00d005e3af99cd1cfa75220e60c61b04bfb6be7ca7453bfe2ef6cca37cc03c","impliedFormat":1},{"version":"4844a4c9b4b1e812b257676ed8a80b3f3be0e29bf05e742cc2ea9c3c6865e6c6","impliedFormat":1},{"version":"064878a60367e0407c42fb7ba02a2ea4d83257357dc20088e549bd4d89433e9c","impliedFormat":1},{"version":"14d4bd22d1b05824971b98f7e91b2484c90f1a684805c330476641417c3d9735","impliedFormat":1},{"version":"c3877fef8a43cd434f9728f25a97575b0eb73d92f38b5c87c840daccc3e21d97","impliedFormat":1},{"version":"b484ec11ba00e3a2235562a41898d55372ccabe607986c6fa4f4aba72093749f","impliedFormat":1},{"version":"1dbd83860e7634f9c236647f45dbc5d3c4f9eba8827d87209d6e9826fdf4dbd5","impliedFormat":1},{"version":"41ef7992c555671a8fe54db302788adefa191ded810a50329b79d20a6772d14c","impliedFormat":1},{"version":"041a7781b9127ab568d2cdcce62c58fdea7c7407f40b8c50045d7866a2727130","impliedFormat":1},{"version":"b37f83e7deea729aa9ce5593f78905afb45b7532fdff63041d374f60059e7852","impliedFormat":1},{"version":"e1cb68f3ef3a8dd7b2a9dfb3de482ed6c0f1586ba0db4e7d73c1d2147b6ffc51","impliedFormat":1},{"version":"55cdbeebe76a1fa18bbd7e7bf73350a2173926bd3085bb050cf5a5397025ee4e","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"f9e22729fa06ed20f8b1fe60670b7c74933fdfd44d869ddfb1919c15a5cf12fb","impliedFormat":1},{"version":"d34aa8df2d0b18fb56b1d772ff9b3c7aea7256cf0d692f969be6e1d27b74d660","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"6823ccc7b5b77bbf898d878dbcad18aa45e0fa96bdd0abd0de98d514845d9ed9","affectsGlobalScope":true,"impliedFormat":1},{"version":"689be50b735f145624c6f391042155ae2ff6b90a93bac11ca5712bc866f6010c","impliedFormat":1},{"version":"fb893a0dfc3c9fb0f9ca93d0648694dd95f33cbad2c0f2c629f842981dfd4e2e","impliedFormat":1},{"version":"3eb11dbf3489064a47a2e1cf9d261b1f100ef0b3b50ffca6c44dd99d6dd81ac1","impliedFormat":1},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"a4a39b5714adfcadd3bbea6698ca2e942606d833bde62ad5fb6ec55f5e438ff8","impliedFormat":1},{"version":"bbc1d029093135d7d9bfa4b38cbf8761db505026cc458b5e9c8b74f4000e5e75","impliedFormat":1},{"version":"1f68ab0e055994eb337b67aa87d2a15e0200951e9664959b3866ee6f6b11a0fe","impliedFormat":1},{"version":"5d08a179b846f5ee674624b349ebebe2121c455e3a265dc93da4e8d9e89722b4","impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"cb90077223cc1365fa21ef0911a1f9b8f2f878943523d97350dc557973ca3823","impliedFormat":1},{"version":"18f1541b81b80d806120a3489af683edfb811deb91aeca19735d9bb2613e6311","impliedFormat":1},{"version":"90407bbaa24977b8a6a90861148ac98d8652afe69992a90d823f29e9807fe2d7","affectsGlobalScope":true,"impliedFormat":1},{"version":"232f118ae64ab84dcd26ddb60eaed5a6e44302d36249abf05e9e3fc2cbb701a2","impliedFormat":1},{"version":"b2d0630483bf337ef9dac326c3334a245aa4946e9f60f12baf7da5be44beafbb","impliedFormat":1},{"version":"ee65fe452abe1309389c5f50710f24114e08a302d40708101c4aa950a2a7d044","impliedFormat":1},{"version":"26b7d0cd4b41ab557ef9e3bfeec42dcf24252843633e3d29f38d2c0b13aaa528","impliedFormat":1},{"version":"7fadb2778688ebf3fd5b8d04f63d5bf27a43a3e420bc80732d3c6239067d1a4b","impliedFormat":1},{"version":"916be7d770b0ae0406be9486ac12eb9825f21514961dd050594c4b250617d5a8","impliedFormat":1},{"version":"e85d04f57b46201ddc8ba238a84322432a4803a5d65e0bbd8b3b4f05345edd51","impliedFormat":1},{"version":"fd624f7d7b264922476685870f08c5e1c6d6a0f05dee2429a9747b41f6b699d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"7233cac35711f43b7493061d2fe7636deb6d14f8cb58e4b3ff248be46f0b543d","impliedFormat":1},{"version":"3cef134032da5e1bfabba59a03a58d91ed59f302235034279bb25a5a5b65ca62","affectsGlobalScope":true,"impliedFormat":1},{"version":"199f9ead0daf25ae4c5632e3d1f42570af59685294a38123eef457407e13f365","impliedFormat":1},{"version":"ddef25f825320de051dcb0e62ffce621b41c67712b5b4105740c32fd83f4c449","impliedFormat":1},{"version":"1b3dffaa4ca8e38ac434856843505af767a614d187fb3a5ef4fcebb023c355aa","impliedFormat":1},{"version":"7fa8d75d229eeaee235a801758d9c694e94405013fe77d5d1dd8e3201fc414f1","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[83,88,89,[96,102],[105,123],[125,127],[136,139],867,871,[881,883],[892,894],901,[1000,1002],1009,[1020,1022],1025,1026,[1029,1031],1034,1035,1040,1041,1045,1048,1050,1051,1053,1055,1060,1061,[1073,1076],[1096,1108]],"options":{"allowJs":true,"esModuleInterop":true,"jsx":1,"module":99,"skipLibCheck":true,"strict":true,"target":4},"referencedMap":[[1091,1],[1084,2],[1092,3],[1095,4],[1093,5],[1089,6],[1094,2],[1081,7],[1090,8],[1083,9],[171,10],[170,7],[173,11],[172,12],[183,13],[176,14],[184,15],[181,13],[185,16],[179,13],[180,17],[182,18],[178,19],[177,20],[186,21],[174,22],[175,23],[165,7],[166,24],[189,25],[187,26],[188,27],[191,28],[190,29],[168,30],[167,31],[169,32],[1086,7],[1088,33],[1087,33],[1018,34],[846,34],[909,34],[873,34],[1036,34],[850,34],[1037,34],[851,34],[870,34],[1017,34],[1013,34],[1044,34],[1059,34],[1010,34],[1032,34],[1004,34],[842,34],[875,34],[1006,34],[1016,34],[903,34],[879,34],[888,34],[902,34],[863,34],[1007,34],[1008,34],[854,34],[1039,34],[1068,34],[1058,34],[1019,34],[1003,34],[859,34],[839,34],[1077,34],[1054,34],[908,34],[840,34],[1028,34],[865,34],[904,34],[889,34],[907,34],[1011,34],[864,34],[1012,34],[884,34],[845,34],[848,34],[1043,34],[868,34],[855,34],[910,34],[899,34],[1047,34],[1064,34],[1080,34],[869,34],[1078,34],[861,34],[900,34],[1056,34],[905,34],[1015,34],[862,34],[858,34],[1070,34],[1038,34],[1063,34],[878,34],[1023,34],[1057,34],[1052,34],[885,34],[999,34],[866,34],[1072,34],[906,34],[841,34],[911,34],[1069,34],[891,34],[877,34],[1027,34],[1042,34],[1033,34],[1005,34],[852,34],[860,34],[1062,34],[890,34],[1071,34],[887,34],[847,34],[872,34],[1067,34],[1066,34],[1046,34],[1024,34],[886,34],[1065,34],[1079,34],[853,34],[874,34],[1014,34],[843,34],[880,34],[844,34],[876,34],[849,34],[856,34],[857,34],[481,35],[480,7],[482,36],[475,37],[474,7],[476,38],[478,39],[477,7],[479,40],[484,41],[483,7],[485,42],[330,43],[327,7],[331,44],[336,45],[335,7],[337,46],[339,47],[338,7],[340,48],[373,49],[372,7],[374,50],[376,51],[375,7],[377,52],[379,53],[378,7],[380,54],[386,55],[385,7],[387,56],[389,57],[388,7],[390,58],[395,59],[394,7],[396,60],[392,61],[391,7],[393,62],[806,63],[807,7],[808,64],[398,65],[397,7],[399,66],[406,67],[405,7],[407,68],[319,69],[318,7],[320,70],[317,71],[316,7],[401,72],[403,26],[400,7],[402,73],[404,74],[424,75],[423,7],[425,76],[409,77],[408,7],[410,78],[412,79],[411,7],[413,80],[415,81],[414,7],[416,82],[418,83],[417,7],[419,84],[421,85],[420,7],[422,86],[429,87],[428,7],[430,88],[342,89],[341,7],[343,90],[432,91],[431,7],[433,92],[628,26],[629,93],[440,94],[439,7],[441,95],[141,7],[142,7],[143,7],[144,7],[145,7],[146,7],[147,7],[148,7],[149,7],[150,7],[161,96],[151,7],[152,7],[153,7],[154,7],[155,7],[156,7],[157,7],[158,7],[159,7],[160,7],[443,97],[442,98],[444,99],[445,100],[446,101],[809,7],[461,102],[460,7],[462,103],[448,104],[447,7],[449,105],[451,106],[450,7],[452,107],[454,108],[453,7],[455,109],[464,110],[463,7],[465,111],[467,112],[466,7],[468,113],[472,114],[471,7],[473,115],[487,116],[486,7],[488,117],[383,118],[384,119],[493,120],[492,7],[494,121],[499,122],[498,7],[500,123],[502,124],[501,125],[496,126],[495,7],[497,127],[504,128],[503,7],[505,129],[507,130],[506,7],[508,131],[510,132],[509,7],[511,133],[829,134],[832,135],[822,136],[823,137],[515,138],[516,7],[517,139],[513,140],[512,7],[514,141],[810,118],[811,142],[519,143],[518,7],[520,144],[322,145],[321,7],[323,146],[522,147],[521,7],[523,148],[528,149],[527,7],[529,150],[525,151],[524,7],[526,152],[838,153],[837,154],[836,155],[538,156],[537,157],[536,7],[532,158],[531,159],[530,7],[491,160],[490,161],[489,7],[535,162],[534,163],[533,7],[315,164],[427,165],[426,7],[541,166],[540,167],[539,7],[544,168],[543,169],[542,7],[565,170],[564,171],[563,7],[553,172],[552,173],[551,7],[547,174],[546,175],[545,7],[556,176],[555,177],[554,7],[550,178],[549,179],[548,7],[559,180],[558,181],[557,7],[562,182],[561,183],[560,7],[568,184],[567,185],[566,7],[579,186],[578,187],[577,7],[571,188],[570,189],[569,7],[573,190],[572,191],[582,192],[581,193],[580,7],[459,194],[458,195],[457,7],[456,7],[586,196],[585,197],[584,7],[583,198],[814,199],[813,200],[812,26],[590,201],[589,202],[588,7],[311,203],[594,204],[593,205],[592,7],[597,206],[596,207],[595,7],[326,208],[325,209],[324,7],[576,210],[575,211],[574,7],[366,212],[369,213],[367,214],[368,7],[364,215],[363,216],[362,26],[605,217],[604,218],[603,7],[602,219],[598,220],[601,221],[599,26],[600,222],[608,223],[607,224],[606,7],[611,225],[610,226],[609,7],[615,227],[614,228],[613,7],[612,229],[618,230],[617,231],[616,7],[470,232],[469,118],[624,233],[623,234],[622,7],[621,235],[620,7],[619,26],[632,236],[631,237],[630,7],[627,238],[626,239],[625,7],[636,240],[635,241],[634,7],[642,242],[641,243],[640,7],[645,244],[644,245],[643,7],[648,246],[646,247],[647,98],[671,248],[669,249],[668,7],[670,26],[651,250],[650,251],[649,7],[654,252],[653,253],[652,7],[657,254],[656,255],[655,7],[660,256],[659,257],[658,7],[663,258],[662,259],[661,7],[667,260],[665,261],[664,7],[666,26],[735,262],[731,263],[736,264],[307,265],[164,7],[737,7],[734,266],[310,267],[732,268],[733,269],[306,7],[308,270],[746,271],[753,7],[751,7],[163,7],[754,272],[747,7],[729,273],[728,274],[738,275],[743,7],[305,7],[752,7],[742,7],[744,276],[745,277],[750,278],[740,279],[741,280],[730,281],[748,7],[749,7],[309,7],[314,282],[313,283],[312,7],[673,284],[672,285],[676,286],[675,287],[674,7],[712,288],[711,289],[710,7],[700,290],[699,291],[698,7],[679,292],[678,293],[677,7],[682,294],[681,295],[680,7],[685,296],[684,297],[683,7],[709,298],[708,299],[707,7],[688,300],[687,301],[686,7],[697,302],[696,303],[692,7],[691,304],[689,305],[690,7],[703,306],[702,307],[701,7],[706,308],[705,309],[704,7],[718,310],[717,311],[716,7],[715,312],[714,313],[713,7],[817,314],[816,315],[815,26],[721,316],[720,317],[719,7],[724,318],[723,319],[722,7],[727,320],[726,321],[725,7],[695,322],[694,323],[693,7],[639,324],[638,325],[637,7],[633,326],[382,327],[334,328],[333,329],[332,7],[834,330],[833,26],[835,331],[371,332],[370,333],[587,334],[591,26],[819,335],[818,7],[759,336],[762,337],[763,34],[766,338],[769,339],[805,340],[772,341],[773,342],[804,343],[776,344],[779,345],[365,333],[782,346],[785,347],[329,348],[794,349],[797,350],[788,351],[800,352],[803,353],[791,354],[824,7],[821,355],[820,118],[238,7],[243,356],[240,357],[239,358],[242,359],[241,358],[194,360],[195,361],[196,362],[193,363],[192,26],[199,364],[200,365],[249,366],[250,7],[251,367],[216,368],[217,369],[267,7],[268,370],[218,364],[219,371],[289,372],[286,7],[287,373],[288,374],[290,375],[252,376],[253,377],[201,378],[739,379],[254,380],[255,381],[211,382],[203,7],[214,383],[215,384],[202,7],[212,379],[213,385],[224,364],[225,386],[276,387],[279,388],[282,7],[283,7],[280,7],[281,389],[274,7],[277,7],[278,7],[275,390],[220,364],[221,391],[222,364],[223,392],[236,7],[237,393],[245,394],[246,395],[293,396],[292,397],[294,7],[296,398],[291,399],[297,400],[295,379],[304,401],[273,402],[272,155],[271,382],[227,403],[226,364],[229,404],[228,364],[285,405],[284,7],[231,406],[230,364],[233,407],[232,364],[248,408],[247,364],[300,409],[302,410],[299,411],[301,7],[298,399],[198,412],[197,382],[257,413],[256,414],[205,415],[209,364],[208,416],[210,417],[206,418],[204,418],[207,419],[270,420],[269,421],[235,422],[234,364],[266,423],[265,7],[262,424],[261,425],[259,7],[260,426],[258,7],[264,427],[263,7],[303,7],[162,26],[757,7],[758,428],[755,7],[756,429],[825,7],[826,430],[760,7],[761,431],[764,7],[765,432],[767,433],[768,434],[827,7],[828,435],[830,7],[831,436],[771,437],[770,7],[775,438],[774,7],[778,439],[777,7],[781,440],[780,441],[784,442],[783,26],[328,26],[793,443],[792,7],[796,444],[795,26],[787,445],[786,26],[799,446],[798,7],[802,447],[801,26],[790,448],[789,7],[361,449],[357,450],[344,7],[360,451],[353,452],[351,453],[350,453],[349,452],[346,453],[347,452],[355,454],[348,453],[345,452],[352,453],[358,455],[359,456],[354,457],[356,453],[95,458],[94,7],[1231,459],[1232,460],[1237,461],[1230,462],[1239,463],[1244,464],[1243,465],[1242,466],[1245,467],[1240,7],[1236,468],[1251,469],[1250,468],[913,470],[1252,26],[1253,7],[1246,7],[1254,471],[1241,7],[923,470],[1247,7],[1238,7],[1255,472],[1170,473],[1171,473],[1172,474],[1111,475],[1173,476],[1174,477],[1175,478],[1109,7],[1176,479],[1177,480],[1178,481],[1179,482],[1180,483],[1181,484],[1182,484],[1183,485],[1184,486],[1185,487],[1186,488],[1112,7],[1110,7],[1187,489],[1188,490],[1189,491],[1229,492],[1190,493],[1191,494],[1192,493],[1193,495],[1194,496],[1195,497],[1196,498],[1197,498],[1198,498],[1199,499],[1200,500],[1201,501],[1202,502],[1203,503],[1204,504],[1205,504],[1206,505],[1207,7],[1208,7],[1209,506],[1210,507],[1211,506],[1212,508],[1213,509],[1214,510],[1215,511],[1216,512],[1217,513],[1218,514],[1219,515],[1220,516],[1221,517],[1222,518],[1223,519],[1224,520],[1225,521],[1226,522],[1113,493],[1114,7],[1115,523],[1116,524],[1117,7],[1118,525],[1119,7],[1161,526],[1162,527],[1163,528],[1164,528],[1165,529],[1166,7],[1167,476],[1168,530],[1169,527],[1227,531],[1228,532],[1256,7],[1257,7],[86,7],[1234,7],[1235,7],[140,26],[1049,26],[1259,533],[1258,7],[1260,534],[434,7],[435,327],[438,535],[436,26],[381,26],[437,327],[84,7],[87,536],[244,26],[1261,7],[1233,537],[1262,538],[1249,539],[1248,540],[1263,462],[912,7],[1264,7],[1265,541],[1085,2],[85,7],[897,542],[898,543],[104,544],[103,7],[91,7],[992,7],[966,545],[965,546],[964,547],[991,548],[990,549],[994,550],[993,551],[996,552],[995,553],[951,554],[925,555],[926,556],[927,556],[928,556],[929,556],[930,556],[931,556],[932,556],[933,556],[934,556],[935,556],[949,557],[936,556],[937,556],[938,556],[939,556],[940,556],[941,556],[942,556],[943,556],[945,556],[946,556],[944,556],[947,556],[948,556],[950,556],[924,558],[989,559],[969,560],[970,560],[971,560],[972,560],[973,560],[974,560],[975,561],[977,560],[976,560],[988,562],[978,560],[980,560],[979,560],[982,560],[981,560],[983,560],[984,560],[985,560],[986,560],[987,560],[968,560],[967,563],[959,564],[957,565],[958,565],[962,566],[960,565],[961,565],[963,565],[956,7],[896,567],[895,7],[955,568],[954,569],[124,570],[135,571],[129,572],[130,573],[132,572],[134,574],[131,575],[128,26],[133,7],[93,576],[90,7],[998,577],[997,578],[953,579],[952,580],[92,7],[1082,7],[920,581],[919,7],[81,7],[82,7],[13,7],[14,7],[16,7],[15,7],[2,7],[17,7],[18,7],[19,7],[20,7],[21,7],[22,7],[23,7],[24,7],[3,7],[25,7],[26,7],[4,7],[27,7],[31,7],[28,7],[29,7],[30,7],[32,7],[33,7],[34,7],[5,7],[35,7],[36,7],[37,7],[38,7],[6,7],[42,7],[39,7],[40,7],[41,7],[43,7],[7,7],[44,7],[49,7],[50,7],[45,7],[46,7],[47,7],[48,7],[8,7],[54,7],[51,7],[52,7],[53,7],[55,7],[9,7],[56,7],[57,7],[58,7],[60,7],[59,7],[61,7],[62,7],[10,7],[63,7],[64,7],[65,7],[11,7],[66,7],[67,7],[68,7],[69,7],[70,7],[1,7],[71,7],[72,7],[12,7],[76,7],[74,7],[79,7],[78,7],[73,7],[77,7],[75,7],[80,7],[1137,582],[1149,583],[1135,584],[1150,585],[1159,586],[1126,587],[1127,588],[1125,589],[1158,472],[1153,590],[1157,591],[1129,592],[1146,593],[1128,594],[1156,595],[1123,596],[1124,590],[1130,597],[1131,7],[1136,598],[1134,597],[1121,599],[1160,600],[1151,601],[1140,602],[1139,597],[1141,603],[1144,604],[1138,605],[1142,606],[1154,472],[1132,607],[1133,608],[1145,609],[1122,585],[1148,610],[1147,597],[1143,611],[1152,7],[1120,7],[1155,612],[922,613],[918,7],[921,614],[915,615],[914,470],[917,616],[916,617],[881,618],[871,619],[88,26],[893,620],[1101,621],[894,622],[83,7],[1074,623],[1050,624],[1104,625],[89,626],[1102,627],[1030,628],[892,629],[1105,630],[1020,631],[1026,632],[1029,633],[1009,634],[1002,635],[1025,636],[1021,637],[1022,638],[1001,639],[882,640],[1100,641],[1031,642],[1040,643],[1041,644],[1045,645],[99,646],[1106,647],[1051,648],[901,649],[1048,650],[1035,651],[100,26],[101,652],[102,26],[1053,653],[1075,654],[883,655],[1060,656],[1061,657],[1055,658],[1073,659],[105,660],[1096,661],[1034,662],[106,626],[1076,663],[1097,664],[1000,665],[1098,666],[1099,667],[1103,668],[122,669],[107,7],[96,7],[123,670],[125,671],[136,672],[1107,673],[121,7],[126,7],[97,674],[98,675],[117,674],[114,674],[112,674],[116,674],[113,674],[115,674],[110,674],[119,676],[109,674],[108,677],[111,674],[118,677],[137,7],[1108,7],[867,678],[127,679],[120,680],[138,7],[139,7]],"semanticDiagnosticsPerFile":[[883,[{"start":30083,"length":27,"messageText":"This comparison appears to be unintentional because the types '\"error\" | \"idle\" | \"not-available\"' and '\"checking\"' have no overlap.","category":1,"code":2367}]],[893,[{"start":13481,"length":5,"code":2339,"category":1,"messageText":"Property 'light' does not exist on type '{ subtle: string; medium: string; strong: string; width: string; }'."}]],[901,[{"start":9105,"length":5,"code":2339,"category":1,"messageText":"Property 'light' does not exist on type '{ subtle: string; medium: string; strong: string; width: string; }'."}]],[1000,[{"start":1899,"length":7,"messageText":"Cannot assign to 'current' because it is a read-only property.","category":1,"code":2540}]],[1041,[{"start":5692,"length":14,"messageText":"'loading' is specified more than once, so this usage will be overwritten.","category":1,"code":2783,"relatedInformation":[{"start":5771,"length":14,"messageText":"This spread always overwrites this property.","category":1,"code":2785}]},{"start":5716,"length":16,"messageText":"'canGoBack' is specified more than once, so this usage will be overwritten.","category":1,"code":2783,"relatedInformation":[{"start":5771,"length":14,"messageText":"This spread always overwrites this property.","category":1,"code":2785}]},{"start":5742,"length":19,"messageText":"'canGoForward' is specified more than once, so this usage will be overwritten.","category":1,"code":2783,"relatedInformation":[{"start":5771,"length":14,"messageText":"This spread always overwrites this property.","category":1,"code":2785}]},{"start":7145,"length":14,"messageText":"Expected 2 arguments, but got 3.","category":1,"code":2554},{"start":27810,"length":5,"code":2339,"category":1,"messageText":"Property 'hover' does not exist on type '{ page: string; surface: string; elevated: string; secondary: string; inverse: string; }'."},{"start":37374,"length":11,"code":2322,"category":1,"messageText":"Type 'string' is not assignable to type 'boolean | undefined'.","relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":157343,"length":11,"messageText":"The expected type comes from property 'allowpopups' which is declared here on type 'DetailedHTMLProps, HTMLWebViewElement>'","category":3,"code":6500}]}]],[1073,[{"start":48684,"length":5,"code":2339,"category":1,"messageText":"Property 'color' does not exist on type 'Output'."},{"start":48795,"length":5,"code":2339,"category":1,"messageText":"Property 'color' does not exist on type 'Output'."},{"start":49162,"length":8,"code":2339,"category":1,"messageText":"Property 'category' does not exist on type 'Output'."},{"start":49207,"length":5,"code":2339,"category":1,"messageText":"Property 'color' does not exist on type 'Output'."},{"start":49229,"length":5,"code":2339,"category":1,"messageText":"Property 'color' does not exist on type 'Output'."}]],[1097,[{"start":10628,"length":3,"code":2322,"category":1,"messageText":{"messageText":"Type 'RefObject' is not assignable to type 'LegacyRef | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type 'RefObject' is not assignable to type 'RefObject'.","category":1,"code":2322,"next":[{"messageText":"Type 'HTMLDivElement | null' is not assignable to type 'HTMLDivElement'.","category":1,"code":2322,"next":[{"messageText":"Type 'null' is not assignable to type 'HTMLDivElement'.","category":1,"code":2322}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":10381,"length":3,"messageText":"The expected type comes from property 'ref' which is declared here on type 'DetailedHTMLProps, HTMLDivElement>'","category":3,"code":6500}]},{"start":52999,"length":8,"code":2322,"category":1,"messageText":"Type 'string' is not assignable to type 'Language'.","relatedInformation":[{"file":"./src/app/pages/views/codeeditor.tsx","start":680,"length":8,"messageText":"The expected type comes from property 'language' which is declared here on type 'IntrinsicAttributes & Props'","category":3,"code":6500}]}]]],"affectedFilesPendingEmit":[881,871,88,893,1101,894,83,1074,1050,1104,89,1102,1030,892,1105,1020,1026,1029,1009,1002,1025,1021,1022,1001,882,1100,1031,1040,1041,1045,99,1106,1051,901,1048,1035,100,101,102,1053,1075,883,1060,1061,1055,1073,105,1096,1034,106,1076,1097,1000,1098,1099,1103,122,107,96,123,125,136,1107,121,126,97,98,117,114,112,116,113,115,110,119,109,108,111,118,137,1108,867,127,120],"version":"5.9.3"}
\ No newline at end of file
diff --git a/run.sh b/run.sh
index 68a48501..494a6a7e 100755
--- a/run.sh
+++ b/run.sh
@@ -127,10 +127,18 @@ if (( frontend_elapsed >= FRONTEND_MAX_WAIT )); then
exit 1
fi
+# --- Sign Electron VMP for DRM (if EVS account exists) ---
+if [ -f "$PROJECT_ROOT/electron/scripts/sign-vmp.sh" ]; then
+ echo -e "${YELLOW}${BOLD}[vmp]${RESET} Checking VMP signature..."
+ bash "$PROJECT_ROOT/electron/scripts/sign-vmp.sh" 2>&1 | while IFS= read -r line; do
+ printf "${YELLOW}${BOLD}%s${RESET}\n" "$line"
+ done
+fi
+
# --- Start Electron in dev mode ---
MAGENTA='\033[0;35m'
echo -e "${MAGENTA}${BOLD}[electron]${RESET} Launching Electron dev shell..."
-(cd "$PROJECT_ROOT/electron" && ELECTRON_DEV=1 npx electron .) > >(
+(cd "$PROJECT_ROOT/electron" && unset ELECTRON_RUN_AS_NODE && ELECTRON_DEV=1 npx electron .) > >(
while IFS= read -r line; do
printf "${MAGENTA}${BOLD}[electron]${RESET} %s\n" "$line"
done
diff --git a/scripts/build-app.sh b/scripts/build-app.sh
index 11fdfde0..3e23870c 100755
--- a/scripts/build-app.sh
+++ b/scripts/build-app.sh
@@ -48,7 +48,7 @@ if $PUBLISH_MODE; then
fi
# Step 1: Build frontend
-echo "[1/3] Building frontend..."
+echo "[1/4] Building frontend..."
cd "$PROJECT_ROOT/frontend"
npm install
npm run build
@@ -61,7 +61,7 @@ echo "Frontend build complete."
echo ""
# Step 2: Build Python environment
-echo "[2/3] Building Python environment..."
+echo "[2/4] Building Python environment..."
bash "$SCRIPT_DIR/build-python-env.sh"
if [[ ! -d "$PROJECT_ROOT/electron/python-env" ]]; then
@@ -71,8 +71,34 @@ fi
echo "Python environment ready."
echo ""
-# Step 3: Package with electron-builder
-echo "[3/3] Packaging with electron-builder..."
+# Step 3: Snapshot source directories for packaging
+echo "[3/4] Snapshotting source directories..."
+STAGING_DIR="$PROJECT_ROOT/electron/build-staging"
+rm -rf "$STAGING_DIR"
+mkdir -p "$STAGING_DIR"
+
+rsync -a \
+ --exclude='__pycache__' --exclude='**/__pycache__' \
+ --exclude='*.pyc' --exclude='.venv' \
+ "$PROJECT_ROOT/backend/" "$STAGING_DIR/backend/"
+
+rsync -a \
+ --exclude='__pycache__' --exclude='**/__pycache__' \
+ --exclude='*.pyc' --exclude='.venv' --exclude='**/.venv' \
+ --exclude='**/node_modules' \
+ "$PROJECT_ROOT/debugger/" "$STAGING_DIR/debugger/"
+
+rsync -a "$PROJECT_ROOT/frontend/dist/" "$STAGING_DIR/frontend/"
+
+echo ""
+printf '\033[1;42;97m%s\033[0m\n' "========================================"
+printf '\033[1;42;97m%s\033[0m\n' " ✅ SOURCE SNAPSHOT COMPLETE "
+printf '\033[1;42;97m%s\033[0m\n' " It is now safe to modify your codebase."
+printf '\033[1;42;97m%s\033[0m\n' "========================================"
+echo ""
+
+# Step 4: Package with electron-builder
+echo "[4/4] Packaging with electron-builder..."
cd "$PROJECT_ROOT/electron"
npm install
@@ -90,6 +116,8 @@ else
fi
fi
+rm -rf "$PROJECT_ROOT/electron/build-staging"
+
echo ""
echo "========================================"
echo " Build Complete!"